+ ```
+---
+```
+
+下面几个变量需要注意一下:
+
+- `header-includes` 变量包含将要嵌入 `` 标签的 HTML 文本。
+- 调用变量后的下一行必须是 `- |`。再往下一行必须以与 `|` 对齐的三个反引号开始,否则 Pandoc 将无法识别。`{= html}` 告诉 Pandoc 其中的内容是原始文本,不应该作为 Markdown 处理。(为此,需要检查 Pandoc 中的 `raw_attribute` 扩展是否已启用。要进行此检查,键入 `pandoc --list-extensions | grep raw` 并确保返回的列表包含名为 `+ raw_html` 的项目,加号表示已启用。)
+- 变量 `include-before` 在网页开头添加一些 HTML 文本,此处我请求读者帮忙宣传我的书或给我打赏。
+- `include-after` 变量在网页末尾添加原始 HTML 文本,同时显示我的图书许可证。
+
+这些只是其中一部分可用的变量,查看 HTML 中的模板变量(我的文章 [Pandoc简介][1] 中介绍了如何查看 LaTeX 的模版变量,查看 HTML 模版变量的过程是相同的)对其余变量进行了解。
+
+#### 将网页分成多章
+
+网页可以作为一个整体生成,这会产生一个包含所有内容的长页面;也可以分成多章,我认为这样会更容易阅读。我将解释如何将网页划分为多章,以便读者不会被长网页吓到。
+
+为了使网页易于在 GitHub Pages 上部署,需要创建一个名为 `docs` 的根文件夹(这是 GitHub Pages 默认用于渲染网页的根文件夹)。然后我们需要为 `docs` 下的每一章创建文件夹,将 HTML 内容放在各自的文件夹中,将文件内容放在名为 `index.html` 的文件中。
+
+例如,`about.md` 文件将转换成名为 `index.html` 的文件,该文件位于名为 `about`(`about/index.html`)的文件夹中。这样,当用户键入 `http:///about/` 时,文件夹中的 `index.html` 文件将显示在其浏览器中。
+
+下面的 `Makefile` 将执行上述所有操作:
+
+```
+# Your book files
+DEPENDENCIES= toc preface about
+
+# Placement of your HTML files
+DOCS=docs
+
+all: web
+
+web: setup $(DEPENDENCIES)
+ @cp $(DOCS)/toc/index.html $(DOCS)
+
+
+# Creation and copy of stylesheet and images into
+# the assets folder. This is important to deploy the
+# website to Github Pages.
+setup:
+ @mkdir -p $(DOCS)
+ @cp -r assets $(DOCS)
+
+
+# Creation of folder and index.html file on a
+# per-chapter basis
+
+$(DEPENDENCIES):
+ @mkdir -p $(DOCS)/$@
+ @pandoc -s --toc web-metadata.yaml parts/$@.md \
+ -c /assets/pandoc.css -o $(DOCS)/$@/index.html
+
+clean:
+ @rm -rf $(DOCS)
+
+.PHONY: all clean web setup
+```
+
+选项 `- c /assets/pandoc.css` 声明要使用的 CSS 样式表,它将从 `/assets/pandoc.cs` 中获取。也就是说,在 `` 标签内,Pandoc 会添加这样一行:
+
+```
+
+```
+
+使用下面的命令生成网页:
+
+```
+make
+```
+
+根文件夹现在应该包含如下所示的文件结构:
+
+```
+.---parts
+| |--- toc.md
+| |--- preface.md
+| |--- about.md
+|
+|---docs
+ |--- assets/
+ |--- index.html
+ |--- toc
+ | |--- index.html
+ |
+ |--- preface
+ | |--- index.html
+ |
+ |--- about
+ |--- index.html
+
+```
+
+#### 部署网页
+
+通过以下步骤将网页部署到 GitHub 上:
+
+1. 创建一个新的 GitHub 仓库
+2. 将内容推送到新创建的仓库
+3. 找到仓库设置中的 GitHub Pages 部分,选择 `Source` 选项让 GitHub 使用主分支的内容
+
+你可以在 [GitHub Pages][5] 的网站上获得更多详细信息。
+
+[我的书的网页][6] 便是通过上述过程生成的,可以在网页上查看结果。
+
+### 生成电子书
+
+#### 创建 ePub 格式的元信息文件
+
+ePub 格式的元信息文件 `epub-meta.yaml` 和 HTML 元信息文件是类似的。主要区别在于 ePub 提供了其他模板变量,例如 `publisher` 和 `cover-image` 。ePub 格式图书的样式表可能与网页所用的不同,在这里我使用一个名为 `epub.css` 的样式表。
+
+```
+---
+title: 'GRASP principles for the Object-oriented Mind'
+publisher: 'Programming Language Fight Club'
+author: Kiko Fernandez-Reyes
+rights: 2017 Kiko Fernandez-Reyes, CC-BY-NC-SA 4.0 International
+cover-image: assets/cover.png
+stylesheet: assets/epub.css
+...
+```
+
+将以下内容添加到之前的 `Makefile` 中:
+
+```
+epub:
+ @pandoc -s --toc epub-meta.yaml \
+ $(addprefix parts/, $(DEPENDENCIES:=.md)) -o $(DOCS)/assets/book.epub
+```
+
+用于产生 ePub 格式图书的命令从 HTML 版本获取所有依赖项(每章的名称),向它们添加 Markdown 扩展,并在它们前面加上每一章的文件夹路径,以便让 Pandoc 知道如何进行处理。例如,如果 `$(DEPENDENCIES` 变量只包含 “前言” 和 “关于本书” 两章,那么 `Makefile` 将会这样调用:
+
+```
+@pandoc -s --toc epub-meta.yaml \
+parts/preface.md parts/about.md -o $(DOCS)/assets/book.epub
+```
+
+Pandoc 将提取这两章的内容,然后进行组合,最后生成 ePub 格式的电子书,并放在 `Assets` 文件夹中。
+
+这是使用此过程创建 ePub 格式电子书的一个 [示例][7]。
+
+### 过程总结
+
+从 Markdown 文件创建网页和 ePub 格式电子书的过程并不困难,但有很多细节需要注意。遵循以下大纲可能使你更容易使用 Pandoc。
+
+- HTML 图书:
+ - 使用 Markdown 语法创建每章内容
+ - 添加元信息
+ - 创建一个 `Makefile` 将各个部分组合在一起
+ - 设置 GitHub Pages
+ - 部署
+- ePub 电子书:
+ - 使用之前创建的每一章内容
+ - 添加新的元信息文件
+ - 创建一个 `Makefile` 以将各个部分组合在一起
+ - 设置 GitHub Pages
+ - 部署
+
+
+------
+
+via: https://opensource.com/article/18/10/book-to-website-epub-using-pandoc
+
+作者:[Kiko Fernandez-Reyes][a]
+选题:[lujun9972](https://github.com/lujun9972)
+译者:[jlztan](https://github.com/jlztan)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/kikofernandez
+[1]: https://linux.cn/article-10228-1.html
+[2]: https://pandoc.org/
+[3]: https://www.programmingfightclub.com/
+[4]: https://github.com/kikofernandez/programmingfightclub
+[5]: https://pages.github.com/
+[6]: https://www.programmingfightclub.com/grasp-principles/
+[7]: https://github.com/kikofernandez/programmingfightclub/raw/master/docs/web_assets/demo.epub
diff --git a/translated/tech/20181002 4 open source invoicing tools for small businesses.md b/published/20181002 4 open source invoicing tools for small businesses.md
similarity index 85%
rename from translated/tech/20181002 4 open source invoicing tools for small businesses.md
rename to published/20181002 4 open source invoicing tools for small businesses.md
index f333c318bc..c1f5337122 100644
--- a/translated/tech/20181002 4 open source invoicing tools for small businesses.md
+++ b/published/20181002 4 open source invoicing tools for small businesses.md
@@ -1,22 +1,23 @@
适用于小型企业的 4 个开源发票工具
======
-用基于 web 的发票软件管理你的账单,完成收款,十分简单。
+
+> 用基于 web 的发票软件管理你的账单,轻松完成收款,十分简单。

无论您开办小型企业的原因是什么,保持业务发展的关键是可以盈利。收款也就意味着向客户提供发票。
-使用 LibreOffice Writer 或 LibreOffice Calc 提供发票很容易,但有时候你需要的不止这些。从更专业的角度看。一种跟进发票的方法。提醒你何时跟进你发出的发票。
+使用 LibreOffice Writer 或 LibreOffice Calc 提供发票很容易,但有时候你需要的不止这些。从更专业的角度看,一种跟进发票的方法,可以提醒你何时跟进你发出的发票。
-在这里有各种各样的商业闭源发票管理工具。但是开源界的产品和相对应的闭源商业工具比起来,并不差,没准还更灵活。
+在这里有各种各样的商业闭源的发票管理工具。但是开源的产品和相对应的闭源商业工具比起来,并不差,没准还更灵活。
让我们一起了解这 4 款基于 web 的开源发票工具,它们很适用于预算紧张的自由职业者和小型企业。2014 年,我在本文的[早期版本][1]中提到了其中两个工具。这 4 个工具用起来都很简单,并且你可以在任何设备上使用它们。
### Invoice Ninja
-我不是很喜欢 ninja 这个词。尽管如此,我喜欢 [Invoice Ninja][2]。非常喜欢。它将功能融合在一个简单的界面,其中包含一组功能,可让创建,管理和向客户、消费者发送发票。
+我不是很喜欢 ninja (忍者)这个词。尽管如此,我喜欢 [Invoice Ninja][2]。非常喜欢。它将功能融合在一个简单的界面,其中包含一组可让你创建、管理和向客户、消费者发送发票的功能。
-您可以轻松配置多个客户端,跟进付款和未结清的发票,生成报价并用电子邮件发送发票。Invoice Ninja 与其竞争对手不同,它[集成][3]了超过 40 个流行支付方式,包括 PayPal,Stripe,WePay 以及 Apple Pay。
+您可以轻松配置多个客户端,跟进付款和未结清的发票,生成报价并用电子邮件发送发票。Invoice Ninja 与其竞争对手不同,它[集成][3]了超过 40 个流行支付方式,包括 PayPal、Stripe、WePay 以及 Apple Pay。
[下载][4]一个可以安装到自己服务器上的版本,或者获取一个[托管版][5]的账户,都可以使用 Invoice Ninja。它有免费版,也有每月 8 美元的收费版。
@@ -34,7 +35,7 @@ InvoicePlane 不仅可以生成或跟进发票。你还可以为任务或商品
[OpenSourceBilling][9] 被它的开发者称赞为“非常简单的计费软件”,当之无愧。它拥有最简洁的交互界面,配置使用起来轻而易举。
-OpenSourceBilling 因它的商业智能仪表盘脱颖而出,它可以跟进跟进你当前和以前的发票,以及任何没有支付的款项。它以图表的形式整理信息,使之很容易阅读。
+OpenSourceBilling 因它的商业智能仪表盘脱颖而出,它可以跟进你当前和以前的发票,以及任何没有支付的款项。它以图表的形式整理信息,使之很容易阅读。
你可以在发票上配置很多信息。只需点几下鼠标按几下键盘,即可添加项目、税率、客户名称以及付款条件。OpenSourceBilling 将这些信息保存在你所有的发票当中,不管新发票还是旧发票。
@@ -57,7 +58,7 @@ via: https://opensource.com/article/18/10/open-source-invoicing-tools
作者:[Scott Nesbitt][a]
选题:[lujun9972](https://github.com/lujun9972)
译者:[fuowang](https://github.com/fuowang)
-校对:[校对者ID](https://github.com/校对者ID)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/published/20181002 Greg Kroah-Hartman Explains How the Kernel Community Is Securing Linux.md b/published/20181002 Greg Kroah-Hartman Explains How the Kernel Community Is Securing Linux.md
new file mode 100644
index 0000000000..58996654e5
--- /dev/null
+++ b/published/20181002 Greg Kroah-Hartman Explains How the Kernel Community Is Securing Linux.md
@@ -0,0 +1,70 @@
+
+Greg Kroah-Hartman 解释内核社区是如何使 Linux 安全的
+============
+
+
+
+> 内核维护者 Greg Kroah-Hartman 谈论内核社区如何保护 Linux 不遭受损害。
+
+由于 Linux 使用量持续扩大,内核社区去提高这个世界上使用最广泛的技术 —— Linux 内核的安全性的重要性越来越高。安全不仅对企业客户很重要,它对消费者也很重要,因为 80% 的移动设备都使用了 Linux。在本文中,Linux 内核维护者 Greg Kroah-Hartman 带我们了解内核社区如何应对威胁。
+
+### bug 不可避免
+
+
+
+*Greg Kroah-Hartman [Linux 基金会][1]*
+
+正如 Linus Torvalds 曾经说过的,大多数安全问题都是 bug 造成的,而 bug 又是软件开发过程的一部分。是软件就有 bug。
+
+Kroah-Hartman 说:“就算是 bug,我们也不知道它是安全的 bug 还是不安全的 bug。我修复的一个著名 bug,在三年后才被 Red Hat 认定为安全漏洞“。
+
+在消除 bug 方面,内核社区没有太多的办法,只能做更多的测试来寻找 bug。内核社区现在已经有了自己的安全团队,它们是由熟悉内核核心的内核开发者组成。
+
+Kroah-Hartman 说:”当我们收到一个报告时,我们就让参与这个领域的核心开发者去修复它。在一些情况下,他们可能是同一个人,让他们进入安全团队可以更快地解决问题“。但他也强调,内核所有部分的开发者都必须清楚地了解这些问题,因为内核是一个可信环境,它必须被保护起来。
+
+Kroah-Hartman 说:”一旦我们修复了它,我们就将它放到我们的栈分析规则中,以便于以后不再重新出现这个 bug。“
+
+除修复 bug 之外,内核社区也不断加固内核。Kroah-Hartman 说:“我们意识到,我们需要一些主动的缓减措施,因此我们需要加固内核。”
+
+Kees Cook 和其他一些人付出了巨大的努力,带来了一直在内核之外的加固特性,并将它们合并或适配到内核中。在每个内核发行后,Cook 都对所有新的加固特性做一个总结。但是只加固内核是不够的,供应商们必须要启用这些新特性来让它们充分发挥作用,但他们并没有这么做。
+
+Kroah-Hartman [每周发布一个稳定版内核][5],而为了长期的支持,公司们只从中挑选一个,以便于设备制造商能够利用它。但是,Kroah-Hartman 注意到,除了 Google Pixel 之外,大多数 Android 手机并不包含这些额外的安全加固特性,这就意味着,所有的这些手机都是有漏洞的。他说:“人们应该去启用这些加固特性”。
+
+Kroah-Hartman 说:“我购买了基于 Linux 内核 4.4 的所有旗舰级手机,去查看它们中哪些确实升级了新特性。结果我发现只有一家公司升级了它们的内核。……我在整个供应链中努力去解决这个问题,因为这是一个很棘手的问题。它涉及许多不同的组织 —— SoC 制造商、运营商等等。关键点是,需要他们把我们辛辛苦苦设计的内核去推送给大家。”
+
+好消息是,与消费电子产品不一样,像 Red Hat 和 SUSE 这样的大供应商,在企业环境中持续对内核进行更新。使用容器、pod 和虚拟化的现代系统做到这一点更容易了。无需停机就可以毫不费力地更新和重启。事实上,现在来保证系统安全相比过去容易多了。
+
+### Meltdown 和 Spectre
+
+没有任何一个关于安全的讨论能够避免提及 Meltdown 和 Spectre 缺陷。内核社区一直致力于修改新发现的和已查明的安全漏洞。不管怎样,Intel 已经因为这些事情改变了它们的策略。
+
+Kroah-Hartman 说:“他们已经重新研究如何处理安全 bug,以及如何与社区合作,因为他们知道他们做错了。内核已经修复了几乎所有大的 Spectre 问题,但是还有一些小问题仍在处理中”。
+
+好消息是,这些 Intel 漏洞使得内核社区正在变得更好。Kroah-Hartman 说:“我们需要做更多的测试。对于最新一轮的安全补丁,在它们被发布之前,我们自己花了四个月时间来测试它们,因为我们要防止这个安全问题在全世界扩散。而一旦这些漏洞在真实的世界中被利用,将让我们认识到我们所依赖的基础设施是多么的脆弱,我们多年来一直在做这种测试,这确保了其它人不会遭到这些 bug 的伤害。所以说,Intel 的这些漏洞在某种程度上让内核社区变得更好了”。
+
+对安全的日渐关注也为那些有才华的人创造了更多的工作机会。由于安全是个极具吸引力的领域,那些希望在内核空间中有所建树的人,安全将是他们一个很好的起点。
+
+Kroah-Hartman 说:“如果有人想从事这方面的工作,我们有大量的公司愿意雇佣他们。我知道一些开始去修复 bug 的人已经被他们雇佣了。”
+
+你可以在下面链接的视频上查看更多的内容:
+
+[视频](https://youtu.be/jkGVabyMh1I)
+
+--------------------------------------------------------------------------------
+
+via: https://www.linux.com/blog/2018/10/greg-kroah-hartman-explains-how-kernel-community-securing-linux-0
+
+作者:[SWAPNIL BHARTIYA][a]
+选题:[oska874][b]
+译者:[qhwdw](https://github.com/qhwdw)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:https://www.linux.com/users/arnieswap
+[b]:https://github.com/oska874
+[1]:https://www.linux.com/licenses/category/linux-foundation
+[2]:https://www.linux.com/licenses/category/creative-commons-zero
+[3]:https://www.linux.com/files/images/greg-k-hpng
+[4]:https://www.linux.com/files/images/kernel-securityjpg-0
+[5]:https://www.kernel.org/category/releases.html
diff --git a/published/20181004 Functional programming in Python- Immutable data structures.md b/published/20181004 Functional programming in Python- Immutable data structures.md
new file mode 100644
index 0000000000..4b9bffdc51
--- /dev/null
+++ b/published/20181004 Functional programming in Python- Immutable data structures.md
@@ -0,0 +1,191 @@
+Python 函数式编程:不可变数据结构
+======
+
+> 不可变性可以帮助我们更好地理解我们的代码。下面我将讲述如何在不牺牲性能的条件下来实现它。
+
+
+
+在这个由两篇文章构成的系列中,我将讨论如何将函数式编程方法论中的思想引入至 Python 中,来充分发挥这两个领域的优势。
+
+本文(也就是第一篇文章)中,我们将探讨不可变数据结构的优势。第二部分会探讨如何在 `toolz` 库的帮助下,用 Python 实现高层次的函数式编程理念。
+
+为什么要用函数式编程?因为变化的东西更难推理。如果你已经确信变化会带来麻烦,那很棒。如果你还没有被说服,在文章结束时,你会明白这一点的。
+
+我们从思考正方形和矩形开始。如果我们抛开实现细节,单从接口的角度考虑,正方形是矩形的子类吗?
+
+子类的定义基于[里氏替换原则][1]。一个子类必须能够完成超类所做的一切。
+
+如何为矩形定义接口?
+
+```
+from zope.interface import Interface
+
+class IRectangle(Interface):
+ def get_length(self):
+ """正方形能做到"""
+ def get_width(self):
+ """正方形能做到"""
+ def set_dimensions(self, length, width):
+ """啊哦"""
+```
+
+如果我们这么定义,那正方形就不能成为矩形的子类:如果长度和宽度不等,它就无法对 `set_dimensions` 方法做出响应。
+
+另一种方法,是选择将矩形做成不可变对象。
+
+```
+class IRectangle(Interface):
+ def get_length(self):
+ """正方形能做到"""
+ def get_width(self):
+ """正方形能做到"""
+ def with_dimensions(self, length, width):
+ """返回一个新矩形"""
+```
+
+现在,我们可以将正方形视为矩形了。在调用 `with_dimensions` 时,它可以返回一个新的矩形(它不一定是个正方形),但它本身并没有变,依然是一个正方形。
+
+这似乎像是个学术问题 —— 直到我们认为正方形和矩形可以在某种意义上看做一个容器的侧面。在理解了这个例子以后,我们会处理更传统的容器,以解决更现实的案例。比如,考虑一下随机存取数组。
+
+我们现在有 `ISquare` 和 `IRectangle`,而且 `ISequere` 是 `IRectangle` 的子类。
+
+我们希望把矩形放进随机存取数组中:
+
+```
+class IArrayOfRectangles(Interface):
+ def get_element(self, i):
+ """返回一个矩形"""
+ def set_element(self, i, rectangle):
+ """'rectangle' 可以是任意 IRectangle 对象"""
+```
+
+我们同样希望把正方形放进随机存取数组:
+
+```
+class IArrayOfSquare(Interface):
+ def get_element(self, i):
+ """返回一个正方形"""
+ def set_element(self, i, square):
+ """'square' 可以是任意 ISquare 对象"""
+```
+
+尽管 `ISquare` 是 `IRectangle` 的子集,但没有任何一个数组可以同时实现 `IArrayOfSquare` 和 `IArrayOfRectangle`.
+
+为什么不能呢?假设 `bucket` 实现了这两个类的功能。
+
+```
+>>> rectangle = make_rectangle(3, 4)
+>>> bucket.set_element(0, rectangle) # 这是 IArrayOfRectangle 中的合法操作
+>>> thing = bucket.get_element(0) # IArrayOfSquare 要求 thing 必须是一个正方形
+>>> assert thing.height == thing.width
+Traceback (most recent call last):
+ File "", line 1, in
+AssertionError
+```
+
+无法同时实现这两类功能,意味着这两个类无法构成继承关系,即使 `ISquare` 是 `IRectangle` 的子类。问题来自 `set_element` 方法:如果我们实现一个只读的数组,那 `IArrayOfSquare` 就可以是 `IArrayOfRectangle` 的子类了。
+
+在可变的 `IRectangle` 和可变的 `IArrayOf*` 接口中,可变性都会使得对类型和子类的思考变得更加困难 —— 放弃变换的能力,意味着我们的直觉所希望的类型间关系能够成立了。
+
+可变性还会带来作用域方面的影响。当一个共享对象被两个地方的代码改变时,这种问题就会发生。一个经典的例子是两个线程同时改变一个共享变量。不过在单线程程序中,即使在两个相距很远的地方共享一个变量,也是一件简单的事情。从 Python 语言的角度来思考,大多数对象都可以从很多位置来访问:比如在模块全局变量,或在一个堆栈跟踪中,或者以类属性来访问。
+
+如果我们无法对共享做出约束,那我们可能要考虑对可变性来进行约束了。
+
+这是一个不可变的矩形,它利用了 [attr][2] 库:
+
+```
+@attr.s(frozen=True)
+class Rectange(object):
+ length = attr.ib()
+ width = attr.ib()
+ @classmethod
+ def with_dimensions(cls, length, width):
+ return cls(length, width)
+```
+
+这是一个正方形:
+
+```
+@attr.s(frozen=True)
+class Square(object):
+ side = attr.ib()
+ @classmethod
+ def with_dimensions(cls, length, width):
+ return Rectangle(length, width)
+```
+
+使用 `frozen` 参数,我们可以轻易地使 `attrs` 创建的类成为不可变类型。正确实现 `__setitem__` 方法的工作都交给别人完成了,对我们是不可见的。
+
+修改对象仍然很容易;但是我们不可能改变它的本质。
+
+```
+too_long = Rectangle(100, 4)
+reasonable = attr.evolve(too_long, length=10)
+```
+
+[Pyrsistent][3] 能让我们拥有不可变的容器。
+
+```
+# 由整数构成的向量
+a = pyrsistent.v(1, 2, 3)
+# 并非由整数构成的向量
+b = a.set(1, "hello")
+```
+
+尽管 `b` 不是一个由整数构成的向量,但没有什么能够改变 `a` 只由整数构成的性质。
+
+如果 `a` 有一百万个元素呢?`b` 会将其中的 999999 个元素复制一遍吗?`Pyrsistent` 具有“大 O”性能保证:所有操作的时间复杂度都是 `O(log n)`. 它还带有一个可选的 C 语言扩展,以在“大 O”性能之上进行提升。
+
+修改嵌套对象时,会涉及到“变换器”的概念:
+
+```
+blog = pyrsistent.m(
+ title="My blog",
+ links=pyrsistent.v("github", "twitter"),
+ posts=pyrsistent.v(
+ pyrsistent.m(title="no updates",
+ content="I'm busy"),
+ pyrsistent.m(title="still no updates",
+ content="still busy")))
+new_blog = blog.transform(["posts", 1, "content"],
+ "pretty busy")
+```
+
+`new_blog` 现在将是如下对象的不可变等价物:
+
+```
+{'links': ['github', 'twitter'],
+ 'posts': [{'content': "I'm busy",
+ 'title': 'no updates'},
+ {'content': 'pretty busy',
+ 'title': 'still no updates'}],
+ 'title': 'My blog'}
+```
+
+不过 `blog` 依然不变。这意味着任何拥有旧对象引用的人都没有受到影响:转换只会有局部效果。
+
+当共享行为猖獗时,这会很有用。例如,函数的默认参数:
+
+```
+def silly_sum(a, b, extra=v(1, 2)):
+ extra = extra.extend([a, b])
+ return sum(extra)
+```
+
+在本文中,我们了解了为什么不可变性有助于我们来思考我们的代码,以及如何在不带来过大性能负担的条件下实现它。下一篇,我们将学习如何借助不可变对象来实现强大的程序结构。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/10/functional-programming-python-immutable-data-structures
+
+作者:[Moshe Zadka][a]
+选题:[lujun9972](https://github.com/lujun9972)
+译者:[StdioA](https://github.com/StdioA)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/moshez
+[1]: https://en.wikipedia.org/wiki/Liskov_substitution_principle
+[2]: https://www.attrs.org/en/stable/
+[3]: https://pyrsistent.readthedocs.io/en/latest/
diff --git a/published/20181005 Terminalizer - A Tool To Record Your Terminal And Generate Animated Gif Images.md b/published/20181005 Terminalizer - A Tool To Record Your Terminal And Generate Animated Gif Images.md
new file mode 100644
index 0000000000..91718ae292
--- /dev/null
+++ b/published/20181005 Terminalizer - A Tool To Record Your Terminal And Generate Animated Gif Images.md
@@ -0,0 +1,159 @@
+Terminalizer:一个记录您终端活动并且生成 Gif 图像的工具
+====
+
+今天我们要讨论一个广为人知的主题,我们也围绕这个主题写过许多的文章,因此我不会针对这个如何记录终端会话流程给出太多具体的资料。
+
+我们可以使用脚本命令来记录 Linux 的终端会话,这也是大家公认的一种办法。不过今天我们将来介绍一个能起到相同作用的工具 —— Terminalizer。
+
+这个工具可以帮助我们记录用户的终端活动,以帮助我们从输出的文件中找到有用的信息。
+
+### 什么是 Terminlizer
+
+用户可以用 Terminlizer 记录他们的终端活动并且生成一个 Gif 图像。它是一个允许高度定制的 CLI 工具。用户可以在网络播放器、在线播放器上用链接分享他们记录下的文件。
+
+**推荐阅读:**
+
+ - [Script – 一个记录您终端对话的简单工具][1]
+ - [在 Linux 上自动记录/捕捉所有用户的终端对话][2]
+ - [Teleconsole – 一个能立即与任何人分享您终端对话的工具][3]
+ - [tmate – 立即与任何人分享您的终端对话][4]
+ - [Peek – 在 Linux 里制造一个 Gif 记录器][5]
+ - [Kgif – 一个能生成 Gif 图片,以记录窗口活动的简单 Shell 脚本][6]
+- [Gifine – 在 Ubuntu/Debian 里快速制造一个 Gif 视频][7]
+
+目前没有发行版拥有官方软件包来安装此实用程序,不过我们可以用 Node.js 来安装它。
+
+### 如何在 Linux 上安装 Node.js
+
+安装 Node.js 有许多种方法。我们在这里将会教您一个常用的方法。
+
+在 Ubuntu/LinuxMint 上可以使用 [APT-GET 命令][8] 或者 [APT 命令][9] 来安装 Node.js。
+
+```
+$ curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
+$ sudo apt-get install -y nodejs
+```
+
+在 Debian 上使用 [APT-GET 命令][8] 或者 [APT 命令][9] 来安装 Node.js。
+
+```
+# curl -sL https://deb.nodesource.com/setup_8.x | bash -
+# apt-get install -y nodejs
+```
+
+在 RHEL/CentOS 上,使用 [YUM 命令][10] 来安装。
+
+```
+$ sudo curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -
+$ sudo yum install epel-release
+$ sudo yum -y install nodejs
+```
+
+在 Fedora 上,用 [DNF 命令][11] 来安装 tmux。
+
+```
+$ sudo dnf install nodejs
+```
+
+在 Arch Linux 上,用 [Pacman 命令][12] 来安装 tmux。
+
+```
+$ sudo pacman -S nodejs npm
+```
+
+在 openSUSE 上,用 [Zypper Command][13] 来安装 tmux。
+
+```
+$ sudo zypper in nodejs6
+```
+
+### 如何安装 Terminalizer
+
+您已经安装了 Node.js 这个先决软件包,现在是时候在您的系统上安装 Terminalizer 了。简单执行如下的 `npm` 命令即可安装。
+
+```
+$ sudo npm install -g terminalizer
+```
+
+### 如何使用 Terminalizer
+
+您只需要执行如下的命令,即可使用 Terminalizer 记录您的终端会话活动。您可以敲击 `CTRL+D` 来结束并且保存记录。
+
+```
+# terminalizer record 2g-session
+
+defaultConfigPath
+The recording session is started
+Press CTRL+D to exit and save the recording
+```
+
+这将会将您记录的会话保存成一个 YAML 文件,在这个例子里,我的文件名将会是 2g-session-activity.yml。
+
+![][15]
+
+```
+# logout
+Successfully Recorded
+The recording data is saved into the file:
+/home/daygeek/2g-session.yml
+You can edit the file and even change the configurations.
+```
+
+![][16]
+
+### 如何播放记录下来的文件
+
+使用以下命令来播放您记录的 YAML 文件。在以下操作中,请确保您已经用了您的文件名来替换 “2g-session”。
+
+```
+# terminalizer play 2g-session
+```
+
+将记录的文件渲染成 Gif 图像。
+
+```
+# terminalizer render 2g-session
+```
+
+注意: 以下的两个命令在此版本尚且不可用,或许在下一版本这两个命令将会付诸使用。
+
+如果您想要将记录的文件分享给其他人,您可以将您的文件上传到在线播放器,并且将链接分享给对方。
+
+```
+terminalizer share 2g-session
+```
+
+为记录的文件生成一个网络播放器。
+
+```
+# terminalizer generate 2g-session
+```
+
+ --------------------------------------------------------------------------------
+
+via: https://www.2daygeek.com/terminalizer-a-tool-to-record-your-terminal-and-generate-animated-gif-images/
+
+作者:[Prakash Subramanian][a]
+选题:[lujun9972](https://github.com/lujun9972)
+译者:[thecyanbird](https://github.com/thecyanbird)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.2daygeek.com/author/prakash/
+[1]: https://www.2daygeek.com/script-command-record-save-your-terminal-session-activity-linux/
+[2]: https://www.2daygeek.com/automatically-record-all-users-terminal-sessions-activity-linux-script-command/
+[3]: https://www.2daygeek.com/teleconsole-share-terminal-session-instantly-to-anyone-in-seconds/
+[4]: https://www.2daygeek.com/tmate-instantly-share-your-terminal-session-to-anyone-in-seconds/
+[5]: https://www.2daygeek.com/peek-create-animated-gif-screen-recorder-capture-arch-linux-mint-fedora-ubuntu/
+[6]: https://www.2daygeek.com/kgif-create-animated-gif-file-active-window-screen-recorder-capture-arch-linux-mint-fedora-ubuntu-debian-opensuse-centos/
+[7]: https://www.2daygeek.com/gifine-create-animated-gif-vedio-recorder-linux-mint-debian-ubuntu/
+[8]: https://www.2daygeek.com/apt-get-apt-cache-command-examples-manage-packages-debian-ubuntu-systems/
+[9]: https://www.2daygeek.com/apt-command-examples-manage-packages-debian-ubuntu-systems/
+[10]: https://www.2daygeek.com/yum-command-examples-manage-packages-rhel-centos-systems/
+[11]: https://www.2daygeek.com/dnf-command-examples-manage-packages-fedora-system/
+[12]: https://www.2daygeek.com/pacman-command-examples-manage-packages-arch-linux-system/
+[13]: https://www.2daygeek.com/zypper-command-examples-manage-packages-opensuse-system/
+[14]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
+[15]: https://www.2daygeek.com/wp-content/uploads/2018/10/terminalizer-record-2g-session-1.gif
+[16]: https://www.2daygeek.com/wp-content/uploads/2018/10/terminalizer-play-2g-session.gif
diff --git a/published/20181006 LinuxBoot for Servers - Enter Open Source, Goodbye Proprietary UEFI.md b/published/20181006 LinuxBoot for Servers - Enter Open Source, Goodbye Proprietary UEFI.md
new file mode 100644
index 0000000000..63f74a4816
--- /dev/null
+++ b/published/20181006 LinuxBoot for Servers - Enter Open Source, Goodbye Proprietary UEFI.md
@@ -0,0 +1,118 @@
+服务器的 LinuxBoot:告别 UEFI、拥抱开源
+============
+
+[LinuxBoot][13] 是私有的 [UEFI][15] 固件的开源 [替代品][14]。它发布于去年,并且现在已经得到主流的硬件生产商的认可成为他们产品的默认固件。去年,LinuxBoot 已经被 Linux 基金会接受并[纳入][16]开源家族。
+
+这个项目最初是由 Ron Minnich 在 2017 年 1 月提出,它是 LinuxBIOS 的创造人,并且在 Google 领导 [coreboot][17] 的工作。
+
+Google、Facebook、[Horizon Computing Solutions][18]、和 [Two Sigma][19] 共同合作,在运行 Linux 的服务器上开发 [LinuxBoot 项目][20](以前叫 [NERF][21])。
+
+它的开放性允许服务器用户去很容易地定制他们自己的引导脚本、修复问题、构建他们自己的 [运行时环境][22] 和用他们自己的密钥去 [刷入固件][23],而不需要等待供应商的更新。
+
+下面是第一次使用 NERF BIOS 去引导 [Ubuntu Xenial][24] 的视频:
+
+[点击看视频](https://youtu.be/HBkZAN3xkJg)
+
+我们来讨论一下它与 UEFI 相比在服务器硬件方面的其它优势。
+
+### LinuxBoot 超越 UEFI 的优势
+
+
+
+下面是一些 LinuxBoot 超越 UEFI 的主要优势:
+
+#### 启动速度显著加快
+
+它能在 20 秒钟以内完成服务器启动,而 UEFI 需要几分钟的时间。
+
+#### 显著的灵活性
+
+LinuxBoot 可以用在 Linux 支持的各种设备、文件系统和协议上。
+
+#### 更加安全
+
+相比 UEFI 而言,LinuxBoot 在设备驱动程序和文件系统方面进行更加严格的检查。
+
+我们可能争辩说 UEFI 是使用 [EDK II][25] 而部分开源的,而 LinuxBoot 是部分闭源的。但有人[提出][26],即便有像 EDK II 这样的代码,但也没有做适当的审查级别和像 [Linux 内核][27] 那样的正确性检查,并且在 UEFI 的开发中还大量使用闭源组件。
+
+另一方面,LinuxBoot 有非常小的二进制文件,它仅用了大约几百 KB,相比而言,而 UEFI 的二进制文件有 32 MB。
+
+严格来说,LinuxBoot 与 UEFI 不一样,更适合于[可信计算基础][28]。
+
+LinuxBoot 有一个基于 [kexec][30] 的引导加载器,它不支持启动 Windows/非 Linux 内核,但这影响并不大,因为主流的云都是基于 Linux 的服务器。
+
+### LinuxBoot 的采用者
+
+自 2011 年, [Facebook][32] 发起了[开源计算项目(OCP)][31],它的一些服务器是基于[开源][33]设计的,目的是构建的数据中心更加高效。LinuxBoot 已经在下面列出的几个开源计算硬件上做了测试:
+
+* Winterfell
+* Leopard
+* Tioga Pass
+
+更多 [OCP][34] 硬件在[这里][35]有一个简短的描述。OCP 基金会通过[开源系统固件][36]运行一个专门的固件项目。
+
+支持 LinuxBoot 的其它一些设备有:
+
+* [QEMU][9] 仿真的 [Q35][10] 系统
+* [Intel S2600wf][11]
+* [Dell R630][12]
+
+上个月底(2018 年 9 月 24 日),[Equus 计算解决方案][37] [宣布][38] 发行它的 [白盒开放式™][39] M2660 和 M2760 服务器,作为它们的定制的、成本优化的、开放硬件服务器和存储平台的一部分。它们都支持 LinuxBoot 灵活定制服务器的 BIOS,以提升安全性和设计一个非常快的纯净的引导体验。
+
+### 你认为 LinuxBoot 怎么样?
+
+LinuxBoot 在 [GitHub][40] 上有很丰富的文档。你喜欢它与 UEFI 不同的特性吗?由于 LinuxBoot 的开放式开发和未来,你愿意使用 LinuxBoot 而不是 UEFI 去启动你的服务器吗?请在下面的评论区告诉我们吧。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/linuxboot-uefi/
+
+作者:[Avimanyu Bandyopadhyay][a]
+选题:[oska874][b]
+译者:[qhwdw](https://github.com/qhwdw)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:https://itsfoss.com/author/avimanyu/
+[b]:https://github.com/oska874
+[1]:https://itsfoss.com/linuxboot-uefi/#
+[2]:https://itsfoss.com/linuxboot-uefi/#
+[3]:https://itsfoss.com/linuxboot-uefi/#
+[4]:https://itsfoss.com/linuxboot-uefi/#
+[5]:https://itsfoss.com/linuxboot-uefi/#
+[6]:https://itsfoss.com/linuxboot-uefi/#
+[7]:https://itsfoss.com/author/avimanyu/
+[8]:https://itsfoss.com/linuxboot-uefi/#comments
+[9]:https://en.wikipedia.org/wiki/QEMU
+[10]:https://wiki.qemu.org/Features/Q35
+[11]:https://trmm.net/S2600
+[12]:https://trmm.net/NERF#Installing_on_a_Dell_R630
+[13]:https://www.linuxboot.org/
+[14]:https://www.phoronix.com/scan.php?page=news_item&px=LinuxBoot-OSFC-2018-State
+[15]:https://itsfoss.com/check-uefi-or-bios/
+[16]:https://www.linuxfoundation.org/blog/2018/01/system-startup-gets-a-boost-with-new-linuxboot-project/
+[17]:https://en.wikipedia.org/wiki/Coreboot
+[18]:http://www.horizon-computing.com/
+[19]:https://www.twosigma.com/
+[20]:https://trmm.net/LinuxBoot_34c3
+[21]:https://trmm.net/NERF
+[22]:https://trmm.net/LinuxBoot_34c3#Runtimes
+[23]:http://www.tech-faq.com/flashing-firmware.html
+[24]:https://itsfoss.com/features-ubuntu-1604/
+[25]:https://www.tianocore.org/
+[26]:https://media.ccc.de/v/34c3-9056-bringing_linux_back_to_server_boot_roms_with_nerf_and_heads
+[27]:https://medium.com/@bhumikagoyal/linux-kernel-development-cycle-52b4c55be06e
+[28]:https://en.wikipedia.org/wiki/Trusted_computing_base
+[29]:https://itsfoss.com/adobe-alternatives-linux/
+[30]:https://en.wikipedia.org/wiki/Kexec
+[31]:https://en.wikipedia.org/wiki/Open_Compute_Project
+[32]:https://github.com/facebook
+[33]:https://github.com/opencomputeproject
+[34]:https://www.networkworld.com/article/3266293/lan-wan/what-is-the-open-compute-project.html
+[35]:http://hyperscaleit.com/ocp-server-hardware/
+[36]:https://www.opencompute.org/projects/open-system-firmware
+[37]:https://www.equuscs.com/
+[38]:http://www.dcvelocity.com/products/Software_-_Systems/20180924-equus-compute-solutions-introduces-whitebox-open-m2660-and-m2760-servers/
+[39]:https://www.equuscs.com/servers/whitebox-open/
+[40]:https://github.com/linuxboot/linuxboot
diff --git a/translated/tech/20181008 KeeWeb - An Open Source, Cross Platform Password Manager.md b/published/20181008 KeeWeb - An Open Source, Cross Platform Password Manager.md
similarity index 80%
rename from translated/tech/20181008 KeeWeb - An Open Source, Cross Platform Password Manager.md
rename to published/20181008 KeeWeb - An Open Source, Cross Platform Password Manager.md
index 3d0ec169a2..f8b6e2b5d9 100644
--- a/translated/tech/20181008 KeeWeb - An Open Source, Cross Platform Password Manager.md
+++ b/published/20181008 KeeWeb - An Open Source, Cross Platform Password Manager.md
@@ -1,4 +1,5 @@
-# KeeWeb – 一个开源且跨平台的密码管理工具
+KeeWeb:一个开源且跨平台的密码管理工具
+======

@@ -6,64 +7,60 @@
**KeePass** 就是一个这样的开源密码管理工具,它有一个官方客户端,但功能非常简单。也有许多 PC 端和手机端的其他密码管理工具,并且与 KeePass 存储加密密码的文件格式兼容。其中一个就是 **KeeWeb**。
-KeeWeb 是一个开源、跨平台的密码管理工具,具有云同步,键盘快捷键和插件等功能。KeeWeb使用 Electron 框架,这意味着它可以在 Windows,Linux 和 Mac OS 上运行。
+KeeWeb 是一个开源、跨平台的密码管理工具,具有云同步,键盘快捷键和插件等功能。KeeWeb使用 Electron 框架,这意味着它可以在 Windows、Linux 和 Mac OS 上运行。
### KeeWeb 的使用
有两种方式可以使用 KeeWeb。第一种无需安装,直接在网页上使用,第二中就是在本地系统中安装 KeeWeb 客户端。
-**在网页上使用 KeeWeb**
+#### 在网页上使用 KeeWeb
-如果不想在系统中安装应用,可以去 [**https://app.keeweb.info/**][1] 使用KeeWeb。
+如果不想在系统中安装应用,可以去 [https://app.keeweb.info/][1] 使用KeeWeb。

网页端具有桌面客户端的所有功能,当然也需要联网才能进行使用。
-**在计算机中安装 KeeWeb**
+#### 在计算机中安装 KeeWeb
如果喜欢客户端的舒适性和离线可用性,也可以将其安装在系统中。
-如果使用Ubuntu/Debian,你可以去 [**releases pages**][2] 下载 KeeWeb 最新的 **.deb ** 文件,然后通过下面的命令进行安装:
+如果使用 Ubuntu/Debian,你可以去 [发布页][2] 下载 KeeWeb 最新的 .deb 文件,然后通过下面的命令进行安装:
```
$ sudo dpkg -i KeeWeb-1.6.3.linux.x64.deb
-
```
-如果用的是 Arch,在 [**AUR**][3] 上也有 KeeWeb,可以使用任何 AUR 助手进行安装,例如 [**Yay**][4]:
+如果用的是 Arch,在 [AUR][3] 上也有 KeeWeb,可以使用任何 AUR 助手进行安装,例如 [Yay][4]:
```
$ yay -S keeweb
-
```
-安装后,从菜单中或应用程序启动器启动 KeeWeb。默认界面长这样:
+安装后,从菜单中或应用程序启动器启动 KeeWeb。默认界面如下:

### 总体布局
-KeeWeb 界面主要显示所有密码的列表,在左侧展示所有标签。单击标签将对密码进行过滤,只显示带有那个标签的密码。在右侧,显示所选帐户的所有字段。你可以设置用户名,密码,网址,或者添加自定义的备注。你甚至可以创建自己的字段并将其标记为安全字段,这在存储信用卡信息等内容时非常有用。你只需单击即可复制密码。 KeeWeb 还显示账户的创建和修改日期。已删除的密码会保留在回收站中,可以在其中还原或永久删除。
+KeeWeb 界面主要显示所有密码的列表,在左侧展示所有标签。单击标签将对密码进行筛选,只显示带有那个标签的密码。在右侧,显示所选帐户的所有字段。你可以设置用户名、密码、网址,或者添加自定义的备注。你甚至可以创建自己的字段并将其标记为安全字段,这在存储信用卡信息等内容时非常有用。你只需单击即可复制密码。 KeeWeb 还显示账户的创建和修改日期。已删除的密码会保留在回收站中,可以在其中还原或永久删除。

### KeeWeb 功能
-**云同步**
+#### 云同步
KeeWeb 的主要功能之一是支持各种远程位置和云服务。除了加载本地文件,你可以从以下位置打开文件:
-```
1. WebDAV Servers
2. Google Drive
3. Dropbox
4. OneDrive
-```
这意味着如果你使用多台计算机,就可以在它们之间同步密码文件,因此不必担心某台设备无法访问所有密码。
-**密码生成器**
+#### 密码生成器

@@ -71,13 +68,13 @@ KeeWeb 的主要功能之一是支持各种远程位置和云服务。除了加
为此,KeeWeb 有一个内置密码生成器,可以生成特定长度、包含指定字符的自定义密码。
-**插件**
+#### 插件

-你可以使用插件扩展 KeeWeb 的功能。 其中一些插件用于更改界面语言,而其他插件则添加新功能,例如访问 **** 以查看密码是否暴露。
+你可以使用插件扩展 KeeWeb 的功能。其中一些插件用于更改界面语言,而其他插件则添加新功能,例如访问 https://haveibeenpwned.com 以查看密码是否暴露。
-**本地备份**
+#### 本地备份

@@ -94,7 +91,7 @@ via: https://www.ostechnix.com/keeweb-an-open-source-cross-platform-password-man
作者:[EDITOR][a]
选题:[lujun9972](https://github.com/lujun9972)
译者:[jlztan](https://github.com/jlztan)
-校对:[校对者ID](https://github.com/校对者ID)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/sources/tech/20181008 Play Windows games on Fedora with Steam Play and Proton.md b/published/20181008 Play Windows games on Fedora with Steam Play and Proton.md
similarity index 56%
rename from sources/tech/20181008 Play Windows games on Fedora with Steam Play and Proton.md
rename to published/20181008 Play Windows games on Fedora with Steam Play and Proton.md
index 8f3a5a38c5..c0859f1dc1 100644
--- a/sources/tech/20181008 Play Windows games on Fedora with Steam Play and Proton.md
+++ b/published/20181008 Play Windows games on Fedora with Steam Play and Proton.md
@@ -1,9 +1,9 @@
-在 Fedora 上使用 Steam play 和 Proton 来玩 Windows 游戏
+在 Fedora 上使用 Steam play 和 Proton 来玩 Windows 游戏
======

-几周前,Steam 宣布要给 Steam Play 增加一个新组件,用于支持在 Linux 平台上使用 Proton 来玩 Windows 的游戏,这个组件是 WINE 的一个分支。这个功能仍然处于测试阶段,且并非对所有游戏都有效。这里有一些关于 Steam 和 Proton 的细节。
+之前,Steam [宣布][1]要给 Steam Play 增加一个新组件,用于支持在 Linux 平台上使用 Proton 来玩 Windows 的游戏,这个组件是 WINE 的一个分支。这个功能仍然处于测试阶段,且并非对所有游戏都有效。这里有一些关于 Steam 和 Proton 的细节。
据 Steam 网站称,测试版本中有以下这些新功能:
@@ -13,29 +13,27 @@
* 改进了对游戏控制器的支持,游戏自动识别所有 Steam 支持的控制器,比起游戏的原始版本,能够获得更多开箱即用的控制器兼容性。
* 和 vanilla WINE 比起来,游戏的多线程性能得到了极大的提高。
-
-
### 安装
如果你有兴趣,想尝试一下 Steam 和 Proton。请按照下面这些简单的步骤进行操作。(请注意,如果你已经安装了最新版本的 Steam,可以忽略启用 Steam 测试版这个第一步。在这种情况下,你不再需要通过 Steam 测试版来使用 Proton。)
-打开 Steam 并登陆到你的帐户,这个截屏示例显示的是在使用 Proton 之前仅支持22个游戏。
+打开 Steam 并登陆到你的帐户,这个截屏示例显示的是在使用 Proton 之前仅支持 22 个游戏。
![][3]
-现在点击客户端顶部的 Steam 选项,这会显示一个下拉菜单。然后选择设置。
+现在点击客户端顶部的 “Steam” 选项,这会显示一个下拉菜单。然后选择“设置”。
![][4]
-现在弹出了设置窗口,选择账户选项,并在 Beta participation 旁边,点击更改。
+现在弹出了设置窗口,选择“账户”选项,并在 “参与 Beta 测试” 旁边,点击“更改”。
![][5]
-现在将 None 更改为 Steam Beta Update。
+现在将 “None” 更改为 “Steam Beta Update”。
![][6]
-点击确定,然后系统会提示你重新启动。
+点击“确定”,然后系统会提示你重新启动。
![][7]
@@ -43,11 +41,11 @@
![][8]
-在重新启动之后,返回到上面的设置窗口。这次你会看到一个新选项。确定有为提供支持的游戏使用 Stream Play 这个复选框,让所有的游戏都使用 Steam Play 进行运行,而不是 steam 中游戏特定的选项。兼容性工具应该是 Proton。
+在重新启动之后,返回到上面的设置窗口。这次你会看到一个新选项。确定勾选了“为提供支持的游戏使用 Stream Play” 、“让所有的游戏都使用 Steam Play 运行”,“使用这个工具替代 Steam 中游戏特定的选项”。这个兼容性工具应该就是 Proton。
![][9]
-Steam 客户端会要求你重新启动,照做,然后重新登陆你的 Steam 账户,你的 Linux 的游戏库就能得到扩展了。
+Steam 客户端会要求你重新启动,照做,然后重新登录你的 Steam 账户,你的 Linux 的游戏库就能得到扩展了。
![][10]
@@ -69,7 +67,7 @@ Steam 客户端会要求你重新启动,照做,然后重新登陆你的 Stea
![][16]
-一些游戏可能会受到 Proton 测试性质的影响,在下面这个叫 Chantelise 游戏中,没有了声音并且帧率很低。请记住这个功能仍然在测试阶段,Fedora 不会对结果负责。如果你想要了解更多,社区已经创建了一个 Google 文档,这个文档里有已经测试过的游戏的列表。
+一些游戏可能会受到 Proton 测试性质的影响,在这个叫 Chantelise 游戏中,没有了声音并且帧率很低。请记住这个功能仍然在测试阶段,Fedora 不会对结果负责。如果你想要了解更多,社区已经创建了一个 Google 文档,这个文档里有已经测试过的游戏的列表。
--------------------------------------------------------------------------------
@@ -79,25 +77,25 @@ via: https://fedoramagazine.org/play-windows-games-steam-play-proton/
作者:[Francisco J. Vergara Torres][a]
选题:[lujun9972](https://github.com/lujun9972)
译者:[hopefully2333](https://github.com/hopefully2333)
-校对:[校对者ID](https://github.com/校对者ID)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://fedoramagazine.org/author/patxi/
[1]: https://steamcommunity.com/games/221410/announcements/detail/1696055855739350561
[2]: https://fedoramagazine.org/third-party-repositories-fedora/
-[3]: https://fedoramagazine.org/wp-content/uploads/2018/09/listOfGamesLinux-300x197.png
-[4]: https://fedoramagazine.org/wp-content/uploads/2018/09/1-300x169.png
-[5]: https://fedoramagazine.org/wp-content/uploads/2018/09/2-300x196.png
-[6]: https://fedoramagazine.org/wp-content/uploads/2018/09/4-300x272.png
-[7]: https://fedoramagazine.org/wp-content/uploads/2018/09/6-300x237.png
-[8]: https://fedoramagazine.org/wp-content/uploads/2018/09/7-300x126.png
-[9]: https://fedoramagazine.org/wp-content/uploads/2018/09/10-300x237.png
-[10]: https://fedoramagazine.org/wp-content/uploads/2018/09/12-300x196.png
-[11]: https://fedoramagazine.org/wp-content/uploads/2018/09/13-300x196.png
-[12]: https://fedoramagazine.org/wp-content/uploads/2018/09/14-300x195.png
-[13]: https://fedoramagazine.org/wp-content/uploads/2018/09/15-300x196.png
-[14]: https://fedoramagazine.org/wp-content/uploads/2018/09/16-300x195.png
-[15]: https://fedoramagazine.org/wp-content/uploads/2018/09/Screenshot-from-2018-08-30-15-14-59-300x169.png
-[16]: https://fedoramagazine.org/wp-content/uploads/2018/09/Screenshot-from-2018-08-30-15-19-34-300x169.png
+[3]: https://fedoramagazine.org/wp-content/uploads/2018/09/listOfGamesLinux-768x505.png
+[4]: https://fedoramagazine.org/wp-content/uploads/2018/09/1-768x432.png
+[5]: https://fedoramagazine.org/wp-content/uploads/2018/09/2-768x503.png
+[6]: https://fedoramagazine.org/wp-content/uploads/2018/09/4.png
+[7]: https://fedoramagazine.org/wp-content/uploads/2018/09/6.png
+[8]: https://fedoramagazine.org/wp-content/uploads/2018/09/7.png
+[9]: https://fedoramagazine.org/wp-content/uploads/2018/09/10.png
+[10]: https://fedoramagazine.org/wp-content/uploads/2018/09/12-768x503.png
+[11]: https://fedoramagazine.org/wp-content/uploads/2018/09/13-768x501.png
+[12]: https://fedoramagazine.org/wp-content/uploads/2018/09/14-768x498.png
+[13]: https://fedoramagazine.org/wp-content/uploads/2018/09/15-768x501.png
+[14]: https://fedoramagazine.org/wp-content/uploads/2018/09/16-768x500.png
+[15]: https://fedoramagazine.org/wp-content/uploads/2018/09/Screenshot-from-2018-08-30-15-14-59-768x432.png
+[16]: https://fedoramagazine.org/wp-content/uploads/2018/09/Screenshot-from-2018-08-30-15-19-34-768x432.png
[17]: https://docs.google.com/spreadsheets/d/1DcZZQ4HL_Ol969UbXJmFG8TzOHNnHoj8Q1f8DIFe8-8/edit#gid=1003113831
diff --git a/translated/tech/20181010 5 alerting and visualization tools for sysadmins.md b/published/20181010 5 alerting and visualization tools for sysadmins.md
similarity index 61%
rename from translated/tech/20181010 5 alerting and visualization tools for sysadmins.md
rename to published/20181010 5 alerting and visualization tools for sysadmins.md
index f825724cd5..2306e197cf 100644
--- a/translated/tech/20181010 5 alerting and visualization tools for sysadmins.md
+++ b/published/20181010 5 alerting and visualization tools for sysadmins.md
@@ -1,34 +1,35 @@
5 个适合系统管理员使用的告警可视化工具
======
-这些开源的工具能够通过输出帮助用户了解系统的运行状况,并对可能发生的潜在问题作出告警。
+
+> 这些开源的工具能够通过输出帮助用户了解系统的运行状况,并对可能发生的潜在问题作出告警。

-你大概已经已经知道告警可视化工具是用来做什么的了。下面我们就要来说一下,为什么要讨论这样的工具,甚至某些系统专门将可视化作为特有的功能。
+你大概已经知道(或猜到)告警可视化工具是用来做什么的了。下面我们就要来说一下,为什么要讨论这样的工具,甚至某些系统专门将可视化作为特有的功能。
-可观察性的概念来自控制理论,这个概念描述了我们通过对系统的输入和系统的输出来了解系统的能力。本文将重点介绍具有可观察性的输出组件。
+可观察性的概念来自控制理论,这个概念描述了我们通过对系统的输入和输出来了解其的能力。本文将重点介绍具有可观察性的输出组件。
-告警可视化工具可以对系统的输出进行分析,进而对输出的信息结构化。告警实际上是对系统异常状态的描述,而可视化则是让用户能够直观理解的结构化表示。
+告警可视化工具可以对其它系统的输出进行分析,进而对输出的信息进行结构化表示。告警实际上是对系统异常状态的描述,而可视化则是让用户能够直观理解的结构化表示。
### 常见的可视化告警
#### 告警
-首先要明确一下告警的含义。在人员无法响应告警内容情况下,不应该发送告警。包括那些发给多个人,但只有其中少数人可以响应的告警,以及系统中的每个异常都触发的告警。因为这样会产生告警疲劳,告警接收者也往往会对这些过多的告警采取忽视的态度。
+首先要明确一下告警的含义。在人员无法响应告警内容情况下,不应该发送告警 —— 包括那些发给多个人但只有其中少数人可以响应的告警,以及系统中的每个异常都触发的告警。因为这样会产生告警疲劳,告警接收者也往往会对这些过多的告警采取忽视的态度 —— 直到系统恶化到以少见的方式告警。
-例如,如果管理员每天都会收到告警系统发来的数百封告警邮件,他就很容易会忽略告警系统的所有邮件。除非问题真正发生,并且受到了客户或上级的询问时,管理员才会重新重视告警信息。在这种情况下,告警已经失去了原有的意义和用途。
+例如,如果管理员每天都会收到告警系统发来的数百封告警邮件,他就很容易会忽略告警系统的所有邮件。除非他真的看到问题发生,或者受到了客户或上级的询问时,管理员才会重新重视告警信息。在这种情况下,告警已经失去了原有的意义和用途。
告警不是一个持续的信息流或者状态更新。告警的目的在于暴露系统无法自动恢复的问题,而且告警应该只发送给最有可能解决问题的人员。超出这个定义的内容都不应该作为告警,否则将会对实际工作造成不良的影响。
-不同的告警体系都会有各自的告警类型,因此不能用优先级(P1-P5)或者诸如“信息”、“警告”、“严重”之类的字眼来一概而论,而应该使用一些通用的分类方式来对复杂系统事件进行描述。
+不同的告警体系都会有各自的告警类型,因此不能用优先级(P1-P5)或者诸如“信息”、“警告”、“严重”之类的字眼来一概而论,下面我会介绍一些新兴的复杂系统的事件响应中出现的通用分类方式。
-刚才我提到了一个“信息”这个告警类型,但实际上告警不应该是一个信息,尽管有些人可能会不这样认为。但我觉得如果一个告警没有发送给任何一个人,它就不应该是警报,而只是一些在系统中被视为警报的数据点,代表了一些应该知晓但不需要响应的事件。它更应该作为告警可视化工具的一部分,而不是会导致触发告警的事件。《[实用监控][1]》是这个领域的必读书籍,其作者 Mike Julian 在书中就介绍了他自己关于告警的看法。
+刚才我提到了一个“信息”这个告警类型,但实际上告警不应该是一个信息,尽管有些人可能会不这样认为。但我觉得如果一个告警没有发送给任何一个人,它就不应该是警报,而只是一些在许多系统中被视为警报的数据点,代表了一些应该知晓但不需要响应的事件。它更应该作为告警可视化工具的一部分,而不是会导致触发告警的事件。《[实用监控][1]》是这个领域的必读书籍,其作者 Mike Julian 在书中就介绍了他自己关于告警的看法。
-而非信息警报则代表告警需要被响应以及需要相关的操作。我将这些告警大致分为内部故障和外部故障两种类型,而对于大多数公司来说,通常会有两个以上的级别来确定响应告警的优先级。系统性能下降就是一种故障,因为这种现象对用户的影响通常都是未知的。
+而非信息警报则代表告警需要被响应以及需要相关的操作。我将这些告警大致分为内部故障和外部故障两种类型,而对于大多数公司来说,通常会有两个以上的级别来确定响应告警的优先级。系统性能下降就是一种故障,因为其对用户的影响通常都是未知的。
内部故障比外部故障的优先级低,但也需要快速响应。内部故障通常包括公司员工使用的内部系统或仅对公司员工可见的应用故障。
-外部则包括任何会产生业务影响的系统故障,但不包括影响系统更新的故障。外部故障一般包括客户端应用故障、数据库故障和导致系统可用性或一致性失效的网络故障,这些都会影响用户的正常使用。对于不直接影响用户的依赖组件故障也属于外部故障,随着应用程序的不断运行,一旦依赖组件发生故障,系统的性能也会受到波及。这种情况对于使用某些外部服务或数据源的系统来说很常见,尽管这些外部服务或数据源对于可能不涉及到系统的主要功能,但是当系统在处理相关依赖组件的错误时可能会出现较明显的延迟。
+外部故障则包括任何马上会产生业务影响的系统故障,但不包括影响系统更新的故障。外部故障一般包括客户所面临的应用故障、数据库故障和导致系统可用性或一致性失效的网络故障,这些都会影响用户的正常使用。对于不直接影响用户的依赖组件故障也属于外部故障,随着应用程序的不断运行,一旦依赖组件发生故障,系统的性能也会受到波及。这种情况对于使用某些外部服务或数据源的系统来说很常见,尽管这些外部服务或数据源对于可能不涉及到系统的主要功能,但是当系统在处理相关依赖组件的错误时可能会出现较明显的延迟。
### 可视化
@@ -36,11 +37,11 @@
#### 折线图
-折线图可能是最常见的可视化方式了,它可以让用户很直观地按照时间维度了解系统的情况。系统中每个不同的指标都会以一条独立的折线在图表中体现。但当同一个图表中同时存在多条折线时,就可能会对阅读有所影响(如下图所示),所以大多数情况下都可以选择仅查看其中的少数几条折线,而不是让所有折线同时显示。如果某个指标的数值产生了大于正常范围的波动,就会很容易发现。例如下图中异常的紫线、黄线、浅蓝线。
+折线图可能是最常见的可视化方式了,它可以让用户很直观地按照时间维度了解系统的情况。系统中每个单一或聚合的指标都会以一条折线在图表中体现。但当同一个图表中同时存在多条折线时,就可能会对阅读有所影响(如下图所示),所以大多数情况下都可以选择仅查看其中的少数几条折线,而不是让所有折线同时显示。如果某个指标的数值产生了大于正常范围的波动,就会很容易发现。例如下图中异常的紫线、黄线、浅蓝线。

-折线图的另一个用法是可以将多条折线堆积起来以显示它们之间的关系。例如对于通过折线图反映服务器的请求数量,可以单独显示每台服务器上的请求,也可以把多台服务器的数据合在一起显示。这就可以在同一个图表中灵活查看整个系统中每个实例的情况了。
+折线图的另一个用法是可以将多条折线堆叠起来以显示它们之间的关系。例如对于通过折线图反映服务器的请求数量,可以单独看到每台服务器上的请求,也可以聚合在一起看。这就可以在同一个图表中灵活查看整个系统以及每个实例的情况了。

@@ -54,7 +55,7 @@
#### 仪表图
-还有一种常见的可视化方式是仪表图,用户可以通过仪表图快速了解单个指标。仪表一般用于单个指标的显示,例如车速表代表汽车的行驶速度、油量表代表油箱中的汽油量等等。大多数的仪表图都有一个共通点,就是会划分出所示指标的对应状态。如下图所示,绿色表示正常的状态,橙色表示不良的状态,而红色则表示极差的状态。中间一行则模拟了真实仪表的显示情况。
+还有一种常见的可视化方式是仪表图,用户可以通过仪表图快速了解单个指标。仪表一般用于单个指标的显示,例如车速表代表汽车的行驶速度、油量表代表油箱中的汽油量等等。大多数的仪表图都有一个共通点,就是会划分出所示指标的对应状态。如下图所示,绿色表示正常的状态,橙色表示不良的状态,而红色则表示极差的状态。下图中间一行模拟了真实仪表的显示情况。

@@ -76,29 +77,29 @@
如果你的电脑出现问题,得多亏 Stack Exchange 你才能在网上查到解决办法。Stack Exchange 以众包问答的模式运营着很多不同类型的网站。其中就有广受开发者欢迎的 [Stack Overflow][5],以及运维方面有名的 [Super User][6]。除此以外,从育儿经验到科幻小说、从哲学讨论到单车论坛,Stack Exchange 都有涉猎。
-Stack Exchange 开源了它的开源告警管理系统 [Bosun][7],同时也发布了使用 [AlertManager][8] 的 Prometheus 系统。这两个系统有共通点。Bosun 和 Prometheus 一样使用 Golang 开发,但 Bosun 比 Prometheus 更为强大,因为它可以使用权值聚合以外的方式与系统交互。Bosun 还可以从日志收集系统中提取数据,并且支持 Graphite、InfluxDB、OpenTSDB 和 Elasticsearch。
+Stack Exchange 开源了它的告警管理系统 [Bosun][7],同时也发布了 Prometheus 及其 [AlertManager][8] 系统。这两个系统有共通点。Bosun 和 Prometheus 一样使用 Golang 开发,但 Bosun 比 Prometheus 更为强大,因为它可以使用指标聚合以外的方式与系统交互。Bosun 还可以从日志和事件收集系统中提取数据,并且支持 Graphite、InfluxDB、OpenTSDB 和 Elasticsearch。
-Bosun 的架构包括一个二进制服务文件,以及一个诸如 OpenTSDB 的后端、Redis 以及 [scollector agents][9]。 scollector agents 会自动检测主机上正在运行的服务,并反馈这些进程和其它的系统资源情况。这些数据将发送到后端。随后 Bosun 二进制服务文件会向后端发起查询,确定是否需要触发告警。也可以通过 [Grafana][10] 这些工具通过一个通用接口查询 Bosun 的底层后端。而 Redis 则用于存储 Bosun 的状态信息和元数据。
+Bosun 的架构包括一个单一的服务器的二进制文件,一个诸如 OpenTSDB 的后端、Redis 以及 [scollector 代理][9]。 scollector 代理会自动检测主机上正在运行的服务,并反馈这些进程和其它的系统资源的情况。这些数据将发送到后端。随后 Bosun 的二进制服务文件会向后端发起查询,确定是否需要触发告警。也可以通过 [Grafana][10] 这些工具通过一个通用接口查询 Bosun 的底层后端。而 Redis 则用于存储 Bosun 的状态信息和元数据。
Bosun 有一个非常巧妙的功能,就是可以根据历史数据来测试告警。这是我几年前在使用 Prometheus 的时候就非常需要的功能,当时我有一个异常的数据需要产生告警,但没有一个可以用于测试的简便方法。为了确保告警能够正常触发,我不得不造出对应的数据来进行测试。而 Bosun 让这个步骤的耗时大大缩短。
-Bosun 更是涵盖了所有常用过的功能,包括简单的图形化表示和告警的创建。它还带有强大的用于编写告警规则的表达式语言。但 Bosun 默认只带有电子邮件通知配置和 HTTP 通知配置,因此如果需要连接到 Slack 或其它工具,就需要对配置作出更大程度的定制化。类似于 Prometheus,Bosun 还可以使用模板通知,你可以使用 HTML 和 CSS 来创建你所需要的电子邮件通知。
+Bosun 更是涵盖了所有常用过的功能,包括简单的图形化表示和告警的创建。它还带有强大的用于编写告警规则的表达式语言。但 Bosun 默认只带有电子邮件通知配置和 HTTP 通知配置,因此如果需要连接到 Slack 或其它工具,就需要对配置作出更大程度的定制化([其文档中有][11])。类似于 Prometheus,Bosun 还可以使用模板通知,你可以使用 HTML 和 CSS 来创建你所需要的电子邮件通知。
#### Cabot
-[Cabot][12] 由 [Arachnys][13] 公司开发。你或许对 Arachnys 公司并不了解,但它很有影响力:Arachnys 公司构建了一个基于云的先进解决方案,用于防范金融犯罪。在以前的公司,我也曾经参与过类似“[了解你的客户][14]”的工作。但大多数公司都认为与恐怖组织产生联系会造成相当不好的影响,因为恐怖组织可能会利用自己的系统来筹集资金。而这些解决方案将有助于防范欺诈类犯罪,尽管这类犯罪情节相对较轻,但仍然也会对机构产生风险。
+[Cabot][12] 由 [Arachnys][13] 公司开发。你或许对 Arachnys 公司并不了解,但它很有影响力:Arachnys 公司构建了一个基于云的先进解决方案,用于防范金融犯罪。在之前的公司时,我也曾经参与过类似“[了解你的客户][14](KYC)”的工作。大多数公司都认为与恐怖组织产生联系会造成相当不好的影响,因为恐怖组织可能会利用自己的系统来筹集资金。而这些解决方案将有助于防范欺诈类犯罪,尽管这类犯罪情节相对较轻,但仍然也会对机构产生风险。
-Arachnys 公司为什么要开发 Cabot 呢?其实只是因为 Arachnys 的开发人员对 [Nagios][15] 不太熟悉。Cabot 的出现对很多人来说都是一个好消息,它基于 Django 和 Bootstrap 开发,因此如果相对这个项目做出自己的贡献,门槛并不高。另外值得一提的是,Cabot 这个名字来源于开发者的狗。
+Arachnys 公司为什么要开发 Cabot 呢?其实只是因为 Arachnys 的开发人员对 [Nagios][15] 不太熟悉。Cabot 的出现对很多人来说都是一个好消息,它基于 Django 和 Bootstrap 开发,因此如果想对这个项目做出自己的贡献,门槛并不高。(另外值得一提的是,Cabot 这个名字来源于开发者的狗。)
-与 Bosun 类似,Cabot 也不对数据进行收集,而是使用监控对象的 API 提供的数据。因此,Cabot 告警的模式是 pull 而不是 push。它通过访问每个监控对象的 API,根据特定的指标检索所需的数据,然后将告警数据使用 Redis 缓存,进而持久化存储到 Postgres 数据库。
+与 Bosun 类似,Cabot 也不对数据进行收集,而是使用监控对象的 API 提供的数据。因此,Cabot 告警的模式是拉取而不是推送。它通过访问每个监控对象的 API,根据特定的指标检索所需的数据,然后将告警数据使用 Redis 缓存,进而持久化存储到 Postgres 数据库。
-Cabot 的一个较为少见的特点是,它原生支持 [Graphite][16],同时也支持 [Jenkins][17]。Jenkins 在这里被视为一个集中式的 cron,它会以对待故障的方式去对待构建失败的状况。构建失败当然没有系统故障那么紧急,但一旦出现构建失败,还是需要团队采取措施去处理,毕竟并不是每个人在收到构建失败的电子邮件时都会亲自去检查 Jenkins。
+Cabot 的一个较为少见的特点是,它原生支持 [Graphite][16],同时也支持 [Jenkins][17]。Jenkins 在这里被视为一个集中式的定时任务,它会以对待故障的方式去对待构建失败的状况。构建失败当然没有系统故障那么紧急,但一旦出现构建失败,还是需要团队采取措施去处理,毕竟并不是每个人在收到构建失败的电子邮件时都会亲自去检查 Jenkins。
Cabot 另一个有趣的功能是它可以接入 Google 日历安排值班人员,这个称为 Rota 的功能用处很大,希望其它告警系统也能加入类似的功能。Cabot 目前仅支持安排主备联系人,但还有继续改进的空间。它自己的文档也提到,如果需要全面的功能,更应该考虑付费的解决方案。
#### StatsAgg
-[Pearson][19] 作为一家开发了 [StatsAgg][18] 告警平台的出版公司,这是极为罕见的,当然也很值得敬佩。除此以外,Pearson 还运营着另外几个网站,以及和 [O'Reilly Media][20] 合资的企业。但我仍然会将它视为出版教学书籍的公司。
+[Pearson][19] 作为一家开发了 [StatsAgg][18] 告警平台的出版公司,这是极为罕见的,当然也很值得敬佩。除此以外,Pearson 还运营着另外几个网站以及和 [O'Reilly Media][20] 合资的企业。但我仍然会将它视为出版教学书籍的公司。
StatsAgg 除了是一个告警平台,还是一个指标聚合平台,甚至也有点类似其它系统的代理。StatsAgg 支持通过 Graphite、StatsD、InfluxDB 和 OpenTSDB 输入数据,也支持将其转发到各种平台。但随着中心服务的负载不断增加,风险也不断增大。尽管如此,如果 StatsAgg 的基础架构足够强壮,即使后端存储平台出现故障,也不会对它产生告警的过程造成影响。
@@ -108,15 +109,15 @@ StatsAgg 是用 Java 开发的,为了尽可能降低复杂性,它仅包括
#### Grafana
-[Grafana][10] 的知名度很高,它也被广泛采用。每当我需要用到数据面板的时候,我总是会想到它,因为它比我使用过的任何一款类似的产品都要好。Grafana 由 Torkel Ödegaard 在圣诞节期间开发,并在 2014 年 1 月发布。在短短几年之间,它已经有了长足的发展。Grafana 基于 Kibana 开发,Torkel 开启了新的分支并将其命名为 Grafana。
+[Grafana][10] 的知名度很高,它也被广泛采用。每当我需要用到数据面板的时候,我总是会想到它,因为它比我使用过的任何一款类似的产品都要好。Grafana 由 Torkel Ödegaard 开发的,像 Cabot 一样,也是在圣诞节期间开发的,并在 2014 年 1 月发布。在短短几年之间,它已经有了长足的发展。Grafana 基于 Kibana 开发,Torkel 开启了新的分支并将其命名为 Grafana。
-Grafana 着重体现了实用性已经数据呈现的美观性。它可以原生地从 Graphite、Elasticsearch、OpenTSDB、Prometheus 和 InfluxDB 收集数据。此外有一个 Grafana 商用版插件可以从更多数据源获取数据,尽管这个插件没有开源,但 Grafana 的生态系统提供的各种数据源已经足够了。
+Grafana 着重体现了实用性以及数据呈现的美观性。它天生就可以从 Graphite、Elasticsearch、OpenTSDB、Prometheus 和 InfluxDB 收集数据。此外有一个 Grafana 商用版插件可以从更多数据源获取数据,但是其他数据源插件也并非没有开源版本,Grafana 的插件生态系统已经提供了各种数据源。
-Grafana 提供了一个集系统各种数据于一身的平台。它通过 web 来展示数据,任何人都有机会访问到相关信息,因此需要使用身份验证来对访问进行限制。Grafana 还支持不同类型的可视化方式,包括集成告警可视化的功能。
+Grafana 能做什么呢?Grafana 提供了一个中心化的了解系统的方式。它通过 web 来展示数据,任何人都有机会访问到相关信息,当然也可以使用身份验证来对访问进行限制。Grafana 使用各种可视化方式来提供对系统一目了然的了解。Grafana 还支持不同类型的可视化方式,包括集成告警可视化的功能。
-现在你可以更直观地设置告警了。通过Grafana,可以查看图表,还可以设置系统性能下降触发告警的阈值,并告诉 Grafana 应该如何发送告警。这是一个对告警体系非常强大的补充。告警平台不一定会因此而被取代,但告警系统一定会由此得到更多启发和发展。
+现在你可以更直观地设置告警了。通过 Grafana,可以查看图表,还可以查看由于系统性能下降而触发告警的位置,单击要触发报警的位置,并告诉 Grafana 将告警发送何处。这是一个对告警平台非常强大的补充。告警平台不一定会因此而被取代,但告警系统一定会由此得到更多启发和发展。
-Grafana 还引入了很多团队协作的功能。不同用户之间能够共享数据面板,你不再需要为 [Kubernetes][21] 集群创建独立的数据面板,因为由 Kubernetes 开发者和 Grafana 开发者共同维护的一些数据面板已经可以即插即用。
+Grafana 还引入了很多团队协作的功能。不同用户之间能够共享数据面板,你不再需要为 [Kubernetes][21] 集群创建独立的数据面板,因为由 Kubernetes 开发者和 Grafana 开发者共同维护的一些数据面板已经可用了。
团队协作过程中一个重要的功能是注释。注释功能允许用户将上下文添加到图表当中,其他用户就可以通过上下文更直观地理解图表。当团队成员在处理某个事件,并且需要沟通和理解时,这个功能就十分重要了。将所有相关信息都放在需要的位置,可以让整个团队中快速达成共识。在团队需要调查故障原因和定位事件责任时,这个功能就可以发挥作用了。
@@ -131,7 +132,7 @@ via: https://opensource.com/article/18/10/alerting-and-visualization-tools-sysad
作者:[Dan Barker][a]
选题:[lujun9972][b]
译者:[HankChow](https://github.com/HankChow)
-校对:[校对者ID](https://github.com/校对者ID)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/published/20181014 How Lisp Became God-s Own Programming Language.md b/published/20181014 How Lisp Became God-s Own Programming Language.md
new file mode 100644
index 0000000000..017a67799f
--- /dev/null
+++ b/published/20181014 How Lisp Became God-s Own Programming Language.md
@@ -0,0 +1,186 @@
+Lisp 是怎么成为上帝的编程语言的
+======
+
+当程序员们谈论各类编程语言的相对优势时,他们通常会采用相当平淡的措词,就好像这些语言是一条工具带上的各种工具似的 —— 有适合写操作系统的,也有适合把其它程序黏在一起来完成特殊工作的。这种讨论方式非常合理;不同语言的能力不同。不声明特定用途就声称某门语言比其他语言更优秀只能导致侮辱性的无用争论。
+
+但有一门语言似乎受到和用途无关的特殊尊敬:那就是 Lisp。即使是恨不得给每个说出形如“某某语言比其他所有语言都好”这类话的人都来一拳的键盘远征军们,也会承认 Lisp 处于另一个层次。 Lisp 超越了用于评判其他语言的实用主义标准,因为普通程序员并不使用 Lisp 编写实用的程序 —— 而且,多半他们永远也不会这么做。然而,人们对 Lisp 的敬意是如此深厚,甚至于到了这门语言会时而被加上神话属性的程度。
+
+大家都喜欢的网络漫画合集 xkcd 就至少在两组漫画中如此描绘过 Lisp:[其中一组漫画][1]中,某人得到了某种 Lisp 启示,而这好像使他理解了宇宙的基本构架。
+
+
+
+在[另一组漫画][2]中,一个穿着长袍的老程序员给他的徒弟递了一沓圆括号,说这是“文明时代的优雅武器”,暗示着 Lisp 就像原力那样拥有各式各样的神秘力量。
+
+
+
+另一个绝佳例子是 Bob Kanefsky 的滑稽剧插曲,《上帝就在人间》。这部剧叫做《永恒之火》,撰写于 1990 年代中期;剧中描述了上帝必然是使用 Lisp 创造世界的种种原因。完整的歌词可以在 [GNU 幽默合集][3]中找到,如下是一段摘抄:
+
+> 因为上帝用祂的 Lisp 代码
+
+> 让树叶充满绿意。
+
+> 分形的花儿和递归的根:
+
+> 我见过的奇技淫巧之中没什么比这更可爱。
+
+> 当我对着雪花深思时,
+
+> 从未见过两片相同的,
+
+> 我知道,上帝偏爱那一门
+
+> 名字是四个字母的语言。
+
+(LCTT 译注:参见 “四个字母”,参见:[四字神名](https://zh.wikipedia.org/wiki/%E5%9B%9B%E5%AD%97%E7%A5%9E%E5%90%8D),致谢 [no1xsyzy](https://github.com/LCTT/TranslateProject/issues/11320))
+
+以下这句话我实在不好在人前说;不过,我还是觉得,这样一种 “Lisp 是奥术魔法”的文化模因实在是有史以来最奇异、最迷人的东西。Lisp 是象牙塔的产物,是人工智能研究的工具;因此,它对于编程界的俗人而言总是陌生的,甚至是带有神秘色彩的。然而,当今的程序员们[开始怂恿彼此,“在你死掉之前至少试一试 Lisp”][4],就像这是一种令人恍惚入迷的致幻剂似的。尽管 Lisp 是广泛使用的编程语言中第二古老的(只比 Fortran 年轻一岁)[^1] ,程序员们也仍旧在互相怂恿。想象一下,如果你的工作是为某种组织或者团队推广一门新的编程语言的话,忽悠大家让他们相信你的新语言拥有神力难道不是绝佳的策略吗?—— 但你如何能够做到这一点呢?或者,换句话说,一门编程语言究竟是如何变成人们口中“隐晦知识的载体”的呢?
+
+Lisp 究竟是怎么成为这样的?
+
+![Byte 杂志封面,1979年八月。][5]
+
+*Byte 杂志封面,1979年八月。*
+
+### 理论 A :公理般的语言
+
+Lisp 的创造者约翰·麦卡锡最初并没有想过把 Lisp 做成优雅、精炼的计算法则结晶。然而,在一两次运气使然的深谋远虑和一系列优化之后,Lisp 的确变成了那样的东西。 保罗·格雷厄姆(我们一会儿之后才会聊到他)曾经这么写道, 麦卡锡通过 Lisp “为编程作出的贡献就像是欧几里得对几何学所做的贡献一般” [^2]。人们可能会在 Lisp 中看出更加隐晦的含义 —— 因为麦卡锡创造 Lisp 时使用的要素实在是过于基础,基础到连弄明白他到底是创造了这门语言、还是发现了这门语言,都是一件难事。
+
+最初, 麦卡锡产生要造一门语言的想法,是在 1956 年的达特茅斯人工智能夏季研究项目上。夏季研究项目是个持续数周的学术会议,直到现在也仍旧在举行;它是此类会议之中最早开始举办的会议之一。 麦卡锡当初还是个达特茅斯的数学助教,而“人工智能(AI)”这个词事实上就是他建议举办该会议时发明的 [^3]。在整个会议期间大概有十人参加 [^4]。他们之中包括了艾伦·纽厄尔和赫伯特·西蒙,两名隶属于兰德公司和卡内基梅隆大学的学者。这两人不久之前设计了一门语言,叫做 IPL。
+
+当时,纽厄尔和西蒙正试图制作一套能够在命题演算中生成证明的系统。两人意识到,用电脑的原生指令集编写这套系统会非常困难;于是他们决定创造一门语言——他们的原话是“伪代码”,这样,他们就能更加轻松自然地表达这台“逻辑理论机器”的底层逻辑了 [^5]。这门语言叫做 IPL,即“信息处理语言”;比起我们现在认知中的编程语言,它更像是一种高层次的汇编语言方言。 纽厄尔和西蒙提到,当时人们开发的其它“伪代码”都抓着标准数学符号不放 —— 也许他们指的是 Fortran [^6];与此不同的是,他们的语言使用成组的符号方程来表示命题演算中的语句。通常,用 IPL 写出来的程序会调用一系列的汇编语言宏,以此在这些符号方程列表中对表达式进行变换和求值。
+
+麦卡锡认为,一门实用的编程语言应该像 Fortran 那样使用代数表达式;因此,他并不怎么喜欢 IPL [^7]。然而,他也认为,在给人工智能领域的一些问题建模时,符号列表会是非常好用的工具 —— 而且在那些涉及演绎的问题上尤其有用。麦卡锡的渴望最终被诉诸行动;他要创造一门代数的列表处理语言 —— 这门语言会像 Fortran 一样使用代数表达式,但拥有和 IPL 一样的符号列表处理能力。
+
+当然,今日的 Lisp 可不像 Fortran。在会议之后的几年中,麦卡锡关于“理想的列表处理语言”的见解似乎在逐渐演化。到 1957 年,他的想法发生了改变。他那时候正在用 Fortran 编写一个能下国际象棋的程序;越是长时间地使用 Fortran ,麦卡锡就越确信其设计中存在不当之处,而最大的问题就是尴尬的 `IF` 声明 [^8]。为此,他发明了一个替代品,即条件表达式 `true`;这个表达式会在给定的测试通过时返回子表达式 `A` ,而在测试未通过时返回子表达式 `B` ,*而且*,它只会对返回的子表达式进行求值。在 1958 年夏天,当麦卡锡设计一个能够求导的程序时,他意识到,他发明的 `true` 条件表达式让编写递归函数这件事变得更加简单自然了 [^9]。也是这个求导问题让麦卡锡创造了 `maplist` 函数;这个函数会将其它函数作为参数并将之作用于指定列表的所有元素 [^10]。在给项数多得叫人抓狂的多项式求导时,它尤其有用。
+
+然而,以上的所有这些,在 Fortran 中都是没有的;因此,在 1958 年的秋天,麦卡锡请来了一群学生来实现 Lisp。因为他那时已经成了一名麻省理工助教,所以,这些学生可都是麻省理工的学生。当麦卡锡和学生们最终将他的主意变为能运行的代码时,这门语言得到了进一步的简化。这之中最大的改变涉及了 Lisp 的语法本身。最初,麦卡锡在设计语言时,曾经试图加入所谓的 “M 表达式”;这是一层语法糖,能让 Lisp 的语法变得类似于 Fortran。虽然 M 表达式可以被翻译为 S 表达式 —— 基础的、“用圆括号括起来的列表”,也就是 Lisp 最著名的特征 —— 但 S 表达式事实上是一种给机器看的低阶表达方法。唯一的问题是,麦卡锡用方括号标记 M 表达式,但他的团队在麻省理工使用的 IBM 026 键盘打孔机的键盘上根本没有方括号 [^11]。于是 Lisp 团队坚定不移地使用着 S 表达式,不仅用它们表示数据列表,也拿它们来表达函数的应用。麦卡锡和他的学生们还作了另外几样改进,包括将数学符号前置;他们也修改了内存模型,这样 Lisp 实质上就只有一种数据类型了 [^12]。
+
+到 1960 年,麦卡锡发表了他关于 Lisp 的著名论文,《用符号方程表示的递归函数及它们的机器计算》。那时候,Lisp 已经被极大地精简,而这让麦卡锡意识到,他的作品其实是“一套优雅的数学系统”,而非普通的编程语言 [^13]。他后来这么写道,对 Lisp 的许多简化使其“成了一种描述可计算函数的方式,而且它比图灵机或者一般情况下用于递归函数理论的递归定义更加简洁” [^14]。在他的论文中,他不仅使用 Lisp 作为编程语言,也将它当作一套用于研究递归函数行为方式的表达方法。
+
+通过“从一小撮规则中逐步实现出 Lisp”的方式,麦卡锡将这门语言介绍给了他的读者。后来,保罗·格雷厄姆在短文《[Lisp 之根][6]》中用更易读的语言回顾了麦卡锡的步骤。格雷厄姆只用了七种原始运算符、两种函数写法,以及使用原始运算符定义的六个稍微高级一点的函数来解释 Lisp。毫无疑问,Lisp 的这种只需使用极少量的基本规则就能完整说明的特点加深了其神秘色彩。格雷厄姆称麦卡锡的论文为“使计算公理化”的一种尝试 [^15]。我认为,在思考 Lisp 的魅力从何而来时,这是一个极好的切入点。其它编程语言都有明显的人工构造痕迹,表现为 `While`,`typedef`,`public static void` 这样的关键词;而 Lisp 的设计却简直像是纯粹计算逻辑的鬼斧神工。Lisp 的这一性质,以及它和晦涩难懂的“递归函数理论”的密切关系,使它具备了获得如今声望的充分理由。
+
+### 理论 B:属于未来的机器
+
+Lisp 诞生二十年后,它成了著名的《[黑客词典][7]》中所说的,人工智能研究的“母语”。Lisp 在此之前传播迅速,多半是托了语法规律的福 —— 不管在怎么样的电脑上,实现 Lisp 都是一件相对简单直白的事。而学者们之后坚持使用它乃是因为 Lisp 在处理符号表达式这方面有巨大的优势;在那个时代,人工智能很大程度上就意味着符号,于是这一点就显得十分重要。在许多重要的人工智能项目中都能见到 Lisp 的身影。这些项目包括了 [SHRDLU 自然语言程序][8]、[Macsyma 代数系统][9] 和 [ACL2 逻辑系统][10]。
+
+然而,在 1970 年代中期,人工智能研究者们的电脑算力开始不够用了。PDP-10 就是一个典型。这个型号在人工智能学界曾经极受欢迎;但面对这些用 Lisp 写的 AI 程序,它的 18 位地址空间一天比一天显得吃紧 [^16]。许多的 AI 程序在设计上可以与人互动。要让这些既极度要求硬件性能、又有互动功能的程序在分时系统上优秀发挥,是很有挑战性的。麻省理工的彼得·杜奇给出了解决方案:那就是针对 Lisp 程序来特别设计电脑。就像是我那[关于 Chaosnet 的上一篇文章][11]所说的那样,这些Lisp 计算机会给每个用户都专门分配一个为 Lisp 特别优化的处理器。到后来,考虑到硬核 Lisp 程序员的需求,这些计算机甚至还配备上了完全由 Lisp 编写的开发环境。在当时那样一个小型机时代已至尾声而微型机的繁盛尚未完全到来的尴尬时期,Lisp 计算机就是编程精英们的“高性能个人电脑”。
+
+有那么一会儿,Lisp 计算机被当成是未来趋势。好几家公司雨后春笋般出现,追着赶着要把这项技术商业化。其中最成功的一家叫做 Symbolics,由麻省理工 AI 实验室的前成员创立。上世纪八十年代,这家公司生产了所谓的 3600 系列计算机,它们当时在 AI 领域和需要高性能计算的产业中应用极广。3600 系列配备了大屏幕、位图显示、鼠标接口,以及[强大的图形与动画软件][12]。它们都是惊人的机器,能让惊人的程序运行起来。例如,之前在推特上跟我聊过的机器人研究者 Bob Culley,就能用一台 1985 年生产的 Symbolics 3650 写出带有图形演示的寻路算法。他向我解释说,在 1980 年代,位图显示和面向对象编程(能够通过 [Flavors 扩展][13]在 Lisp 计算机上使用)都刚刚出现。Symbolics 站在时代的最前沿。
+
+![Bob Culley 的寻路程序。][14]
+
+*Bob Culley 的寻路程序。*
+
+而以上这一切导致 Symbolics 的计算机奇贵无比。在 1983 年,一台 Symbolics 3600 能卖 111,000 美金 [^16]。所以,绝大部分人只可能远远地赞叹 Lisp 计算机的威力和操作员们用 Lisp 编写程序的奇妙技术。不止他们赞叹,从 1979 年到 1980 年代末,Byte 杂志曾经多次提到过 Lisp 和 Lisp 计算机。在 1979 年八月发行的、关于 Lisp 的一期特别杂志中,杂志编辑激情洋溢地写道,麻省理工正在开发的计算机配备了“大坨大坨的内存”和“先进的操作系统” [^17];他觉得,这些 Lisp 计算机的前途是如此光明,以至于它们的面世会让 1978 和 1977 年 —— 诞生了 Apple II、Commodore PET 和 TRS-80 的两年 —— 显得黯淡无光。五年之后,在 1985 年,一名 Byte 杂志撰稿人描述了为“复杂精巧、性能强悍的 Symbolics 3670”编写 Lisp 程序的体验,并力劝读者学习 Lisp,称其为“绝大数人工智能工作者的语言选择”,和将来的通用编程语言 [^18]。
+
+我问过保罗·麦克琼斯(他在山景城的计算机历史博物馆Computer History Museum做了许多 Lisp 的[保护工作][15]),人们是什么时候开始将 Lisp 当作高维生物的赠礼一样谈论的呢?他说,这门语言自有的性质毋庸置疑地促进了这种现象的产生;然而,他也说,Lisp 上世纪六七十年代在人工智能领域得到的广泛应用,很有可能也起到了作用。当 1980 年代到来、Lisp 计算机进入市场时,象牙塔外的某些人由此接触到了 Lisp 的能力,于是传说开始滋生。时至今日,很少有人还记得 Lisp 计算机和 Symbolics 公司;但 Lisp 得以在八十年代一直保持神秘,很大程度上要归功于它们。
+
+### 理论 C:学习编程
+
+1985 年,两位麻省理工的教授,哈尔·阿伯尔森Harold "Hal" Abelson和杰拉尔德·瑟斯曼Gerald Sussman,外加瑟斯曼的妻子朱莉·瑟斯曼Julie Sussman,出版了一本叫做《计算机程序的构造和解释Structure and Interpretation of Computer Programs》的教科书。这本书用 Scheme(一种 Lisp 方言)向读者们示范了如何编程。它被用于教授麻省理工入门编程课程长达二十年之久。出于直觉,我认为 SICP(这本书的名字通常缩写为 SICP)倍增了 Lisp 的“神秘要素”。SICP 使用 Lisp 描绘了深邃得几乎可以称之为哲学的编程理念。这些理念非常普适,可以用任意一种编程语言展现;但 SICP 的作者们选择了 Lisp。结果,这本阴阳怪气、卓越不凡、吸引了好几代程序员(还成了一种[奇特的模因][16])的著作臭名远扬之后,Lisp 的声望也顺带被提升了。Lisp 已不仅仅是一如既往的“麦卡锡的优雅表达方式”;它现在还成了“向你传授编程的不传之秘的语言”。
+
+SICP 究竟有多奇怪这一点值得好好说;因为我认为,时至今日,这本书的古怪之处和 Lisp 的古怪之处是相辅相成的。书的封面就透着一股古怪。那上面画着一位朝着桌子走去,准备要施法的巫师或者炼金术士。他的一只手里抓着一副测径仪 —— 或者圆规,另一只手上拿着个球,上书“eval”和“apply”。他对面的女人指着桌子;在背景中,希腊字母 λ (lambda)漂浮在半空,释放出光芒。
+
+![SICP 封面上的画作][17]
+
+*SICP 封面上的画作。*
+
+说真的,这上面画的究竟是怎么一回事?为什么桌子会长着动物的腿?为什么这个女人指着桌子?墨水瓶又是干什么用的?我们是不是该说,这位巫师已经破译了宇宙的隐藏奥秘,而所有这些奥秘就蕴含在 eval/apply 循环和 Lambda 演算之中?看似就是如此。单单是这张图片,就一定对人们如今谈论 Lisp 的方式产生了难以计量的影响。
+
+然而,这本书的内容通常并不比封面正常多少。SICP 跟你读过的所有计算机科学教科书都不同。在引言中,作者们表示,这本书不只教你怎么用 Lisp 编程 —— 它是关于“现象的三个焦点:人的心智、复数的计算机程序,和计算机”的作品 [^19]。在之后,他们对此进行了解释,描述了他们对如下观点的坚信:编程不该被当作是一种计算机科学的训练,而应该是“程序性认识论procedural epistemology”的一种新表达方式 [^20]。程序是将那些偶然被送入计算机的思想组织起来的全新方法。这本书的第一章简明地介绍了 Lisp,但是之后的绝大部分都在讲述更加抽象的概念。其中包括了对不同编程范式的讨论,对于面向对象系统中“时间”和“一致性”的讨论;在书中的某一处,还有关于通信的基本限制可能会如何带来同步问题的讨论 —— 而这些基本限制在通信中就像是光速不变在相对论中一样关键 [^21]。都是些高深难懂的东西。
+
+以上这些并不是说这是本糟糕的书;这本书其实棒极了。在我读过的所有作品中,这本书对于重要的编程理念的讨论是最为深刻的;那些理念我琢磨了很久,却一直无力用文字去表达。一本入门编程教科书能如此迅速地开始描述面向对象编程的根本缺陷,和函数式语言“将可变状态降到最少”的优点,实在是一件让人印象深刻的事。而这种描述之后变为了另一种震撼人心的讨论:某种(可能类似于今日的 [RxJS][18] 的)流范式能如何同时具备两者的优秀特性。SICP 用和当初麦卡锡的 Lisp 论文相似的方式提纯出了高级程序设计的精华。你读完这本书之后,会立即想要将它推荐给你的程序员朋友们;如果他们找到这本书,看到了封面,但最终没有阅读的话,他们就只会记住长着动物腿的桌子上方那神秘的、根本的、给予魔法师特殊能力的、写着 eval/apply 的东西。话说回来,书上这两人的鞋子也让我印象颇深。
+
+然而,SICP 最重要的影响恐怕是,它将 Lisp 由一门怪语言提升成了必要的教学工具。在 SICP 面世之前,人们互相推荐 Lisp,以学习这门语言为提升编程技巧的途径。1979 年的 Byte 杂志 Lisp 特刊印证了这一事实。之前提到的那位编辑不仅就麻省理工的新 Lisp 计算机大书特书,还说,Lisp 这门语言值得一学,因为它“代表了分析问题的另一种视角” [^22]。但 SICP 并未只把 Lisp 作为其它语言的陪衬来使用;SICP 将其作为*入门*语言。这就暗含了一种论点,那就是,Lisp 是最能把握计算机编程基础的语言。可以认为,如今的程序员们彼此怂恿“在死掉之前至少试试 Lisp”的时候,他们很大程度上是因为 SICP 才这么说的。毕竟,编程语言 [Brainfuck][19] 想必同样也提供了“分析问题的另一种视角”;但人们学习 Lisp 而非学习 Brainfuck,那是因为他们知道,前者的那种 Lisp 视角在二十年中都被看作是极其有用的,有用到麻省理工在给他们的本科生教其它语言之前,必然会先教 Lisp。
+
+### Lisp 的回归
+
+在 SICP 出版的同一年,本贾尼·斯特劳斯特卢普Bjarne Stroustrup发布了 C++ 语言的首个版本,它将面向对象编程带到了大众面前。几年之后,Lisp 计算机的市场崩盘,AI 寒冬开始了。在下一个十年的变革中, C++ 和后来的 Java 成了前途无量的语言,而 Lisp 被冷落,无人问津。
+
+理所当然地,确定人们对 Lisp 重新燃起热情的具体时间并不可能;但这多半是保罗·格雷厄姆发表他那几篇声称 Lisp 是首选入门语言的短文之后的事了。保罗·格雷厄姆是 Y-Combinator 的联合创始人和《Hacker News》的创始者,他这几篇短文有很大的影响力。例如,在短文《[胜于平庸][20]Beating the Averages》中,他声称 Lisp 宏使 Lisp 比其它语言更强。他说,因为他在自己创办的公司 Viaweb 中使用 Lisp,他得以比竞争对手更快地推出新功能。至少,[一部分程序员][21]被说服了。然而,庞大的主流程序员群体并未换用 Lisp。
+
+实际上出现的情况是,Lisp 并未流行,但越来越多 Lisp 式的特性被加入到广受欢迎的语言中。Python 有了列表推导式。C# 有了 Linq。Ruby……嗯,[Ruby 是 Lisp 的一种][22]。就如格雷厄姆之前在 2001 年提到的那样,“在一系列常用语言中所体现出的‘默认语言’正越发朝着 Lisp 的方向演化” [^23]。尽管其它语言变得越来越像 Lisp,Lisp 本身仍然保留了其作为“很少人了解但是大家都该学的神秘语言”的特殊声望。在 1980 年,Lisp 的诞生二十周年纪念日上,麦卡锡写道,Lisp 之所以能够存活这么久,是因为它具备“编程语言领域中的某种近似局部最优” [^24]。这句话并未充分地表明 Lisp 的真正影响力。Lisp 能够存活超过半个世纪之久,并非因为程序员们一年年地勉强承认它就是最好的编程工具;事实上,即使绝大多数程序员根本不用它,它还是存活了下来。多亏了它的起源和它的人工智能研究用途,说不定还要多亏 SICP 的遗产,Lisp 一直都那么让人着迷。在我们能够想象上帝用其它新的编程语言创造世界之前,Lisp 都不会走下神坛。
+
+--------------------------------------------------------------------------------
+
+[^1]: John McCarthy, “History of Lisp”, 14, Stanford University, February 12, 1979, accessed October 14, 2018, http://jmc.stanford.edu/articles/lisp/lisp.pdf
+
+[^2]: Paul Graham, “The Roots of Lisp”, 1, January 18, 2002, accessed October 14, 2018, http://languagelog.ldc.upenn.edu/myl/llog/jmc.pdf.
+
+[^3]: Martin Childs, “John McCarthy: Computer scientist known as the father of AI”, The Independent, November 1, 2011, accessed on October 14, 2018, https://www.independent.co.uk/news/obituaries/john-mccarthy-computer-scientist-known-as-the-father-of-ai-6255307.html.
+
+[^4]: Lisp Bulletin History. http://www.artinfo-musinfo.org/scans/lb/lb3f.pdf
+
+[^5]: Allen Newell and Herbert Simon, “Current Developments in Complex Information Processing,” 19, May 1, 1956, accessed on October 14, 2018, http://bitsavers.org/pdf/rand/ipl/P-850_Current_Developments_In_Complex_Information_Processing_May56.pdf.
+
+[^6]: ibid.
+
+[^7]: Herbert Stoyan, “Lisp History”, 43, Lisp Bulletin #3, December 1979, accessed on October 14, 2018, http://www.artinfo-musinfo.org/scans/lb/lb3f.pdf
+
+[^8]: McCarthy, “History of Lisp”, 5.
+
+[^9]: ibid.
+
+[^10]: McCarthy “History of Lisp”, 6.
+
+[^11]: Stoyan, “Lisp History”, 45
+
+[^12]: McCarthy, “History of Lisp”, 8.
+
+[^13]: McCarthy, “History of Lisp”, 2.
+
+[^14]: McCarthy, “History of Lisp”, 8.
+
+[^15]: Graham, “The Roots of Lisp”, 11.
+
+[^16]: Guy Steele and Richard Gabriel, “The Evolution of Lisp”, 22, History of Programming Languages 2, 1993, accessed on October 14, 2018, http://www.dreamsongs.com/Files/HOPL2-Uncut.pdf. 2
+
+[^17]: Carl Helmers, “Editorial”, Byte Magazine, 154, August 1979, accessed on October 14, 2018, https://archive.org/details/byte-magazine-1979-08/page/n153.
+
+[^18]: Patrick Winston, “The Lisp Revolution”, 209, April 1985, accessed on October 14, 2018, https://archive.org/details/byte-magazine-1985-04/page/n207.
+
+[^19]: Harold Abelson, Gerald Jay. Sussman, and Julie Sussman, Structure and Interpretation of Computer Programs (Cambridge, Mass: MIT Press, 2010), xiii.
+
+[^20]: Abelson, xxiii.
+
+[^21]: Abelson, 428.
+
+[^22]: Helmers, 7.
+
+[^23]: Paul Graham, “What Made Lisp Different”, December 2001, accessed on October 14, 2018, http://www.paulgraham.com/diff.html.
+
+[^24]: John McCarthy, “Lisp—Notes on its past and future”, 3, Stanford University, 1980, accessed on October 14, 2018, http://jmc.stanford.edu/articles/lisp20th/lisp20th.pdf.
+
+via: https://twobithistory.org/2018/10/14/lisp.html
+
+作者:[Two-Bit History][a]
+选题:[lujun9972][b]
+译者:[Northurland](https://github.com/Northurland)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://twobithistory.org
+[b]: https://github.com/lujun9972
+[1]: https://xkcd.com/224/
+[2]: https://xkcd.com/297/
+[3]: https://www.gnu.org/fun/jokes/eternal-flame.en.html
+[4]: https://www.reddit.com/r/ProgrammerHumor/comments/5c14o6/xkcd_lisp/d9szjnc/
+[5]: https://twobithistory.org/images/byte_lisp.jpg
+[6]: http://languagelog.ldc.upenn.edu/myl/llog/jmc.pdf
+[7]: https://en.wikipedia.org/wiki/Jargon_File
+[8]: https://hci.stanford.edu/winograd/shrdlu/
+[9]: https://en.wikipedia.org/wiki/Macsyma
+[10]: https://en.wikipedia.org/wiki/ACL2
+[11]: https://twobithistory.org/2018/09/30/chaosnet.html
+[12]: https://youtu.be/gV5obrYaogU?t=201
+[13]: https://en.wikipedia.org/wiki/Flavors_(programming_language)
+[14]: https://twobithistory.org/images/symbolics.jpg
+[15]: http://www.softwarepreservation.org/projects/LISP/
+[16]: https://knowyourmeme.com/forums/meme-research/topics/47038-structure-and-interpretation-of-computer-programs-hugeass-image-dump-for-evidence
+[17]: https://twobithistory.org/images/sicp.jpg
+[18]: https://rxjs-dev.firebaseapp.com/
+[19]: https://en.wikipedia.org/wiki/Brainfuck
+[20]: http://www.paulgraham.com/avg.html
+[21]: https://web.archive.org/web/20061004035628/http://wiki.alu.org/Chris-Perkins
+[22]: http://www.randomhacks.net/2005/12/03/why-ruby-is-an-acceptable-lisp/
diff --git a/published/20181015 How to Enable or Disable Services on Boot in Linux Using chkconfig and systemctl Command.md b/published/20181015 How to Enable or Disable Services on Boot in Linux Using chkconfig and systemctl Command.md
new file mode 100644
index 0000000000..01bdffbafd
--- /dev/null
+++ b/published/20181015 How to Enable or Disable Services on Boot in Linux Using chkconfig and systemctl Command.md
@@ -0,0 +1,247 @@
+如何使用 chkconfig 和 systemctl 命令启用或禁用 Linux 服务
+======
+
+对于 Linux 管理员来说这是一个重要(美妙)的话题,所以每个人都必须知道,并练习怎样才能更高效的使用它们。
+
+在 Linux 中,无论何时当你安装任何带有服务和守护进程的包,系统默认会把这些服务的初始化及 systemd 脚本添加进去,不过此时它们并没有被启用。
+
+我们需要手动的开启或者关闭那些服务。Linux 中有三个著名的且一直在被使用的初始化系统。
+
+### 什么是初始化系统?
+
+在以 Linux/Unix 为基础的操作系统上,`init` (初始化的简称) 是内核引导系统启动过程中第一个启动的进程。
+
+`init` 的进程 id (pid)是 1,除非系统关机否则它将会一直在后台运行。
+
+`init` 首先根据 `/etc/inittab` 文件决定 Linux 运行的级别,然后根据运行级别在后台启动所有其他进程和应用程序。
+
+BIOS、MBR、GRUB 和内核程序在启动 `init` 之前就作为 Linux 的引导程序的一部分开始工作了。
+
+下面是 Linux 中可以使用的运行级别(从 0~6 总共七个运行级别):
+
+ * `0`:关机
+ * `1`:单用户模式
+ * `2`:多用户模式(没有NFS)
+ * `3`:完全的多用户模式
+ * `4`:系统未使用
+ * `5`:图形界面模式
+ * `6`:重启
+
+下面是 Linux 系统中最常用的三个初始化系统:
+
+ * System V(Sys V)
+ * Upstart
+ * systemd
+
+### 什么是 System V(Sys V)?
+
+System V(Sys V)是类 Unix 系统第一个也是传统的初始化系统。`init` 是内核引导系统启动过程中第一支启动的程序,它是所有程序的父进程。
+
+大部分 Linux 发行版最开始使用的是叫作 System V(Sys V)的传统的初始化系统。在过去的几年中,已经发布了好几个初始化系统以解决标准版本中的设计限制,例如:launchd、Service Management Facility、systemd 和 Upstart。
+
+但是 systemd 已经被几个主要的 Linux 发行版所采用,以取代传统的 SysV 初始化系统。
+
+### 什么是 Upstart?
+
+Upstart 是一个基于事件的 `/sbin/init` 守护进程的替代品,它在系统启动过程中处理任务和服务的启动,在系统运行期间监视它们,在系统关机的时候关闭它们。
+
+它最初是为 Ubuntu 而设计,但是它也能够完美的部署在其他所有 Linux系统中,用来代替古老的 System-V。
+
+Upstart 被用于 Ubuntu 从 9.10 到 Ubuntu 14.10 和基于 RHEL 6 的系统,之后它被 systemd 取代。
+
+### 什么是 systemd?
+
+systemd 是一个新的初始化系统和系统管理器,它被用于所有主要的 Linux 发行版,以取代传统的 SysV 初始化系统。
+
+systemd 兼容 SysV 和 LSB 初始化脚本。它可以直接替代 SysV 初始化系统。systemd 是被内核启动的第一个程序,它的 PID 是 1。
+
+systemd 是所有程序的父进程,Fedora 15 是第一个用 systemd 取代 upstart 的发行版。`systemctl` 用于命令行,它是管理 systemd 的守护进程/服务的主要工具,例如:(开启、重启、关闭、启用、禁用、重载和状态)
+
+systemd 使用 .service 文件而不是 bash 脚本(SysVinit 使用的)。systemd 将所有守护进程添加到 cgroups 中排序,你可以通过浏览 `/cgroup/systemd` 文件查看系统等级。
+
+### 如何使用 chkconfig 命令启用或禁用引导服务?
+
+`chkconfig` 实用程序是一个命令行工具,允许你在指定运行级别下启动所选服务,以及列出所有可用服务及其当前设置。
+
+此外,它还允许我们从启动中启用或禁用服务。前提是你有超级管理员权限(root 或者 `sudo`)运行这个命令。
+
+所有的服务脚本位于 `/etc/rd.d/init.d`文件中
+
+### 如何列出运行级别中所有的服务
+
+`--list` 参数会展示所有的服务及其当前状态(启用或禁用服务的运行级别):
+
+```
+# chkconfig --list
+NetworkManager 0:off 1:off 2:on 3:on 4:on 5:on 6:off
+abrt-ccpp 0:off 1:off 2:off 3:on 4:off 5:on 6:off
+abrtd 0:off 1:off 2:off 3:on 4:off 5:on 6:off
+acpid 0:off 1:off 2:on 3:on 4:on 5:on 6:off
+atd 0:off 1:off 2:off 3:on 4:on 5:on 6:off
+auditd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
+.
+.
+```
+
+### 如何查看指定服务的状态
+
+如果你想查看运行级别下某个服务的状态,你可以使用下面的格式匹配出需要的服务。
+
+比如说我想查看运行级别中 `auditd` 服务的状态
+
+```
+# chkconfig --list| grep auditd
+auditd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
+```
+
+### 如何在指定运行级别中启用服务
+
+使用 `--level` 参数启用指定运行级别下的某个服务,下面展示如何在运行级别 3 和运行级别 5 下启用 `httpd` 服务。
+
+
+```
+# chkconfig --level 35 httpd on
+```
+
+### 如何在指定运行级别下禁用服务
+
+同样使用 `--level` 参数禁用指定运行级别下的服务,下面展示的是在运行级别 3 和运行级别 5 中禁用 `httpd` 服务。
+
+```
+# chkconfig --level 35 httpd off
+```
+
+### 如何将一个新服务添加到启动列表中
+
+`-–add` 参数允许我们添加任何新的服务到启动列表中,默认情况下,新添加的服务会在运行级别 2、3、4、5 下自动开启。
+
+```
+# chkconfig --add nagios
+```
+
+### 如何从启动列表中删除服务
+
+可以使用 `--del` 参数从启动列表中删除服务,下面展示的是如何从启动列表中删除 Nagios 服务。
+
+```
+# chkconfig --del nagios
+```
+
+### 如何使用 systemctl 命令启用或禁用开机自启服务?
+
+`systemctl` 用于命令行,它是一个用来管理 systemd 的守护进程/服务的基础工具,例如:(开启、重启、关闭、启用、禁用、重载和状态)。
+
+所有服务创建的 unit 文件位与 `/etc/systemd/system/`。
+
+### 如何列出全部的服务
+
+使用下面的命令列出全部的服务(包括启用的和禁用的)。
+
+```
+# systemctl list-unit-files --type=service
+UNIT FILE STATE
+arp-ethers.service disabled
+auditd.service enabled
+autovt@.service enabled
+blk-availability.service disabled
+brandbot.service static
+chrony-dnssrv@.service static
+chrony-wait.service disabled
+chronyd.service enabled
+cloud-config.service enabled
+cloud-final.service enabled
+cloud-init-local.service enabled
+cloud-init.service enabled
+console-getty.service disabled
+console-shell.service disabled
+container-getty@.service static
+cpupower.service disabled
+crond.service enabled
+.
+.
+150 unit files listed.
+```
+
+使用下面的格式通过正则表达式匹配出你想要查看的服务的当前状态。下面是使用 `systemctl` 命令查看 `httpd` 服务的状态。
+
+```
+# systemctl list-unit-files --type=service | grep httpd
+httpd.service disabled
+```
+
+### 如何让指定的服务开机自启
+
+使用下面格式的 `systemctl` 命令启用一个指定的服务。启用服务将会创建一个符号链接,如下可见:
+
+```
+# systemctl enable httpd
+Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
+```
+
+运行下列命令再次确认服务是否被启用。
+
+```
+# systemctl is-enabled httpd
+enabled
+```
+
+### 如何禁用指定的服务
+
+运行下面的命令禁用服务将会移除你启用服务时所创建的符号链接。
+
+```
+# systemctl disable httpd
+Removed symlink /etc/systemd/system/multi-user.target.wants/httpd.service.
+```
+
+运行下面的命令再次确认服务是否被禁用。
+
+```
+# systemctl is-enabled httpd
+disabled
+```
+
+### 如何查看系统当前的运行级别
+
+使用 `systemctl` 命令确认你系统当前的运行级别,`runlevel` 命令仍然可在 systemd 下工作,不过,运行级别对于 systemd 来说是一个历史遗留的概念。所以我建议你全部使用 `systemctl` 命令。
+
+我们当前处于运行级别 3, 它等同于下面显示的 `multi-user.target`。
+
+```
+# systemctl list-units --type=target
+UNIT LOAD ACTIVE SUB DESCRIPTION
+basic.target loaded active active Basic System
+cloud-config.target loaded active active Cloud-config availability
+cryptsetup.target loaded active active Local Encrypted Volumes
+getty.target loaded active active Login Prompts
+local-fs-pre.target loaded active active Local File Systems (Pre)
+local-fs.target loaded active active Local File Systems
+multi-user.target loaded active active Multi-User System
+network-online.target loaded active active Network is Online
+network-pre.target loaded active active Network (Pre)
+network.target loaded active active Network
+paths.target loaded active active Paths
+remote-fs.target loaded active active Remote File Systems
+slices.target loaded active active Slices
+sockets.target loaded active active Sockets
+swap.target loaded active active Swap
+sysinit.target loaded active active System Initialization
+timers.target loaded active active Timers
+```
+
+--------------------------------------------------------------------------------
+
+
+via: https://www.2daygeek.com/how-to-enable-or-disable-services-on-boot-in-linux-using-chkconfig-and-systemctl-command/
+
+
+作者:[Prakash Subramanian][a]
+选题:[lujun9972][b]
+译者:[way-ww](https://github.com/way-ww)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+
+[a]: https://www.2daygeek.com/author/prakash/
+[b]: https://github.com/lujun9972
diff --git a/translated/tech/20181017 Chrony - An Alternative NTP Client And Server For Unix-like Systems.md b/published/20181017 Chrony - An Alternative NTP Client And Server For Unix-like Systems.md
similarity index 75%
rename from translated/tech/20181017 Chrony - An Alternative NTP Client And Server For Unix-like Systems.md
rename to published/20181017 Chrony - An Alternative NTP Client And Server For Unix-like Systems.md
index 1245f2f5f0..b33670d461 100644
--- a/translated/tech/20181017 Chrony - An Alternative NTP Client And Server For Unix-like Systems.md
+++ b/published/20181017 Chrony - An Alternative NTP Client And Server For Unix-like Systems.md
@@ -1,9 +1,9 @@
-Chrony – 一个类 Unix 系统可选的 NTP 客户端和服务器
+Chrony:一个类 Unix 系统上 NTP 客户端和服务器替代品
======

-在这个教程中,我们会讨论如何安装和配置 **Chrony**,一个类 Unix 系统上可选的 NTP 客户端和服务器。Chrony 可以更快的同步系统时钟,具有更好的时钟准确度,并且它对于那些不是一直在线的系统很有帮助。Chrony 是免费、开源的,并且支持 GNU/Linux 和 BSD 衍生版比如 FreeBSD,NetBSD,macOS 和 Solaris 等。
+在这个教程中,我们会讨论如何安装和配置 **Chrony**,一个类 Unix 系统上 NTP 客户端和服务器的替代品。Chrony 可以更快的同步系统时钟,具有更好的时钟准确度,并且它对于那些不是一直在线的系统很有帮助。Chrony 是自由开源的,并且支持 GNU/Linux 和 BSD 衍生版(比如 FreeBSD、NetBSD)、macOS 和 Solaris 等。
### 安装 Chrony
@@ -13,7 +13,7 @@ Chrony 可以从大多数 Linux 发行版的默认软件库中获得。如果你
$ sudo pacman -S chrony
```
-在 Debian,Ubuntu,Linux Mint 上:
+在 Debian、Ubuntu、Linux Mint 上:
```
$ sudo apt-get install chrony
@@ -25,7 +25,7 @@ $ sudo apt-get install chrony
$ sudo dnf install chrony
```
-当安装完成后,如果之前没有启动过的话需启动 **chronyd.service** 守护进程:
+当安装完成后,如果之前没有启动过的话需启动 `chronyd.service` 守护进程:
```
$ sudo systemctl start chronyd.service
@@ -37,7 +37,7 @@ $ sudo systemctl start chronyd.service
$ sudo systemctl enable chronyd.service
```
-为了确认 Chronyd.service 已经启动,运行:
+为了确认 `chronyd.service` 已经启动,运行:
```
$ sudo systemctl status chronyd.service
@@ -71,7 +71,7 @@ Oct 17 10:35:06 ubuntuserver chronyd[2482]: Selected source 106.10.186.200
### 配置 Chrony
-NTP 客户端需要知道它要连接到哪个 NTP 服务器来获取当前时间。我们可以直接在 NTP 配置文件中的 **server** 或者 **pool** 项指定 NTP 服务器。通常,默认的配置文件位于 **/etc/chrony/chrony.conf** 或者 **/etc/chrony.conf**,取决于 Linux 发行版版本。为了更可靠的时间同步,建议指定至少三个服务器。
+NTP 客户端需要知道它要连接到哪个 NTP 服务器来获取当前时间。我们可以直接在该 NTP 配置文件中的 `server` 或者 `pool` 项指定 NTP 服务器。通常,默认的配置文件位于 `/etc/chrony/chrony.conf` 或者 `/etc/chrony.conf`,取决于 Linux 发行版版本。为了更可靠的同步时间,建议指定至少三个服务器。
下面几行是我的 Ubuntu 18.04 LTS 服务器上的一个示例。
@@ -87,19 +87,19 @@ pool 2.ubuntu.pool.ntp.org iburst maxsources 2
[...]
```
-从上面的输出中你可以看到,[**NTP Pool Project**][1] 已经被设置成为了默认的时间服务器。对于那些好奇的人,NTP Pool project 是一个时间服务器集群,用来为全世界千万个客户端提供 NTP 服务。它是 Ubuntu 以及其他主流 Linux 发行版的默认时间服务器。
+从上面的输出中你可以看到,[NTP 服务器池项目][1] 已经被设置成为了默认的时间服务器。对于那些好奇的人,NTP 服务器池项目是一个时间服务器集群,用来为全世界千万个客户端提供 NTP 服务。它是 Ubuntu 以及其他主流 Linux 发行版的默认时间服务器。
在这里,
- * **iburst** 选项用来加速初始的同步过程
- * **maxsources** 代表 NTP 源的最大数量
+ * `iburst` 选项用来加速初始的同步过程
+ * `maxsources` 代表 NTP 源的最大数量
请确保你选择的 NTP 服务器是同步的、稳定的、离你的位置较近的,以便使用这些 NTP 源来提升时间准确度。
### 在命令行中管理 Chronyd
-Chrony 有一个命令行工具叫做 **chronyc** 用来控制和监控 **chrony** 守护进程(chronyd)。
+chrony 有一个命令行工具叫做 `chronyc` 用来控制和监控 chrony 守护进程(`chronyd`)。
-为了检查是否 **chrony** 已经同步,我们可以使用下面展示的 **tracking** 命令。
+为了检查是否 chrony 已经同步,我们可以使用下面展示的 `tracking` 命令。
```
$ chronyc tracking
@@ -135,7 +135,7 @@ MS Name/IP address Stratum Poll Reach LastRx Last sample
^- ns2.pulsation.fr 2 10 377 311 -75ms[ -73ms] +/- 250ms
```
-Chronyc 工具可以对每个源进行统计,比如使用 **sourcestats** 命令获得漂移速率和进行偏移估计。
+`chronyc` 工具可以对每个源进行统计,比如使用 `sourcestats` 命令获得漂移速率和进行偏移估计。
```
$ chronyc sourcestats
@@ -152,7 +152,7 @@ sin1.m-d.net 29 13 83m +0.049 6.060 -8466us 9940us
ns2.pulsation.fr 32 17 88m +0.784 9.834 -62ms 22ms
```
-如果你的系统没有连接到 Internet,你需要告知 Chrony 系统没有连接到 Internet。为了这样做,运行:
+如果你的系统没有连接到互联网,你需要告知 Chrony 系统没有连接到 互联网。为了这样做,运行:
```
$ sudo chronyc offline
@@ -174,7 +174,7 @@ $ chronyc activity
可以看到,我的所有源此时都是离线状态。
-一旦你连接到 Internet,只需要使用命令告知 Chrony 你的系统已经回到在线状态:
+一旦你连接到互联网,只需要使用命令告知 Chrony 你的系统已经回到在线状态:
```
$ sudo chronyc online
@@ -193,11 +193,10 @@ $ chronyc activity
0 sources with unknown address
```
-所有选项和参数的详细解释,请参考帮助手册。
+所有选项和参数的详细解释,请参考其帮助手册。
```
$ man chronyc
-
$ man chronyd
```
@@ -206,7 +205,6 @@ $ man chronyd
保持关注!
-
--------------------------------------------------------------------------------
via: https://www.ostechnix.com/chrony-an-alternative-ntp-client-and-server-for-unix-like-systems/
@@ -214,7 +212,7 @@ via: https://www.ostechnix.com/chrony-an-alternative-ntp-client-and-server-for-u
作者:[SK][a]
选题:[lujun9972][b]
译者:[zianglei](https://github.com/zianglei)
-校对:[校对者ID](https://github.com/校对者ID)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/translated/tech/20181017 Design faster web pages, part 2- Image replacement.md b/published/20181017 Design faster web pages, part 2- Image replacement.md
similarity index 87%
rename from translated/tech/20181017 Design faster web pages, part 2- Image replacement.md
rename to published/20181017 Design faster web pages, part 2- Image replacement.md
index 55631b4713..98a8719844 100644
--- a/translated/tech/20181017 Design faster web pages, part 2- Image replacement.md
+++ b/published/20181017 Design faster web pages, part 2- Image replacement.md
@@ -1,7 +1,7 @@
设计更快的网页(二):图片替换
======
-
+
欢迎回到我们为了构建更快网页所写的系列文章。上一篇[文章][1]讨论了只通过图片压缩实现这个目标的方法。这个例子从一开始有 1.2MB 的“浏览器脂肪”,然后它减轻到了 488.9KB 的大小。但这还不够快!那么本文继续来给浏览器“减肥”。你可能在这个过程中会认为我们所做的事情有点疯狂,但一旦完成,你就会明白为什么要这么做了。
@@ -21,17 +21,15 @@ $ sudo dnf install inkscape
![Getfedora 的页面,对其中的图片做了标记][5]
-这次分析更好地以图形方式完成,这也就是它从屏幕截图开始的原因。上面的截图标记了页面中的所有图形元素。Fedora 网站团队已经针对两种情况措施(也有可能是四种,这样更好)来替换图像了。社交媒体的图标变成了字体的字形,而语言选择器变成了 SVG.
+这次分析以图形方式完成更好,这也就是它从屏幕截图开始的原因。上面的截图标记了页面中的所有图形元素。Fedora 网站团队已经针对两种情况措施(也有可能是四种,这样更好)来替换图像了。社交媒体的图标变成了字体的字形,而语言选择器变成了 SVG.
我们有几个可以替换的选择:
-
+ CSS3
+ 字体
+ SVG
+ HTML5 Canvas
-
#### HTML5 Canvas
简单来说,HTML5 Canvas 是一种 HTML 元素,它允许你借助脚本语言(通常是 JavaScript)在上面绘图,不过它现在还没有被广泛使用。因为它可以使用脚本语言来绘制,所以这个元素也可以用来做动画。这里有一些使用 HTML Canvas 实现的实例,比如[三角形模式][6]、[动态波浪][7]和[字体动画][8]。不过,在这种情况下,似乎这也不是最好的选择。
@@ -42,7 +40,7 @@ $ sudo dnf install inkscape
#### 字体
-另外一种方式是使用字体来装饰网页,[Fontawesome][9] 在这方面很流行。比如,在这个例子中你可以使用字体来替换“风味”和“旋转”的图标。这种方法有一个负面影响,但解决起来很容易,我们会在本系列的下一部分中来介绍。
+另外一种方式是使用字体来装饰网页,[Fontawesome][9] 在这方面很流行。比如,在这个例子中你可以使用字体来替换“Flavor”和“Spin”的图标。这种方法有一个负面影响,但解决起来很容易,我们会在本系列的下一部分中来介绍。
#### SVG
@@ -94,13 +92,13 @@ inkscape:connector-curvature="0" />
![Inkscape - 激活节点工具][10]
-这个例子中有五个不必要的节点——就是直线中间的那些。要删除它们,你可以使用已激活的节点工具依次选中它们,并按下 **Del** 键。然后,选中这条线的定义节点,并使用工具栏的工具把它们重新做成角。
+这个例子中有五个不必要的节点——就是直线中间的那些。要删除它们,你可以使用已激活的节点工具依次选中它们,并按下 `Del` 键。然后,选中这条线的定义节点,并使用工具栏的工具把它们重新做成角。
![Inkscape - 将节点变成角的工具][11]
如果不修复这些角,我们还有方法可以定义这条曲线,这条曲线会被保存,也就会增加文件体积。你可以手动清理这些节点,因为它无法有效的自动完成。现在,你已经为下一阶段做好了准备。
-使用_另存为_功能,并选择_优化的 SVG_。这会弹出一个窗口,你可以在里面选择移除或保留哪些成分。
+使用“另存为”功能,并选择“优化的 SVG”。这会弹出一个窗口,你可以在里面选择移除或保留哪些成分。
![Inkscape - “另存为”“优化的 SVG”][12]
@@ -121,7 +119,7 @@ insgesamt 928K
-rw-rw-r--. 1 user user 112K 19. Feb 19:05 greyscale-pattern-opti.svg.gz
```
-这是我为可视化这个主题所做的一个小测试的输出。你可能应该看到光栅图形——PNG——已经被压缩,不能再被压缩了。而 SVG,一个 XML 文件正相反。它是文本文件,所以可被压缩至原来的四分之一不到。因此,现在它的体积要比 PNG 小 50 KB 左右。
+这是我为可视化这个主题所做的一个小测试的输出。你可能应该看到光栅图形——PNG——已经被压缩,不能再被压缩了。而 SVG,它是一个 XML 文件正相反。它是文本文件,所以可被压缩至原来的四分之一不到。因此,现在它的体积要比 PNG 小 50 KB 左右。
现代浏览器可以以原生方式处理压缩文件。所以,许多 Web 服务器都打开了 mod_deflate (Apache) 和 gzip (Nginx) 模式。这样我们就可以在传输过程中节省空间。你可以在[这儿][13]看看你的服务器是不是启用了它。
@@ -129,18 +127,16 @@ insgesamt 928K
首先,没有人希望每次都要用 Inkscape 来优化 SVG. 你可以在命令行中脱离 GUI 来运行 Inkscape,但你找不到选项来将 Inkscape SVG 转换成优化的 SVG. 用这种方式只能导出光栅图像。但是我们替代品:
- * SVGO (看起来开发过程已经不活跃了)
- * Scour
+* SVGO (看起来开发过程已经不活跃了)
+* Scour
-
-
-本例中我们使用 scour 来进行优化。先来安装它:
+本例中我们使用 `scour` 来进行优化。先来安装它:
```
$ sudo dnf install scour
```
-要想自动优化 SVG 文件,请运行 scour,就像这样:
+要想自动优化 SVG 文件,请运行 `scour`,就像这样:
```
[user@localhost ]$ scour INPUT.svg OUTPUT.svg -p 3 --create-groups --renderer-workaround --strip-xml-prolog --remove-descriptive-elements --enable-comment-stripping --disable-embed-rasters --no-line-breaks --enable-id-stripping --shorten-ids
@@ -156,13 +152,13 @@ via: https://fedoramagazine.org/design-faster-web-pages-part-2-image-replacement
作者:[Sirko Kemter][a]
选题:[lujun9972][b]
译者:[StdioA](https://github.com/StdioA)
-校对:[校对者ID](https://github.com/校对者ID)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://fedoramagazine.org/author/gnokii/
[b]: https://github.com/lujun9972
-[1]: https://wp.me/p3XX0v-5fJ
+[1]: https://linux.cn/article-10166-1.html
[2]: https://fedoramagazine.org/howto-use-sudo/
[3]: https://fedoramagazine.org/?s=Inkscape
[4]: https://getfedora.org
diff --git a/published/20181017 How To Determine Which System Manager Is Running On Linux System.md b/published/20181017 How To Determine Which System Manager Is Running On Linux System.md
new file mode 100644
index 0000000000..884cbebaef
--- /dev/null
+++ b/published/20181017 How To Determine Which System Manager Is Running On Linux System.md
@@ -0,0 +1,120 @@
+如何弄清 Linux 系统运行何种系统管理程序
+======
+
+虽然我们经常听到系统管理器System Manager这词,但很少有人深究其确切意义。现在我们将向你展示其区别。
+
+我会尽自己所能来解释清楚一切。我们大多都知道 System V 和 systemd 两种系统管理器。 System V (简写 SysV) 是老式系统所使用的古老且传统的初始化系统及系统管理器。
+
+Systemd 是全新的初始化系统及系统管理器,并且已被大部分主流 Linux 发行版所采用。
+
+Linux 系统中主要有三种有名而仍在使用的初始化系统。大多数 Linux 发行版都使用其中之一。
+
+### 什么是初始化系统管理器?
+
+在基于 Linux/Unix 的操作系统中,`init` (初始化的简称) 是内核启动系统时开启的第一个进程。
+
+它持有的进程 ID(PID)号为 1,其在后台一直运行着,直到关机。
+
+`init` 会查找 `/etc/inittab` 文件中相应配置信息来确定系统的运行级别,然后根据运行级别在后台启动所有的其它进程和应用。
+
+作为 Linux 启动过程的一部分,BIOS、MBR、GRUB 和内核进程在此进程之前就被激活了。
+
+下面列出的是 Linux 的可用运行级别(存在七个运行级别,从 0 到 6)。
+
+ * `0`:停机
+ * `1`:单用户模式
+ * `2`:多用户,无 NFS(LCTT 译注:NFS 即 Network File System,网络文件系统)
+ * `3`:全功能多用户模式
+ * `4`:未使用
+ * `5`:X11(GUI – 图形用户界面)
+ * `6`:重启
+
+下面列出的是 Linux 系统中广泛使用的三种初始化系统。
+
+ * System V (Sys V):是类 Unix 操作系统传统的也是首款初始化系统。
+ * Upstart:基于事件驱动,是 `/sbin/init` 守护进程的替代品。
+ * Systemd:是一款全新的初始化系统及系统管理器,它被所有主流的 Linux 发行版实现/采用,以替代传统的 SysV 初始化系统。
+
+### 什么是 System V (Sys V)?
+
+System V(Sys V)是类 Unix 操作系统传统的也是首款初始化系统。`init` 是系统由内核启动期间启动的第一个进程,它是所有进程的父进程。
+
+起初,大多数 Linux 发行版都使用名为 System V(SysV)的传统的初始化系统。多年来,为了解决标准版本中的设计限制,发布了几个替代的初始化系统,例如 launchd、Service Management Facility、systemd 和 Upstart。
+
+但只有 systemd 最终被几个主流 Linux 发行版所采用,以替代传统的 SysV。
+
+### 什么是 Upstart?
+
+Upstart 基于事件驱动,是 `/sbin/init` 守护进程的替代品。用来在启动期间控制任务和服务的启动,在关机期间停止它们,及在系统运行过程中监视它们。
+
+它最初是为 Ubuntu 发行版开发的,但也可以在所有的 Linux 发行版中部署运行,以替代古老的 System V 初始化系统。
+
+它用于 Ubuntu 9.10 到 14.10 版本和基于 RHEL 6 的系统中,之后的被 systemd 取代了。
+
+### 什么是 systemd?
+
+systemd 是一款全新的初始化系统及系统管理器,它被所有主流的 Linux 发行版实现/采用,以替代传统的 SysV 初始化系统。
+
+systemd 与 SysV 和 LSB(LCTT 译注:Linux Standards Base) 初始化脚本兼容。它可以作为 SysV 初始化系统的直接替代品。其是内核启动的第一个进程并占有数字 1 的 PID,它是所有进程的父进程。
+
+Fedora 15 是第一个采用 systemd 而不是 upstart 的发行版。[systemctl][3] 是一款命令行工具,它是管理 systemd 守护进程/服务(如 `start`、`restart`、`stop`、`enable`、`disable`、`reload` 和 `status`)的主要工具。
+
+systemd 使用 `.service` 文件而不是(SysV 初始化系统使用的) bash 脚本。systemd 把所有守护进程按顺序排列到自己 Cgroups (LCTT 译注:Cgroups 是 control groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源,如:cpu、memory、IO 等的机制。最初由 Google 的工程师提出,后来被整合进 Linux 内核。Cgroups 也是 LXC 为实现虚拟化所使用的资源管理手段,可以说没有 cgroups 就没有 LXC)中,所以通过查看 `/cgroup/systemd` 文件就可以查看系统层次结构。
+
+### 在 Linux 上如何识别出系统管理器
+
+在系统上运行如下命令来查看运行着什么系统管理器:
+
+(LCTT 译注:原文繁冗啰嗦,翻译时进行了裁剪整理。)
+
+#### 方法 1:使用 ps 命令
+
+`ps` – 显示当前进程快照。`ps` 会显示选定的活动进程的信息。其输出不能确切区分出是 System V(SysV) 还是 upstart,所以我建议使用其它方法。
+
+```
+# ps -p1 | grep "init\|upstart\|systemd"
+ 1 ? 00:00:00 init
+```
+
+#### 方法 2:使用 rpm 命令
+
+RPM 即 Red Hat Package Manager (红帽包管理),是一款功能强大的[安装包管理][1]命令行工具,在基于 Red Hat 的发行版中使用,如 RHEL、CentOS、Fedora、openSUSE 和 Mageia。此工具可以在系统/服务上对软件进行安装、更新、删除、查询及验证等操作。通常 RPM 文件都带有 `.rpm` 后缀。
+
+RPM 会使用必要的库和依赖库来构建软件,并且不会与系统上安装的其它包冲突。
+
+```
+# rpm -qf /sbin/init
+SysVinit-2.86-17.el5
+```
+
+#### 方法 3:使用 /sbin/init 文件
+
+`/sbin/init` 程序会将根文件系统从内存加载或切换到磁盘。
+
+这是启动过程的主要部分。这个进程开始时的运行级别为 “N”(无)。`/sbin/init` 程序会按照 `/etc/inittab` 配制文件的描述来初始化系统。
+
+```
+# /sbin/init --version
+init (upstart 0.6.5)
+Copyright (C) 2010 Canonical Ltd.
+
+This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+```
+
+
+--------------------------------------------------------------------------------
+
+via: https://www.2daygeek.com/how-to-determine-which-init-system-manager-is-running-on-linux-system/
+
+作者:[Prakash Subramanian][a]
+选题:[lujun9972][b]
+译者:[runningwater](https://github.com/runningwater)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.2daygeek.com/author/prakash/
+[b]: https://github.com/lujun9972
+[1]: https://www.2daygeek.com/category/package-management/
+[2]: https://www.2daygeek.com/rpm-command-examples/
+[3]: https://www.2daygeek.com/how-to-check-all-running-services-in-linux/
diff --git a/translated/tech/20181019 Edit your videos with Pitivi on Fedora.md b/published/20181019 Edit your videos with Pitivi on Fedora.md
similarity index 89%
rename from translated/tech/20181019 Edit your videos with Pitivi on Fedora.md
rename to published/20181019 Edit your videos with Pitivi on Fedora.md
index 09c36fa71f..a9c25180fb 100644
--- a/translated/tech/20181019 Edit your videos with Pitivi on Fedora.md
+++ b/published/20181019 Edit your videos with Pitivi on Fedora.md
@@ -1,10 +1,11 @@
-在 Fedora 上使用 Pitivi 编辑你的视频
+在 Fedora 上使用 Pitivi 编辑视频
======

-想制作一部你本周末冒险的视频吗?视频编辑有很多选择。但是,如果你在寻找一个容易上手的视频编辑器,并且也可以在官方 Fedora 仓库中找到,请尝试一下[Pitivi][1]。
-Pitivi 是一个使用 GStreamer 框架的开源非线性视频编辑器。在 Fedora 下开箱即用,Pitivi 支持 OGG、WebM 和一系列其他格式。此外,通过 gstreamer 插件可以获得更多视频格式支持。Pitivi 也与 GNOME 桌面紧密集成,因此相比其他新的程序,它的 UI 在 Fedora Workstation 上会感觉很熟悉。
+想制作一部你本周末冒险的视频吗?视频编辑有很多选择。但是,如果你在寻找一个容易上手的视频编辑器,并且也可以在官方 Fedora 仓库中找到,请尝试一下 [Pitivi][1]。
+
+Pitivi 是一个使用 GStreamer 框架的开源非线性视频编辑器。在 Fedora 下开箱即用,Pitivi 支持 OGG、WebM 和一系列其他格式。此外,通过 GStreamer 插件可以获得更多视频格式支持。Pitivi 也与 GNOME 桌面紧密集成,因此相比其他新的程序,它的 UI 在 Fedora Workstation 上会感觉很熟悉。
### 在 Fedora 上安装 Pitivi
@@ -20,7 +21,7 @@ sudo dnf install pitivi
### 基本编辑
-Pitivi 内置了多种工具,可以快速有效地编辑剪辑。只需将视频、音频和图像导入 Pitivi 媒体库,然后将它们拖到时间线上即可。此外,除了时间线上的简单淡入淡出过渡之外,pitivi 还允许你轻松地将剪辑的各个部分分割、修剪和分组。
+Pitivi 内置了多种工具,可以快速有效地编辑剪辑。只需将视频、音频和图像导入 Pitivi 媒体库,然后将它们拖到时间线上即可。此外,除了时间线上的简单淡入淡出过渡之外,Pitivi 还允许你轻松地将剪辑的各个部分分割、修剪和分组。
![][3]
@@ -40,7 +41,7 @@ via: https://fedoramagazine.org/edit-your-videos-with-pitivi-on-fedora/
作者:[Ryan Lerch][a]
选题:[lujun9972][b]
译者:[geekpi](https://github.com/geekpi)
-校对:[校对者ID](https://github.com/校对者ID)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/translated/talk/20181019 What is an SRE and how does it relate to DevOps.md b/published/20181019 What is an SRE and how does it relate to DevOps.md
similarity index 83%
rename from translated/talk/20181019 What is an SRE and how does it relate to DevOps.md
rename to published/20181019 What is an SRE and how does it relate to DevOps.md
index 80700d6fb9..03bd773fa7 100644
--- a/translated/talk/20181019 What is an SRE and how does it relate to DevOps.md
+++ b/published/20181019 What is an SRE and how does it relate to DevOps.md
@@ -1,15 +1,15 @@
什么是 SRE?它和 DevOps 是怎么关联的?
=====
-大型企业里 SRE 角色比较常见,不过小公司也需要 SRE。
+> 大型企业里 SRE 角色比较常见,不过小公司也需要 SRE。

-虽然站点可靠性工程师(SRE)角色在近几年变得流行起来,但是很多人 —— 甚至是软件行业里的 —— 还不知道 SRE 是什么或者 SRE 都干些什么。为了搞清楚这些问题,这篇文章解释了 SRE 的含义,还有 SRE 怎样关联 DevOps,以及在工程师团队规模不大的组织里 SRE 该如何工作。
+虽然站点可靠性工程师site reliability engineer(SRE)角色在近几年变得流行起来,但是很多人 —— 甚至是软件行业里的 —— 还不知道 SRE 是什么或者 SRE 都干些什么。为了搞清楚这些问题,这篇文章解释了 SRE 的含义,还有 SRE 怎样关联 DevOps,以及在工程师团队规模不大的组织里 SRE 该如何工作。
### 什么是站点可靠性工程?
-谷歌的几个工程师写的《 [SRE:谷歌运维解密][1]》被认为是站点可靠性工程的权威书籍。谷歌的工程副总裁 Ben Treynor Sloss 在二十一世纪初[创造了这个术语][2]。他是这样定义的:“当你让软件工程师设计运维功能时,SRE 就产生了。”
+谷歌的几个工程师写的《[SRE:谷歌运维解密][1]》被认为是站点可靠性工程的权威书籍。谷歌的工程副总裁 Ben Treynor Sloss 在二十一世纪初[创造了这个术语][2]。他是这样定义的:“当你让软件工程师设计运维功能时,SRE 就产生了。”
虽然系统管理员从很久之前就在写代码,但是过去的很多时候系统管理团队是手动管理机器的。当时他们管理的机器可能有几十台或者上百台,不过当这个数字涨到了几千甚至几十万的时候,就不能简单的靠人去解决问题了。规模如此大的情况下,很明显应该用代码去管理机器(以及机器上运行的软件)。
@@ -19,13 +19,13 @@
### SRE 和 DevOps
-站点可靠性工程的核心,就是对 DevOps 范例的实践。[DevOps 的定义][3]有很多种方式。开发团队(“devs”)和运维(“ops”)团队相互分离的传统模式下,写代码的团队在服务交付给用户使用之后就不再对服务状态负责了。开发团队“把代码扔到墙那边”让运维团队去部署和支持。
+站点可靠性工程的核心,就是对 DevOps 范例的实践。[DevOps 的定义][3]有很多种方式。开发团队(“dev”)和运维(“ops”)团队相互分离的传统模式下,写代码的团队在将服务交付给用户使用之后就不再对服务状态负责了。开发团队“把代码扔到墙那边”让运维团队去部署和支持。
这种情况会导致大量失衡。开发和运维的目标总是不一致 —— 开发希望用户体验到“最新最棒”的代码,但是运维想要的是变更尽量少的稳定系统。运维是这样假定的,任何变更都可能引发不稳定,而不做任何变更的系统可以一直保持稳定。(减少软件的变更次数并不是避免故障的唯一因素,认识到这一点很重要。例如,虽然你的 web 应用保持不变,但是当用户数量涨到十倍时,服务可能就会以各种方式出问题。)
DevOps 理念认为通过合并这两个岗位就能够消灭争论。如果开发团队时刻都想把新代码部署上线,那么他们也必须对新代码引起的故障负责。就像亚马逊的 [Werner Vogels 说的][4]那样,“谁开发,谁运维”(生产环境)。但是开发人员已经有一大堆问题了。他们不断的被推动着去开发老板要的产品功能。再让他们去了解基础设施,包括如何部署、配置还有监控服务,这对他们的要求有点太多了。所以就需要 SRE 了。
-开发一个 web 应用的时候经常是很多人一起参与。有用户界面设计师,图形设计师,前端工程师,后端工程师,还有许多其他工种(视技术选型的具体情况而定)。如何管理写好的代码也是需求之一(例如部署,配置,监控)—— 这是 SRE 的专业领域。但是,就像前端工程师受益于后端领域的知识一样(例如从数据库获取数据的方法),SRE 理解部署系统的工作原理,知道如何满足特定的代码或者项目的具体需求。
+开发一个 web 应用的时候经常是很多人一起参与。有用户界面设计师、图形设计师、前端工程师、后端工程师,还有许多其他工种(视技术选型的具体情况而定)。如何管理写好的代码也是需求之一(例如部署、配置、监控)—— 这是 SRE 的专业领域。但是,就像前端工程师受益于后端领域的知识一样(例如从数据库获取数据的方法),SRE 理解部署系统的工作原理,知道如何满足特定的代码或者项目的具体需求。
所以 SRE 不仅仅是“写代码的运维工程师”。相反,SRE 是开发团队的成员,他们有着不同的技能,特别是在发布部署、配置管理、监控、指标等方面。但是,就像前端工程师必须知道如何从数据库中获取数据一样,SRE 也不是只负责这些领域。为了提供更容易升级、管理和监控的产品,整个团队共同努力。
@@ -37,7 +37,7 @@ DevOps 理念认为通过合并这两个岗位就能够消灭争论。如果开
让开发人员做 SRE 最显著的优点是,团队规模变大的时候也能很好的扩展。而且,开发人员将会全面地了解应用的特性。但是,许多初创公司的基础设施包含了各种各样的 SaaS 产品,这种多样性在基础设施上体现的最明显,因为连基础设施本身也是多种多样。然后你们在某个基础设施上引入指标系统、站点监控、日志分析、容器等等。这些技术解决了一部分问题,也增加了复杂度。开发人员除了要了解应用程序的核心技术(比如开发语言),还要了解上述所有技术和服务。最终,掌握所有的这些技术让人无法承受。
-另一种方案是聘请专家专职做 SRE。他们专注于发布部署、配置管理、监控和指标,可以节省开发人员的时间。这种方案的缺点是,SRE 的时间必须分配给多个不同的应用(就是说 SRE 需要贯穿整个工程部门)。 这可能意味着 SRE 没时间对任何应用深入学习,然而他们可以站在一个能看到服务全貌的高度,知道各个部分是怎么组合在一起的。 这个“ 三万英尺高的视角”可以帮助 SRE 从系统整体上考虑,哪些薄弱环节需要优先修复。
+另一种方案是聘请专家专职做 SRE。他们专注于发布部署、配置管理、监控和指标,可以节省开发人员的时间。这种方案的缺点是,SRE 的时间必须分配给多个不同的应用(就是说 SRE 需要贯穿整个工程部门)。 这可能意味着 SRE 没时间对任何应用深入学习,然而他们可以站在一个能看到服务全貌的高度,知道各个部分是怎么组合在一起的。 这个“三万英尺高的视角”可以帮助 SRE 从系统整体上考虑,哪些薄弱环节需要优先修复。
有一个关键信息我还没提到:其他的工程师。他们可能很渴望了解发布部署的原理,也很想尽全力学会使用指标系统。而且,雇一个 SRE 可不是一件简单的事儿。因为你要找的是一个既懂系统管理又懂软件工程的人。(我之所以明确地说软件工程而不是说“能写代码”,是因为除了写代码之外软件工程还包括很多东西,比如编写良好的测试或文档。)
@@ -54,7 +54,7 @@ via: https://opensource.com/article/18/10/sre-startup
作者:[Craig Sebenik][a]
选题:[lujun9972][b]
译者:[BeliteX](https://github.com/belitex)
-校对:[校对者ID](https://github.com/校对者ID)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/translated/tech/20181022 How to set up WordPress on a Raspberry Pi.md b/published/20181022 How to set up WordPress on a Raspberry Pi.md
similarity index 52%
rename from translated/tech/20181022 How to set up WordPress on a Raspberry Pi.md
rename to published/20181022 How to set up WordPress on a Raspberry Pi.md
index 5153307eee..a3ca6d17ef 100644
--- a/translated/tech/20181022 How to set up WordPress on a Raspberry Pi.md
+++ b/published/20181022 How to set up WordPress on a Raspberry Pi.md
@@ -1,38 +1,39 @@
-如何在 Rasspberry Pi 上搭建 WordPress
+如何在树莓派上搭建 WordPress
======
-这篇简单的教程可以让你在 Rasspberry Pi 上运行你的 WordPress 网站。
+> 这篇简单的教程可以让你在树莓派上运行你的 WordPress 网站。

WordPress 是一个非常受欢迎的开源博客平台和内容管理平台(CMS)。它很容易搭建,而且还有一个活跃的开发者社区构建网站、创建主题和插件供其他人使用。
-虽然通过一键式 WordPress 设置获得托管包很容易,但通过命令行就可以在 Linux 服务器上设置自己的托管包,而且 Raspberry Pi 是一种用来尝试它并顺便学习一些东西的相当好的途径。
+虽然通过一键式 WordPress 设置获得托管包很容易,但也可以简单地通过命令行在 Linux 服务器上设置自己的托管包,而且树莓派是一种用来尝试它并顺便学习一些东西的相当好的途径。
-使用一个 web 堆栈的四个部分是 Linux、Apache、MySQL 和 PHP。这里是你对它们每一个需要了解的。
+一个经常使用的 Web 套件的四个部分是 Linux、Apache、MySQL 和 PHP。这里是你对它们每一个需要了解的。
### Linux
-Raspberry Pi 上运行的系统是 Raspbian,这是一个基于 Debian,优化地可以很好的运行在 Raspberry Pi 硬件上的 Linux 发行版。你有两个选择:桌面版或是精简版。桌面版有一个熟悉的桌面还有很多教育软件和编程工具,像是 LibreOffice 套件、Mincraft,还有一个 web 浏览器。精简版本没有桌面环境,因此它只有命令行以及一些必要的软件。
+树莓派上运行的系统是 Raspbian,这是一个基于 Debian,为运行在树莓派硬件上而优化的很好的 Linux 发行版。你有两个选择:桌面版或是精简版。桌面版有一个熟悉的桌面还有很多教育软件和编程工具,像是 LibreOffice 套件、Mincraft,还有一个 web 浏览器。精简版本没有桌面环境,因此它只有命令行以及一些必要的软件。
这篇教程在两个版本上都可以使用,但是如果你使用的是精简版,你必须要有另外一台电脑去访问你的站点。
### Apache
-Apache 是一个受欢迎的 web 服务器应用,你可以安装在你的 Raspberry Pi 上伺服你的 web 页面。就其自身而言,Apache 可以通过 HTTP 提供静态 HTML 文件。使用额外的模块,它也可以使用像是 PHP 的脚本语言提供动态网页。
+Apache 是一个受欢迎的 web 服务器应用,你可以安装在你的树莓派上伺服你的 web 页面。就其自身而言,Apache 可以通过 HTTP 提供静态 HTML 文件。使用额外的模块,它也可以使用像是 PHP 的脚本语言提供动态网页。
安装 Apache 非常简单。打开一个终端窗口,然后输入下面的命令:
```
sudo apt install apache2 -y
```
-Apache 默认放了一个测试文件在一个 web 目录中,你可以从你的电脑或是你网络中的其他计算机进行访问。只需要打开 web 浏览器,然后输入地址 ****。或者(特别是你使用的是 Raspbian Lite 的话)输入你的 Pi 的 IP 地址代替 **localhost**。你应该会在你的浏览器窗口中看到这样的内容:
+
+Apache 默认放了一个测试文件在一个 web 目录中,你可以从你的电脑或是你网络中的其他计算机进行访问。只需要打开 web 浏览器,然后输入地址 ``。或者(特别是你使用的是 Raspbian Lite 的话)输入你的树莓派的 IP 地址代替 `localhost`。你应该会在你的浏览器窗口中看到这样的内容:

这意味着你的 Apache 已经开始工作了!
-这个默认的网页仅仅是你文件系统里的一个文件。它在你本地的 **/var/www/html/index/html**。你可以使用 [Leafpad][2] 文本编辑器写一些 HTML 去替换这个文件的内容。
+这个默认的网页仅仅是你文件系统里的一个文件。它在你本地的 `/var/www/html/index/html`。你可以使用 [Leafpad][2] 文本编辑器写一些 HTML 去替换这个文件的内容。
```
cd /var/www/html/
@@ -43,27 +44,27 @@ sudo leafpad index.html
### MySQL
-MySQL (显然是 "my S-Q-L" 或者 "my sequel") 是一个很受欢迎的数据库引擎。就像 PHP,它被非常广泛的应用于网页服务,这也是为什么像 WordPress 一样的项目选择了它,以及这些项目是为何如此受欢迎。
+MySQL(读作 “my S-Q-L” 或者 “my sequel”)是一个很受欢迎的数据库引擎。就像 PHP,它被非常广泛的应用于网页服务,这也是为什么像 WordPress 一样的项目选择了它,以及这些项目是为何如此受欢迎。
-在一个终端窗口中输入以下命令安装 MySQL 服务:
+在一个终端窗口中输入以下命令安装 MySQL 服务(LCTT 译注:实际上安装的是 MySQL 分支 MariaDB):
```
sudo apt-get install mysql-server -y
```
-WordPress 使用 MySQL 存储文章、页面、用户数据、还有许多其他的内容。
+WordPress 使用 MySQL 存储文章、页面、用户数据、还有许多其他的内容。
### PHP
-PHP 是一个预处理器:它是在服务器通过网络浏览器接受网页请求是运行的代码。它解决那些需要展示在网页上的内容,然后发送这些网页到浏览器上。,不像静态的 HTML,PHP 能在不同的情况下展示不同的内容。PHP 是一个在 web 上非常受欢迎的语言;很多像 Facebook 和 Wikipedia 的项目都使用 PHP 编写。
+PHP 是一个预处理器:它是在服务器通过网络浏览器接受网页请求是运行的代码。它解决那些需要展示在网页上的内容,然后发送这些网页到浏览器上。不像静态的 HTML,PHP 能在不同的情况下展示不同的内容。PHP 是一个在 web 上非常受欢迎的语言;很多像 Facebook 和 Wikipedia 的项目都使用 PHP 编写。
-安装 PHP 和 MySQL 的插件:
+安装 PHP 和 MySQL 的插件:
```
sudo apt-get install php php-mysql -y
```
-删除 **index.html**,然后创建 **index.php**:
+删除 `index.html`,然后创建 `index.php`:
```
sudo rm index.html
@@ -82,16 +83,16 @@ sudo leafpad index.php
### WordPress
-你可以使用 **wget** 命令从 [wordpress.org][3] 下载 WordPress。最新的 WordPress 总是使用 [wordpress.org/latest.tar.gz][4] 这个网址,所以你可以直接抓取这些文件,而无需到网页里面查看,现在的版本是 4.9.8。
+你可以使用 `wget` 命令从 [wordpress.org][3] 下载 WordPress。最新的 WordPress 总是使用 [wordpress.org/latest.tar.gz][4] 这个网址,所以你可以直接抓取这些文件,而无需到网页里面查看,现在的版本是 4.9.8。
-确保你在 **/var/www/html** 目录中,然后删除里面的所有内容:
+确保你在 `/var/www/html` 目录中,然后删除里面的所有内容:
```
cd /var/www/html/
sudo rm *
```
-使用 **wget** 下载 WordPress,然后提取里面的内容,并移动提取的 WordPress 目录中的内容移动到 **html** 目录下:
+使用 `wget` 下载 WordPress,然后提取里面的内容,并移动提取的 WordPress 目录中的内容移动到 `html` 目录下:
```
sudo wget http://wordpress.org/latest.tar.gz
@@ -99,13 +100,13 @@ sudo tar xzf latest.tar.gz
sudo mv wordpress/* .
```
-现在可以删除压缩包和空的 **wordpress** 目录:
+现在可以删除压缩包和空的 `wordpress` 目录了:
```
sudo rm -rf wordpress latest.tar.gz
```
-运行 **ls** 或者 **tree -L 1** 命令显示 WordPress 项目下包含的内容:
+运行 `ls` 或者 `tree -L 1` 命令显示 WordPress 项目下包含的内容:
```
.
@@ -132,9 +133,9 @@ sudo rm -rf wordpress latest.tar.gz
3 directories, 16 files
```
-这是 WordPress 的默认安装源。在 **wp-content** 目录中,你可以编辑你的自定义安装。
+这是 WordPress 的默认安装源。在 `wp-content` 目录中,你可以编辑你的自定义安装。
-你现在应该把所有文件的所有权改为 Apache 用户:
+你现在应该把所有文件的所有权改为 Apache 的运行用户 `www-data`:
```
sudo chown -R www-data: .
@@ -152,24 +153,27 @@ sudo mysql_secure_installation
你将会被问到一系列的问题。这里原来没有设置密码,但是在下一步你应该设置一个。确保你记住了你输入的密码,后面你需要使用它去连接你的 WordPress。按回车确认下面的所有问题。
-当它完成之后,你将会看到 "All done!" 和 "Thanks for using MariaDB!" 的信息。
+当它完成之后,你将会看到 “All done!” 和 “Thanks for using MariaDB!” 的信息。
-在终端窗口运行 **mysql** 命令:
+在终端窗口运行 `mysql` 命令:
```
sudo mysql -uroot -p
```
-输入你创建的 root 密码。你将看到 “Welcome to the MariaDB monitor.” 的欢迎信息。在 **MariaDB [(none)] >** 提示处使用以下命令,为你 WordPress 的安装创建一个数据库:
+
+输入你创建的 root 密码(LCTT 译注:不是 Linux 系统的 root 密码,是 MySQL 的 root 密码)。你将看到 “Welcome to the MariaDB monitor.” 的欢迎信息。在 “MariaDB [(none)] >” 提示处使用以下命令,为你 WordPress 的安装创建一个数据库:
```
create database wordpress;
```
+
注意声明最后的分号,如果命令执行成功,你将看到下面的提示:
```
Query OK, 1 row affected (0.00 sec)
```
-把 数据库权限交给 root 用户在声明的底部输入密码:
+
+把数据库权限交给 root 用户在声明的底部输入密码:
```
GRANT ALL PRIVILEGES ON wordpress.* TO 'root'@'localhost' IDENTIFIED BY 'YOURPASSWORD';
@@ -181,13 +185,13 @@ GRANT ALL PRIVILEGES ON wordpress.* TO 'root'@'localhost' IDENTIFIED BY 'YOURPAS
FLUSH PRIVILEGES;
```
-按 **Ctrl+D** 退出 MariaDB 提示,返回到 Bash shell。
+按 `Ctrl+D` 退出 MariaDB 提示符,返回到 Bash shell。
### WordPress 配置
-在你的 Raspberry Pi 打开网页浏览器,地址栏输入 ****。选择一个你想要在 WordPress 使用的语言,然后点击 **继续**。你将会看到 WordPress 的欢迎界面。点击 **让我们开始吧** 按钮。
+在你的 树莓派 打开网页浏览器,地址栏输入 `http://localhost`。选择一个你想要在 WordPress 使用的语言,然后点击“Continue”。你将会看到 WordPress 的欢迎界面。点击 “Let's go!” 按钮。
-按照下面这样填写基本的站点信息:
+按照下面这样填写基本的站点信息:
```
Database Name: wordpress
@@ -197,22 +201,23 @@ Database Host: localhost
Table Prefix: wp_
```
-点击 **提交** 继续,然后点击 **运行安装**。
+点击 “Submit” 继续,然后点击 “Run the install”。

-按下面的格式填写:为你的站点设置一个标题、创建一个用户名和密码、输入你的 email 地址。点击 **安装 WordPress** 按钮,然后使用你刚刚创建的账号登录,你现在已经登录,而且你的站点已经设置好了,你可以在浏览器地址栏输入 **** 查看你的网站。
+按下面的格式填写:为你的站点设置一个标题、创建一个用户名和密码、输入你的 email 地址。点击 “Install WordPress” 按钮,然后使用你刚刚创建的账号登录,你现在已经登录,而且你的站点已经设置好了,你可以在浏览器地址栏输入 `http://localhost/wp-admin` 查看你的网站。
### 永久链接
-更改你的永久链接,使得你的 URLs 更加友好是一个很好的想法。
+更改你的永久链接设置,使得你的 URL 更加友好是一个很好的想法。
-要这样做,首先登录你的 WordPress ,进入仪表盘。进入 **设置**,**永久链接**。选择 **文章名** 选项,然后点击 **保存更改**。接着你需要开启 Apache 的 **改写** 模块。
+要这样做,首先登录你的 WordPress ,进入仪表盘。进入 “Settings”,“Permalinks”。选择 “Post name” 选项,然后点击 “Save Changes”。接着你需要开启 Apache 的 `rewrite` 模块。
```
sudo a2enmod rewrite
```
-你还需要告诉虚拟托管服务,站点允许改写请求。为你的虚拟主机编辑 Apache 配置文件
+
+你还需要告诉虚拟托管服务,站点允许改写请求。为你的虚拟主机编辑 Apache 配置文件:
```
sudo leafpad /etc/apache2/sites-available/000-default.conf
@@ -226,7 +231,7 @@ sudo leafpad /etc/apache2/sites-available/000-default.conf
```
-确保其中有像这样的内容 **< VirtualHost \*:80>**
+确保其中有像这样的内容 ``:
```
@@ -244,17 +249,16 @@ sudo systemctl restart apache2
### 下一步?
-WordPress 是可以高度自定义的。在网站顶部横幅处点击你的站点名,你就会进入仪表盘,。在这里你可以修改主题、添加页面和文章、编辑菜单、添加插件、以及许多其他的事情。
+WordPress 是可以高度自定义的。在网站顶部横幅处点击你的站点名,你就会进入仪表盘。在这里你可以修改主题、添加页面和文章、编辑菜单、添加插件、以及许多其他的事情。
-这里有一些你可以在 Raspberry Pi 的网页服务上尝试的有趣的事情:
+这里有一些你可以在树莓派的网页服务上尝试的有趣的事情:
* 添加页面和文章到你的网站
* 从外观菜单安装不同的主题
* 自定义你的网站主题或是创建你自己的
* 使用你的网站服务向你的网络上的其他人显示有用的信息
-
-不要忘记,Raspberry Pi 是一台 Linux 电脑。你也可以使用相同的结构在运行着 Debian 或者 Ubuntu 的服务器上安装 WordPress。
+不要忘记,树莓派是一台 Linux 电脑。你也可以使用相同的结构在运行着 Debian 或者 Ubuntu 的服务器上安装 WordPress。
--------------------------------------------------------------------------------
@@ -263,7 +267,7 @@ via: https://opensource.com/article/18/10/setting-wordpress-raspberry-pi
作者:[Ben Nuttall][a]
选题:[lujun9972][b]
译者:[dianbanjiu](https://github.com/dianbanjiu)
-校对:[校对者ID](https://github.com/校对者ID)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/translated/tech/20181023 Getting started with functional programming in Python using the toolz library.md b/published/20181023 Getting started with functional programming in Python using the toolz library.md
similarity index 67%
rename from translated/tech/20181023 Getting started with functional programming in Python using the toolz library.md
rename to published/20181023 Getting started with functional programming in Python using the toolz library.md
index 1f2606daa2..d23a45bc77 100644
--- a/translated/tech/20181023 Getting started with functional programming in Python using the toolz library.md
+++ b/published/20181023 Getting started with functional programming in Python using the toolz library.md
@@ -1,7 +1,7 @@
-使用Python的toolz库开始函数式编程
+使用 Python 的 toolz 库开始函数式编程
======
-toolz库允许你操作函数,使其更容易理解,更容易测试代码。
+> toolz 库允许你操作函数,使其更容易理解,更容易测试代码。

@@ -20,7 +20,11 @@ def add_one_word(words, word):
这个函数假设它的第一个参数是一个不可变的类似字典的对象,它返回一个新的类似字典的在相关位置递增的对象:这就是一个简单的频率计数器。
-但是,只有将它应用于单词流并做归纳时才有用。 我们可以使用内置模块 `functools` 中的归纳器。 `functools.reduce(function, stream, initializer)`
+但是,只有将它应用于单词流并做*归纳*时才有用。 我们可以使用内置模块 `functools` 中的归纳器。
+
+```
+functools.reduce(function, stream, initializer)
+```
我们想要一个函数,应用于流,并且能能返回频率计数。
@@ -30,14 +34,12 @@ def add_one_word(words, word):
add_all_words = curry(functools.reduce, add_one_word)
```
-使用此版本,我们需要提供初始化程序。 但是,我们不能只将 `pyrsistent.m` 函数添加到 `curry` 函数中中; 因为这个顺序是错误的。
+使用此版本,我们需要提供初始化程序。但是,我们不能只将 `pyrsistent.m` 函数添加到 `curry` 函数中; 因为这个顺序是错误的。
```
add_all_words_flipped = flip(add_all_words)
```
-The `flip` higher-level function returns a function that calls the original, with arguments flipped.
-
`flip` 这个高阶函数返回一个调用原始函数的函数,并且翻转参数顺序。
```
@@ -46,7 +48,7 @@ get_all_words = add_all_words_flipped(pyrsistent.m())
我们利用 `flip` 自动调整其参数的特性给它一个初始值:一个空字典。
-现在我们可以执行 `get_all_words(word_stream)` 这个函数来获取频率字典。 但是,我们如何获得一个单词流呢? Python文件是行流的。
+现在我们可以执行 `get_all_words(word_stream)` 这个函数来获取频率字典。 但是,我们如何获得一个单词流呢? Python 文件是按行供流的。
```
def to_words(lines):
@@ -60,9 +62,9 @@ def to_words(lines):
words_from_file = toolz.compose(get_all_words, to_words)
```
-在这种情况下,组合只是使两个函数很容易阅读:首先将文件的行流应用于 `to_words`,然后将 `get_all_words` 应用于 `to_words` 的结果。 散文似乎与代码相反。
+在这种情况下,组合只是使两个函数很容易阅读:首先将文件的行流应用于 `to_words`,然后将 `get_all_words` 应用于 `to_words` 的结果。 但是文字上读起来似乎与代码执行相反。
-当我们开始认真对待可组合性时,这很重要。 有时可以将代码编写为一个单元序列,单独测试每个单元,最后将它们全部组合。 如果有几个组合元素时,组合的顺序可能就很难理解。
+当我们开始认真对待可组合性时,这很重要。有时可以将代码编写为一个单元序列,单独测试每个单元,最后将它们全部组合。如果有几个组合元素时,组合的顺序可能就很难理解。
`toolz` 库借用了 Unix 命令行的做法,并使用 `pipe` 作为执行相同操作的函数,但顺序相反。
@@ -70,17 +72,13 @@ words_from_file = toolz.compose(get_all_words, to_words)
words_from_file = toolz.pipe(to_words, get_all_words)
```
-Now it reads more intuitively: Pipe the input into `to_words`, and pipe the results into `get_all_words`. On a command line, the equivalent would look like this:
-
现在读起来更直观了:将输入传递到 `to_words`,并将结果传递给 `get_all_words`。 在命令行上,等效写法如下所示:
```
$ cat files | to_words | get_all_words
```
-The `toolz` library allows us to manipulate functions, slicing, dicing, and composing them to make our code easier to understand and to test.
-
-`toolz` 库允许我们操作函数,切片,分割和组合,以使我们的代码更容易理解和测试。
+`toolz` 库允许我们操作函数,切片、分割和组合,以使我们的代码更容易理解和测试。
--------------------------------------------------------------------------------
@@ -89,10 +87,10 @@ via: https://opensource.com/article/18/10/functional-programming-python-toolz
作者:[Moshe Zadka][a]
选题:[lujun9972][b]
译者:[Flowsnow](https://github.com/Flowsnow)
-校对:[校对者ID](https://github.com/校对者ID)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/moshez
[b]: https://github.com/lujun9972
-[1]: https://opensource.com/article/18/10/functional-programming-python-immutable-data-structures
\ No newline at end of file
+[1]: https://linux.cn/article-10222-1.html
diff --git a/translated/tech/20181024 4 cool new projects to try in COPR for October 2018.md b/published/20181024 4 cool new projects to try in COPR for October 2018.md
similarity index 55%
rename from translated/tech/20181024 4 cool new projects to try in COPR for October 2018.md
rename to published/20181024 4 cool new projects to try in COPR for October 2018.md
index 9bec02c08d..70e2146853 100644
--- a/translated/tech/20181024 4 cool new projects to try in COPR for October 2018.md
+++ b/published/20181024 4 cool new projects to try in COPR for October 2018.md
@@ -1,30 +1,19 @@
-2018 年 10 月在 COPR 中值得尝试的 4 个很酷的新项目
+COPR 仓库中 4 个很酷的新软件(2018.10)
======

-COPR是软件的个人存储库的[集合] [1],它不在标准的 Fedora 仓库中携带。某些软件不符合允许轻松打包的标准。或者它可能不符合其他 Fedora 标准,尽管它是免费和开源的。COPR 可以在标准的 Fedora 包之外提供这些项目。COPR 中的软件不受 Fedora 基础设施的支持,或者是由项目自己签名的。但是,它是尝试新的或实验性软件的一种很好的方法。
+COPR 是软件的个人存储库的[集合] [1],它包含那些不在标准的 Fedora 仓库中的软件。某些软件不符合允许轻松打包的标准。或者它可能不符合其他 Fedora 标准,尽管它是自由开源的。COPR 可以在标准的 Fedora 包之外提供这些项目。COPR 中的软件不受 Fedora 基础设施的支持,或者是由项目自己背书的。但是,它是尝试新的或实验性软件的一种很好的方法。
这是 COPR 中一组新的有趣项目。
-### GitKraken
+[编者按:这些项目里面有一个兵不适合通过 COPR 分发,所以从本文中 也删除了。相关的评论也删除了,以免误导读者。对此带来的不便,我们深表歉意。]
-[GitKraken][2] 是一个有用的 git 客户端,它适合喜欢图形界面而非命令行的用户,并提供你期望的所有功能。此外,GitKraken 可以创建仓库和文件,并具有内置编辑器。GitKraken 的一个有用功能是暂存行或者文件,并快速切换分支。但是,在某些情况下,在遇到较大项目时会有性能问题。
-
-![][3]
-
-#### 安装说明
-
-该仓库目前为 Fedora 27、28、29 、Rawhide 以及 OpenSUSE Tumbleweed 提供 GitKraken。要安装 GitKraken,请使用以下命令:
-
-```
-sudo dnf copr enable elken/gitkraken
-sudo dnf install gitkraken
-```
+(LCTT 译注:本文后来移除了对“GitKraken”项目的介绍。)
### Music On Console
-[Music On Console][4] 播放器或称为 mocp,是一个简单的控制台音频播放器。它有一个类似于 “Midnight Commander” 的界面,并且很容易使用。你只需进入包含音乐的目录,然后选择要播放的文件或目录。此外,mocp 提供了一组命令,允许直接从命令行进行控制。
+[Music On Console][4] 播放器(简称 mocp)是一个简单的控制台音频播放器。它有一个类似于 “Midnight Commander” 的界面,并且很容易使用。你只需进入包含音乐的目录,然后选择要播放的文件或目录。此外,mocp 提供了一组命令,允许直接从命令行进行控制。
![][5]
@@ -39,7 +28,7 @@ sudo dnf install moc
### cnping
-[Cnping][6]是小型的图形化 ping IPv4 工具,可用于可视化显示 RTT 的变化。它提供了一个选项来控制每个数据包之间的间隔以及发送的数据大小。除了显示的图表外,cnping 还提供 RTT 和丢包的基本统计数据。
+[Cnping][6] 是小型的图形化 ping IPv4 工具,可用于可视化显示 RTT 的变化。它提供了一个选项来控制每个数据包之间的间隔以及发送的数据大小。除了显示的图表外,cnping 还提供 RTT 和丢包的基本统计数据。
![][7]
@@ -54,7 +43,7 @@ sudo dnf install cnping
### Pdfsandwich
-[Pdfsandwich][8] 是将文本添加到图像形式的文本 PDF 文件 (如扫描书籍) 的工具。它使用光学字符识别 (OCR) 创建一个额外的图层, 包含了原始页面已识别的文本。这对于复制和处理文本很有用。
+[Pdfsandwich][8] 是将文本添加到图像形式的文本 PDF 文件 (如扫描书籍) 的工具。它使用光学字符识别 (OCR) 创建一个额外的图层, 包含了原始页面已识别的文本。这对于复制和处理文本很有用。
#### 安装说明
@@ -72,7 +61,7 @@ via: https://fedoramagazine.org/4-cool-new-projects-try-copr-october-2018/
作者:[Dominik Turecek][a]
选题:[lujun9972][b]
译者:[geekpi](https://github.com/geekpi)
-校对:[校对者ID](https://github.com/校对者ID)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/translated/tech/20181024 Get organized at the Linux command line with Calcurse.md b/published/20181024 Get organized at the Linux command line with Calcurse.md
similarity index 62%
rename from translated/tech/20181024 Get organized at the Linux command line with Calcurse.md
rename to published/20181024 Get organized at the Linux command line with Calcurse.md
index 6b6622dc5a..5d18f71ad5 100644
--- a/translated/tech/20181024 Get organized at the Linux command line with Calcurse.md
+++ b/published/20181024 Get organized at the Linux command line with Calcurse.md
@@ -1,11 +1,11 @@
使用 Calcurse 在 Linux 命令行中组织任务
======
-使用 Calcurse 了解你的日历和待办事项列表。
+> 使用 Calcurse 了解你的日历和待办事项列表。

-你是否需要复杂,功能丰富的图形或 Web 程序才能保持井井有条?我不这么认为。正确的命令行工具可以完成工作并且做得很好。
+你是否需要复杂、功能丰富的图形或 Web 程序才能保持井井有条?我不这么认为。合适的命令行工具可以完成工作并且做得很好。
当然,说出命令行这个词可能会让一些 Linux 用户感到害怕。对他们来说,命令行是未知领域。
@@ -15,54 +15,51 @@
### 获取软件
-如果你喜欢编译代码(我通常不喜欢),你可以从[Calcurse 网站][1]获取源码。否则,根据你的 Linux 发行版获取[二进制安装程序][2]。你甚至可以从 Linux 发行版的软件包管理器中获取 Calcurse。检查一下不会有错的。
+如果你喜欢编译代码(我通常不喜欢),你可以从 [Calcurse 网站][1]获取源码。否则,根据你的 Linux 发行版获取[二进制安装程序][2]。你甚至可以从 Linux 发行版的软件包管理器中获取 Calcurse。检查一下不会有错的。
编译或安装 Calcurse 后(两者都不用太长时间),你就可以开始使用了。
### 使用 Calcurse
-打开终端并输入 **calcurse**。
+打开终端并输入 `calcurse`。

Calcurse 的界面由三个面板组成:
- * 预约(屏幕左侧)
- * 日历(右上角)
- * 待办事项清单(右下角)
+ * 预约Appointments(屏幕左侧)
+ * 日历Calendar(右上角)
+ * 待办事项清单TODO(右下角)
+按键盘上的 `Tab` 键在面板之间移动。要在面板添加新项目,请按下 `a`。Calcurse 将指导你完成添加项目所需的操作。
+一个有趣的地方地是预约和日历面板配合工作。你选中日历面板并添加一个预约。在那里,你选择一个预约的日期。完成后,你回到预约面板,你就看到了。
-
-按键盘上的 Tab 键在面板之间移动。要在面板添加新项目,请按下 **a**。Calcurse 将指导你完成添加项目所需的操作。
-
-一个有趣的地方地预约和日历面板一起生效。你选中日历面板并添加一个预约。在那里,你选择一个预约的日期。完成后,你回到预约面板。我知道。。。
-
-按下 **a** 设置开始时间,持续时间(以分钟为单位)和预约说明。开始时间和持续时间是可选的。Calcurse 在它们到期的那天显示预约。
+按下 `a` 设置开始时间、持续时间(以分钟为单位)和预约说明。开始时间和持续时间是可选的。Calcurse 在它们到期的那天显示预约。

-一天的预约看起来像:
+一天的预约看起来像这样:

-待办事项列表独立运作。选中待办面板并(再次)按下 **a**。输入任务的描述,然后设置优先级(1 表示最高,9 表示最低)。Calcurse 会在待办事项面板中列出未完成的任务。
+待办事项列表独立运作。选中待办面板并(再次)按下 `a`。输入任务的描述,然后设置优先级(1 表示最高,9 表示最低)。Calcurse 会在待办事项面板中列出未完成的任务。

-如果你的任务有很长的描述,那么 Calcurse 会截断它。你可以使用键盘上的向上或向下箭头键浏览任务,然后按下 **v** 查看描述。
+如果你的任务有很长的描述,那么 Calcurse 会截断它。你可以使用键盘上的向上或向下箭头键浏览任务,然后按下 `v` 查看描述。

-Calcurse 将其信息以文本形式保存在你的主目录下名为 **.calcurse** 的隐藏文件夹中,例如 **/home/scott/.calcurse**。如果 Calcurse 停止工作,那也很容易找到你的信息。
+Calcurse 将其信息以文本形式保存在你的主目录下名为 `.calcurse` 的隐藏文件夹中,例如 `/home/scott/.calcurse`。如果 Calcurse 停止工作,那也很容易找到你的信息。
### 其他有用的功能
-Calcurse 其他的功能包括设置重复预约的功能。要执行此操作,找出要重复的预约,然后在预约面板中按下 **r**。系统会要求你设置频率(例如,每天或每周)以及你希望重复预约的时间。
+Calcurse 其他的功能包括设置重复预约的功能。要执行此操作,找出要重复的预约,然后在预约面板中按下 `r`。系统会要求你设置频率(例如,每天或每周)以及你希望重复预约的时间。
你还可以导入 [ICAL][3] 格式的日历或以 ICAL 或 [PCAL][4] 格式导出数据。使用 ICAL,你可以与其他日历程序共享数据。使用 PCAL,你可以生成日历的 Postscript 版本。
-你还可以将许多命令行参数传递给 Calcurse。你可以[在文档中][5]阅读它们。
+你还可以将许多命令行参数传递给 Calcurse。你可以[在文档中][5]了解它们。
虽然很简单,但 Calcurse 可以帮助你保持井井有条。你需要更加关注自己的任务和预约,但是你将能够更好地关注你需要做什么以及你需要做的方向。
@@ -73,7 +70,7 @@ via: https://opensource.com/article/18/10/calcurse
作者:[Scott Nesbitt][a]
选题:[lujun9972][b]
译者:[geekpi](https://github.com/geekpi)
-校对:[校对者ID](https://github.com/校对者ID)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/published/20181025 Monitoring database health and behavior- Which metrics matter.md b/published/20181025 Monitoring database health and behavior- Which metrics matter.md
new file mode 100644
index 0000000000..b8cfabc248
--- /dev/null
+++ b/published/20181025 Monitoring database health and behavior- Which metrics matter.md
@@ -0,0 +1,84 @@
+监测数据库的健康和行为:有哪些重要指标?
+======
+
+> 对数据库的监测可能过于困难或者没有找到关键点。本文将讲述如何正确的监测数据库。
+
+
+
+我们没有对数据库讨论过多少。在这个充满监测仪器的时代,我们监测我们的应用程序、基础设施、甚至我们的用户,但有时忘记我们的数据库也值得被监测。这很大程度是因为数据库表现的很好,以至于我们单纯地信任它能把任务完成的很好。信任固然重要,但能够证明它的表现确实如我们所期待的那样就更好了。
+
+
+
+### 为什么监测你的数据库?
+
+监测数据库的原因有很多,其中大多数原因与监测系统的任何其他部分的原因相同:了解应用程序的各个组件中发生的什么,会让你成为更了解情况的,能够做出明智决策的开发人员。
+
+
+
+更具体地说,数据库是系统健康和行为的重要标志。数据库中的异常行为能够指出应用程序中出现问题的区域。另外,当应用程序中有异常行为时,你可以利用数据库的指标来迅速完成排除故障的过程。
+
+### 问题
+
+最轻微的调查揭示了监测数据库的一个问题:数据库有很多指标。说“很多”只是轻描淡写,如果你是史高治Scrooge McDuck(LCTT 译注:史高治,唐老鸭的舅舅,以一毛不拔著称),你不会放过任何一个可用的指标。如果这是摔角狂热Wrestlemania 比赛,那么指标就是折叠椅。监测所有指标似乎并不实用,那么你如何决定要监测哪些指标?
+
+
+
+### 解决方案
+
+开始监测数据库的最好方式是认识一些基础的数据库指标。这些指标为理解数据库的行为创造了良好的开端。
+
+### 吞吐量:数据库做了多少?
+
+开始检测数据库的最好方法是跟踪它所接到请求的数量。我们对数据库有较高期望;期望它能稳定的存储数据,并处理我们抛给它的所有查询,这些查询可能是一天一次大规模查询,或者是来自用户一天到晚的数百万次查询。吞吐量可以告诉我们数据库是否如我们期望的那样工作。
+
+你也可以将请求按照类型(读、写、服务器端、客户端等)分组,以开始分析流量。
+
+### 执行时间:数据库完成工作需要多长时间?
+
+这个指标看起来很明显,但往往被忽视了。你不仅想知道数据库收到了多少请求,还想知道数据库在每个请求上花费了多长时间。 然而,参考上下文来讨论执行时间非常重要:像 InfluxDB 这样的时间序列数据库中的慢与像 MySQL 这样的关系型数据库中的慢不一样。InfluxDB 中的慢可能意味着毫秒,而 MySQL 的 `SLOW_QUERY` 变量的默认值是 10 秒。
+
+
+
+监测执行时间和提高执行时间不一样,所以如果你的应用程序中有其他问题需要修复,那么请注意在优化上花费时间的诱惑。
+
+### 并发性:数据库同时做了多少工作?
+
+一旦你知道数据库正在处理多少请求以及每个请求需要多长时间,你就需要添加一层复杂性以开始从这些指标中获得实际值。
+
+如果数据库接收到十个请求,并且每个请求需要十秒钟来完成,那么数据库是忙碌了 100 秒、10 秒,还是介于两者之间?并发任务的数量改变了数据库资源的使用方式。当你考虑连接和线程的数量等问题时,你将开始对数据库指标有更全面的了解。
+
+并发性还能影响延迟,这不仅包括任务完成所需的时间(执行时间),还包括任务在处理之前需要等待的时间。
+
+### 利用率:数据库繁忙的时间百分比是多少?
+
+利用率是由吞吐量、执行时间和并发性的峰值所确定的数据库可用的频率,或者数据库太忙而不能响应请求的频率。
+
+
+
+该指标对于确定数据库的整体健康和性能特别有用。如果只能在 80% 的时间内响应请求,则可以重新分配资源、进行优化工作,或者进行更改以更接近高可用性。
+
+### 好消息
+
+监测和分析似乎非常困难,特别是因为我们大多数人不是数据库专家,我们可能没有时间去理解这些指标。但好消息是,大部分的工作已经为我们做好了。许多数据库都有一个内部性能数据库(Postgres:`pg_stats`、CouchDB:`Runtime_Statistics`、InfluxDB:`_internal` 等),数据库工程师设计该数据库来监测与该特定数据库有关的指标。你可以看到像慢速查询的数量一样广泛的内容,或者像数据库中每个事件的平均微秒一样详细的内容。
+
+### 结论
+
+数据库创建了足够的指标以使我们需要长时间研究,虽然内部性能数据库充满了有用的信息,但并不总是使你清楚应该关注哪些指标。从吞吐量、执行时间、并发性和利用率开始,它们为你提供了足够的信息,使你可以开始了解你的数据库中的情况。
+
+
+
+你在监视你的数据库吗?你发现哪些指标有用?告诉我吧!
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/10/database-metrics-matter
+
+作者:[Katy Farmer][a]
+选题:[lujun9972][b]
+译者:[ChiZelin](https://github.com/ChiZelin)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/thekatertot
+[b]: https://github.com/lujun9972
diff --git a/translated/tech/20181025 Understanding Linux Links- Part 2.md b/published/20181025 Understanding Linux Links- Part 2.md
similarity index 64%
rename from translated/tech/20181025 Understanding Linux Links- Part 2.md
rename to published/20181025 Understanding Linux Links- Part 2.md
index 347a6fef82..97e551fed5 100644
--- a/translated/tech/20181025 Understanding Linux Links- Part 2.md
+++ b/published/20181025 Understanding Linux Links- Part 2.md
@@ -1,13 +1,13 @@
-理解 Linux 链接 (二)
+理解 Linux 链接(二)
======
+> 我们继续这个系列,来看一些你所不知道的微妙之处。

-在[本系列的第一篇文章中][1],我们认识了硬链接,软链接,知道在很多时候链接是非常有用的。链接看起来比较简单,但是也有一些不易察觉的奇怪的地方需要注意。这就是我们这篇文章中要讲的。例如,像一下我们在前一篇文章中创建的指向 `libblah` 的链接。请注意,我们是如何从目标文件夹中创建链接的。
+在[本系列的第一篇文章中][1],我们认识了硬链接、软链接,知道在很多时候链接是非常有用的。链接看起来比较简单,但是也有一些不易察觉的奇怪的地方需要注意。这就是我们这篇文章中要讲的。例如,像一下我们在前一篇文章中创建的指向 `libblah` 的链接。请注意,我们是如何从目标文件夹中创建链接的。
```
cd /usr/local/lib
-
ln -s /usr/lib/libblah
```
@@ -15,35 +15,32 @@ ln -s /usr/lib/libblah
```
cd /usr/lib
-
ln -s libblah /usr/local/lib
```
也就是说,从原始文件夹内到目标文件夹之间的链接将不起作用。
-出现这种情况的原因是 `ln` 会把它当作是你在 `/usr/local/lib` 中创建一个到 `/usr/local/lib` 的链接,并在 `/usr/local/lib` 中创建了从 `libblah` 到 `libblah` 的一个链接。这是因为所有链接文件获取的是文件的名称(`libblah`),而不是文件的路径,最终的结果将会产生一个坏的链接。
+出现这种情况的原因是 `ln` 会把它当作是你在 `/usr/local/lib` 中创建一个到 `/usr/local/lib` 的链接,并在 `/usr/local/lib` 中创建了从 `libblah` 到 `libblah` 的一个链接。这是因为所有链接文件获取的是文件的名称(`libblah),而不是文件的路径,最终的结果将会产生一个坏的链接。
然而,请看下面的这种情况。
```
cd /usr/lib
-
ln -s /usr/lib/libblah /usr/local/lib
```
-是可以工作的。奇怪的事情又来了,不管你在文件系统的任何位置执行指令,它都可以好好的工作。使用绝对路径,也就是说,指定整个完整的路径,从根目录(`/`)开始到需要的文件或者是文件夹,是最好的实现方式。
+是可以工作的。奇怪的事情又来了,不管你在文件系统的任何位置执行这个指令,它都可以好好的工作。使用绝对路径,也就是说,指定整个完整的路径,从根目录(`/`)开始到需要的文件或者是文件夹,是最好的实现方式。
其它需要注意的事情是,只要 `/usr/lib` 和 `/usr/local/lib` 在一个分区上,做一个如下的硬链接:
```
cd /usr/lib
-
ln libblah /usr/local/lib
```
也是可以工作的,因为硬链接不依赖于指向文件系统内的文件来工作。
-如果硬链接不起作用,那么可能是你想跨分区之间建立一个硬链接。就比如说,你有分区A上有文件 `fileA` ,并且把这个分区挂载到 `/path/to/partitionA/directory` 目录,而你又想从 `fileA` 链接到分区B上 `/path/to/partitionB/directory` 目录,这样是行不通的。
+如果硬链接不起作用,那么可能是你想跨分区之间建立一个硬链接。就比如说,你有分区 A 上有文件 `fileA` ,并且把这个分区挂载到 `/path/to/partitionA/directory` 目录,而你又想从 `fileA` 链接到分区 B 上 `/path/to/partitionB/directory` 目录,这样是行不通的。
```
ln /path/to/partitionA/directory/file /path/to/partitionB/directory
@@ -63,15 +60,15 @@ ln -s /path/to/some/directory /path/to/some/other/directory
这将在 `/path/to/some/other/directory` 中创建 `/path/to/some/directory` 的链接,没有任何问题。
-当你使用硬链接做同样的事情的时候,会提示你一个错误,说不允许那么做。而不允许这么做的原因量会导致无休止的递归:如果你在目录A中有一个目录B,然后你在目录B中链接A,就会出现同样的情况,在目录A中,目录A包含了目录B,而在目录B中又包含了A,然后又包含了B,等等无穷无尽。
+当你使用硬链接做同样的事情的时候,会提示你一个错误,说不允许那么做。而不允许这么做的原因量会导致无休止的递归:如果你在目录 A 中有一个目录 B,然后你在目录 B 中链接 A,就会出现同样的情况,在目录 A 中,目录 A 包含了目录 B,而在目录 B 中又包含了 A,然后又包含了 B,等等无穷无尽。
当然你可以在递归中使用软链接,但你为什么要那样做呢?
### 我应该使用硬链接还是软链接呢?
-通常,你可以在任何地方使用软链接做任何事情。实际上,在有些情况下你只能使用软软链接。话说回来,硬链接的效率要稍高一些:它们占用的磁盘空间更少,访问速度更快。在大多数的机器上, 发你可以忽略这一点点的差异,因为:在磁盘空间越来越大,访问速度越来越快的今天,空间和速度的差异可以忽略不计。不过,如果你是在一个有小存储和低功耗的处理器上使用嵌入式系统上使用 linux, 则可能需要考虑使用硬链接。
+通常,你可以在任何地方使用软链接做任何事情。实际上,在有些情况下你只能使用软链接。话说回来,硬链接的效率要稍高一些:它们占用的磁盘空间更少,访问速度更快。在大多数的机器上,你可以忽略这一点点的差异,因为:在磁盘空间越来越大,访问速度越来越快的今天,空间和速度的差异可以忽略不计。不过,如果你是在一个有小存储和低功耗的处理器上使用嵌入式系统上使用 Linux, 则可能需要考虑使用硬链接。
-另一个使用硬链接的原因是硬链接不容易破碎。假设你有一个软链接,而你意外的移动或者删除了它指向的文件,那么你的软链接将会破碎,并指向了一个不存在的东西。这种情况是不会发生在硬链接中的,因为硬链接直接指向的是磁盘上的数据。实际上,磁盘上的空间不不会被标记为空闲,除非最后一个指向它的硬链接把它从文件系统中擦除掉。
+另一个使用硬链接的原因是硬链接不容易损坏。假设你有一个软链接,而你意外的移动或者删除了它指向的文件,那么你的软链接将会损坏,并指向了一个不存在的东西。这种情况是不会发生在硬链接中的,因为硬链接直接指向的是磁盘上的数据。实际上,磁盘上的空间不会被标记为空闲,除非最后一个指向它的硬链接把它从文件系统中擦除掉。
软链接,在另一方面比硬链接可以做更多的事情,而且可以指向任何东西,可以是文件或目录。它也可以指向不在同一个分区上的文件和目录。仅这两个不同,我们就可以做出唯一的选择了。
@@ -79,7 +76,7 @@ ln -s /path/to/some/directory /path/to/some/other/directory
现在我们已经介绍了文件和目录以及操作它们的工具,你是否已经准备好转到这些工具,可以浏览目录层次结构,可以查找文件中的数据,也可以检查目录。这就是我们下一期中要做的事情。下期见。
-你可以通过Linux 基金会和edX [Linux 简介][2]了解更多关于Linux的免费课程。
+你可以通过 Linux 基金会和 edX “[Linux 简介][2]”了解更多关于 Linux 的免费课程。
--------------------------------------------------------------------------------
@@ -87,12 +84,12 @@ via: https://www.linux.com/blog/2018/10/understanding-linux-links-part-2
作者:[Paul Brown][a]
选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
+译者:[Jamkr](https://github.com/Jamkr)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://www.linux.com/users/bro66
[b]: https://github.com/lujun9972
-[1]: https://www.linux.com/blog/intro-to-linux/2018/10/linux-links-part-1
+[1]: https://linux.cn/article-10173-1.html
[2]: https://training.linuxfoundation.org/linux-courses/system-administration-training/introduction-to-linux
diff --git a/published/20181025 What breaks our systems- A taxonomy of black swans.md b/published/20181025 What breaks our systems- A taxonomy of black swans.md
new file mode 100644
index 0000000000..e3aa38e75a
--- /dev/null
+++ b/published/20181025 What breaks our systems- A taxonomy of black swans.md
@@ -0,0 +1,122 @@
+让系统崩溃的黑天鹅分类
+======
+
+> 在严重的故障发生之前,找到引起问题的异常事件,并修复它。
+
+
+
+黑天鹅Black swan用来比喻造成严重影响的小概率事件(比如 2008 年的金融危机)。在生产环境的系统中,黑天鹅是指这样的事情:它引发了你不知道的问题,造成了重大影响,不能快速修复或回滚,也不能用值班说明书上的其他标准响应来解决。它是事发几年后你还在给新人说起的事件。
+
+从定义上看,黑天鹅是不可预测的,不过有时候我们能找到其中的一些模式,针对有关联的某一类问题准备防御措施。
+
+例如,大部分故障的直接原因是变更(代码、环境或配置)。虽然这种方式触发的 bug 是独特的、不可预测的,但是常见的金丝雀发布对避免这类问题有一定的作用,而且自动回滚已经成了一种标准止损策略。
+
+随着我们的专业性不断成熟,一些其他的问题也正逐渐变得容易理解,被归类到某种风险并有普适的预防策略。
+
+### 公布出来的黑天鹅事件
+
+所有科技公司都有生产环境的故障,只不过并不是所有公司都会分享他们的事故分析。那些公开讨论事故的公司帮了我们的忙。下列事故都描述了某一类问题,但它们绝对不是只一个孤例。我们的系统中都有黑天鹅在潜伏着,只是有些人还不知道而已。
+
+#### 达到上限
+
+达到任何类型的限制都会引发严重事故。这类问题的一个典型例子是 2017 年 2 月 [Instapaper 的一次服务中断][1]。我把这份事故报告给任何一个运维工作者看,他们读完都会脊背发凉。Instapaper 生产环境的数据库所在的文件系统有 2 TB 的大小限制,但是数据库服务团队并不知情。在没有任何报错的情况下,数据库不再接受任何写入了。完全恢复需要好几天,而且还得迁移数据库。
+
+资源限制有各式各样的触发场景。Sentry 遇到了 [Postgres 的最大事务 ID 限制][2]。Platform.sh 遇到了[管道缓冲区大小限制][3]。SparkPost [触发了 AWS 的 DDoS 保护][4]。Foursquare 在他们的一个 [MongoDB 耗尽内存][5]时遭遇了性能骤降。
+
+提前了解系统限制的一个办法是定期做测试。好的压力测试(在生产环境的副本上做)应该包含写入事务,并且应该把每一种数据存储都写到超过当前生产环境的容量。压力测试时很容易忽略的是次要存储(比如 Zookeeper)。如果你是在测试时遇到了资源限制,那么你还有时间去解决问题。鉴于这种资源限制问题的解决方案可能涉及重大的变更(比如数据存储拆分),所以时间是非常宝贵的。
+
+说到云产品的使用,如果你的服务产生了异常的负载,或者你用的产品或功能还没有被广泛使用(比如老旧的或者新兴的),那么你遇到资源上限的风险很大。对这些云产品做一下压力测试是值得的。不过,做之前要提醒一下你的云服务提供商。
+
+最后,知道了哪里有限制之后,要增加监控(和对应文档),这样你才能知道系统在什么时候接近了资源上限。不要寄希望于那些还在维护服务的人会记得。
+
+#### 扩散的慢请求
+
+> “这个世界的关联性远比我们想象中更大。所以我们看到了更多 Nassim Taleb 所说的‘黑天鹅事件’ —— 即罕见事件以更高的频率离谱地发生了,因为世界是相互关联的”
+> —— [Richard Thaler][6]
+
+HostedGraphite 的负载均衡器并没有托管在 AWS 上,却[被 AWS 的服务中断给搞垮了][7],他们关于这次事故原因的分析报告很好地诠释了分布式计算系统之间存在多么大的关联。在这个事件里,负载均衡器的连接池被来自 AWS 上的客户访问占满了,因为这些连接很耗时。同样的现象还会发生在应用的线程、锁、数据库连接上 —— 任何能被慢操作占满的资源。
+
+这个 HostedGraphite 的例子中,慢速连接是外部系统施加的,不过慢速连接经常是由内部某个系统的饱和所引起的,饱和与慢操作的级联,拖慢了系统中的其他部分。[Spotify 的一个事故][8]就说明了这样的传播 —— 流媒体服务的前端被另一个微服务的饱和所影响,造成健康检查失败。强制给所有请求设置超时时间,以及限制请求队列的长度,可以预防这一类故障传播。这样即使有问题,至少你的服务还能承担一些流量,而且因为整体上你的系统里故障的部分更少了,恢复起来也会更快。
+
+重试的间隔应该用指数退避来限制一下,并加入一些时间抖动。Square 有一次服务中断是 [Redis 存储的过载][9],原因是有一段代码对失败的事务重试了 500 次,没有任何重试退避的方案,也说明了过度重试的潜在风险。另外,针对这种情况,[断路器][10]设计模式也是有用的。
+
+应该设计出监控仪表盘来清晰地展示所有资源的[使用率、饱和度和报错][11],这样才能快速发现问题。
+
+#### 突发的高负载
+
+系统在异常高的负载下经常会发生故障。用户天然会引发高负载,不过也常常是由系统引发的。午夜突发的 cron 定时任务是老生常谈了。如果程序让移动客户端同时去获取更新,这些客户端也会造成突发的大流量(当然,给这种请求加入时间抖动会好很多)。
+
+在预定时刻同时发生的事件并不是突发大流量的唯一原因。Slack 经历过一次短时间内的[多次服务中断][12],原因是非常多的客户端断开连接后立即重连,造成了突发的大负载。 CircleCI 也经历过一次[严重的服务中断][13],当时 Gitlab 从故障中恢复了,所以数据库里积累了大量的构建任务队列,服务变得饱和而且缓慢。
+
+几乎所有的服务都会受突发的高负载所影响。所以对这类可能出现的事情做应急预案 —— 并测试一下预案能否正常工作 —— 是必须的。客户端退避和[减载][14]通常是这些方案的核心。
+
+如果你的系统必须不间断地接收数据,并且数据不能被丢掉,关键是用可伸缩的方式把数据缓冲到队列中,后续再处理。
+
+#### 自动化系统是复杂的系统
+
+> “复杂的系统本身就是有风险的系统”
+> —— [Richard Cook, MD][15]
+
+过去几年里软件的运维操作趋势是更加自动化。任何可能降低系统容量的自动化操作(比如擦除磁盘、退役设备、关闭服务)都应该谨慎操作。这类自动化操作的故障(由于系统有 bug 或者有不正确的调用)能很快地搞垮你的系统,而且可能很难恢复。
+
+谷歌的 Christina Schulman 和 Etienne Perot 在[用安全规约协助保护你的数据中心][16]的演讲中给了一些例子。其中一次事故是将谷歌整个内部的内容分发网络(CDN)提交给了擦除磁盘的自动化系统。
+
+Schulman 和 Perot 建议使用一个中心服务来管理规约,限制破坏性自动化操作的速度,并能感知到系统状态(比如避免在最近有告警的服务上执行破坏性的操作)。
+
+自动化系统在与运维人员(或其他自动化系统)交互时,也可能造成严重事故。[Reddit][17] 遭遇过一次严重的服务中断,当时他们的自动化系统重启了一个服务,但是这个服务是运维人员停掉做维护的。一旦有了多个自动化系统,它们之间潜在的交互就变得异常复杂和不可预测。
+
+所有的自动化系统都把日志输出到一个容易搜索的中心存储上,能帮助到对这类不可避免的意外情况的处理。自动化系统总是应该具备这样一种机制,即允许快速地关掉它们(完全关掉或者只关掉其中一部分操作或一部分目标)。
+
+### 防止黑天鹅事件
+
+可能在等着击垮系统的黑天鹅可不止上面这些。有很多其他的严重问题是能通过一些技术来避免的,像金丝雀发布、压力测试、混沌工程、灾难测试和模糊测试 —— 当然还有冗余性和弹性的设计。但是即使用了这些技术,有时候你的系统还是会有故障。
+
+为了确保你的组织能有效地响应,在服务中断期间,请保证关键技术人员和领导层有办法沟通协调。例如,有一种你可能需要处理的烦人的事情,那就是网络完全中断。拥有故障时仍然可用的通信通道非常重要,这个通信通道要完全独立于你们自己的基础设施及对其的依赖。举个例子,假如你使用 AWS,那么把故障时可用的通信服务部署在 AWS 上就不明智了。在和你的主系统无关的地方,运行电话网桥或 IRC 服务器是比较好的方案。确保每个人都知道这个通信平台,并练习使用它。
+
+另一个原则是,确保监控和运维工具对生产环境系统的依赖尽可能的少。将控制平面和数据平面分开,你才能在系统不健康的时候做变更。不要让数据处理和配置变更或监控使用同一个消息队列,比如,应该使用不同的消息队列实例。在 [SparkPost: DNS 挂掉的那一天][4] 这个演讲中,Jeremy Blosser 讲了一个这类例子,很关键的工具依赖了生产环境的 DNS 配置,但是生产环境的 DNS 出了问题。
+
+### 对抗黑天鹅的心理学
+
+处理生产环境的重大事故时会产生很大的压力。为这些场景制定结构化的事故管理流程确实是有帮助的。很多科技公司([包括谷歌][18])成功地使用了联邦应急管理局事故指挥系统的某个版本。对于每一个值班的人,遇到了他们无法独立解决的重大问题时,都应该有一个明确的寻求协助的方法。
+
+对于那些持续很长时间的事故,有一点很重要,要确保工程师不会连续工作到不合理的时长,确保他们不会不吃不睡(没有报警打扰的睡觉)。疲惫不堪的工程师很容易犯错或者漏掉了可能更快解决故障的信息。
+
+### 了解更多
+
+关于黑天鹅(或者以前的黑天鹅)事件以及应对策略,还有很多其他的事情可以说。如果你想了解更多,我强烈推荐你去看这两本书,它们是关于生产环境中的弹性和稳定性的:Susan Fowler 写的《[生产微服务][19]》,还有 Michael T. Nygard 的 《[Release It!][20]》。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/10/taxonomy-black-swans
+
+作者:[Laura Nolan][a]
+选题:[lujun9972][b]
+译者:[BeliteX](https://github.com/belitex)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/lauranolan
+[b]: https://github.com/lujun9972
+[1]: https://medium.com/making-instapaper/instapaper-outage-cause-recovery-3c32a7e9cc5f
+[2]: https://blog.sentry.io/2015/07/23/transaction-id-wraparound-in-postgres.html
+[3]: https://medium.com/@florian_7764/technical-post-mortem-of-the-august-incident-82ab4c3d6547
+[4]: https://www.usenix.org/conference/srecon18americas/presentation/blosser
+[5]: https://groups.google.com/forum/#!topic/mongodb-user/UoqU8ofp134
+[6]: https://en.wikipedia.org/wiki/Richard_Thaler
+[7]: https://blog.hostedgraphite.com/2018/03/01/spooky-action-at-a-distance-how-an-aws-outage-ate-our-load-balancer/
+[8]: https://labs.spotify.com/2013/06/04/incident-management-at-spotify/
+[9]: https://medium.com/square-corner-blog/incident-summary-2017-03-16-2f65be39297
+[10]: https://en.wikipedia.org/wiki/Circuit_breaker_design_pattern
+[11]: http://www.brendangregg.com/usemethod.html
+[12]: https://slackhq.com/this-was-not-normal-really
+[13]: https://circleci.statuspage.io/incidents/hr0mm9xmm3x6
+[14]: https://www.youtube.com/watch?v=XNEIkivvaV4
+[15]: https://web.mit.edu/2.75/resources/random/How%20Complex%20Systems%20Fail.pdf
+[16]: https://www.usenix.org/conference/srecon18americas/presentation/schulman
+[17]: https://www.reddit.com/r/announcements/comments/4y0m56/why_reddit_was_down_on_aug_11/
+[18]: https://landing.google.com/sre/book/chapters/managing-incidents.html
+[19]: http://shop.oreilly.com/product/0636920053675.do
+[20]: https://www.oreilly.com/library/view/release-it/9781680500264/
+[21]: https://www.usenix.org/conference/lisa18/presentation/nolan
+[22]: https://www.usenix.org/conference/lisa18
diff --git a/translated/tech/20181026 Ultimate Plumber - Writing Linux Pipes With Instant Live Preview.md b/published/20181026 Ultimate Plumber - Writing Linux Pipes With Instant Live Preview.md
similarity index 60%
rename from translated/tech/20181026 Ultimate Plumber - Writing Linux Pipes With Instant Live Preview.md
rename to published/20181026 Ultimate Plumber - Writing Linux Pipes With Instant Live Preview.md
index 0c94e132c7..655d66dfbf 100644
--- a/translated/tech/20181026 Ultimate Plumber - Writing Linux Pipes With Instant Live Preview.md
+++ b/published/20181026 Ultimate Plumber - Writing Linux Pipes With Instant Live Preview.md
@@ -3,33 +3,34 @@

-管道命令的作用是将一个命令/程序/进程的输出发送给另一个命令/程序/进程,以便将输出结果进行进一步的处理。我们可以通过使用管道命令把多个命令组合起来,使一个命令的标准输入或输出重定向到另一个命令。两个或多个 Linux 命令之间的竖线字符(|)表示在命令之间使用管道命令。管道命令的一般语法如下所示:
+管道命令的作用是将一个命令/程序/进程的输出发送给另一个命令/程序/进程,以便将输出结果进行进一步的处理。我们可以通过使用管道命令把多个命令组合起来,使一个命令的标准输入或输出重定向到另一个命令。两个或多个 Linux 命令之间的竖线字符(`|`)表示在命令之间使用管道命令。管道命令的一般语法如下所示:
```
Command-1 | Command-2 | Command-3 | …| Command-N
```
-`Ultimate Plumber`(简称 `UP`)是一个命令行工具,它可以用于即时预览管道命令结果。如果你在使用 Linux 时经常会用到管道命令,就可以通过它更好地运用管道命令了。它可以预先显示执行管道命令后的结果,而且是即时滚动地显示,让你可以轻松构建复杂的管道。
+Ultimate Plumber(简称 UP)是一个命令行工具,它可以用于即时预览管道命令结果。如果你在使用 Linux 时经常会用到管道命令,就可以通过它更好地运用管道命令了。它可以预先显示执行管道命令后的结果,而且是即时滚动地显示,让你可以轻松构建复杂的管道。
-下文将会介绍如何安装 `UP` 并用它将复杂管道命令的编写变得简单。
+下文将会介绍如何安装 UP 并用它将复杂管道命令的编写变得简单。
**重要警告:**
-在生产环境中请谨慎使用 `UP`!在使用它的过程中,有可能会在无意中删除重要数据,尤其是搭配 `rm` 或 `dd` 命令时需要更加小心。勿谓言之不预。
+在生产环境中请谨慎使用 UP!在使用它的过程中,有可能会在无意中删除重要数据,尤其是搭配 `rm` 或 `dd` 命令时需要更加小心。勿谓言之不预。
### 使用 Ultimate Plumber 即时预览管道命令
-下面给出一个简单的例子介绍 `UP` 的使用方法。如果需要将 `lshw` 命令的输出传递给 `UP`,只需要在终端中输入以下命令,然后回车:
+下面给出一个简单的例子介绍 `up` 的使用方法。如果需要将 `lshw` 命令的输出传递给 `up`,只需要在终端中输入以下命令,然后回车:
```
$ lshw |& up
```
你会在屏幕顶部看到一个输入框,如下图所示。
+

-在输入命令的过程中,输入管道符号并回车,就可以立即执行已经输入了的命令。`Ultimate Plumber` 会在下方的可滚动窗口中即时显示管道命令的输出。在这种状态下,你可以通过 `PgUp`/`PgDn` 键或 `ctrl + ←`/`ctrl + →` 组合键来查看结果。
+在输入命令的过程中,输入管道符号并回车,就可以立即执行已经输入了的命令。Ultimate Plumber 会在下方的可滚动窗口中即时显示管道命令的输出。在这种状态下,你可以通过 `PgUp`/`PgDn` 键或 `ctrl + ←`/`ctrl + →` 组合键来查看结果。
当你满意执行结果之后,可以使用 `ctrl + x` 组合键退出 `UP`。而退出前编写的管道命令则会保存在当前工作目录的文件中,并命名为 `up1.sh`。如果这个文件名已经被占用,就会命名为 `up2.sh`、`up3.sh` 等等以此类推,直到第 1000 个文件。如果你不需要将管道命令保存输出,只需要使用 `ctrl + c` 组合键退出即可。
@@ -41,29 +42,29 @@ $ cat up2.sh
grep network -A5 | grep : | cut -d: -f2- | paste - -
```
-如果通过管道发送到 `UP` 的命令运行时间太长,终端窗口的左上角会显示一个波浪号(~)字符,这就表示 `UP` 在等待前一个命令的输出结果作为输入。在这种情况下,你可能需要使用 `ctrl + s` 组合键暂时冻结 `UP` 的输入缓冲区大小。在需要解冻的时候,使用 `ctrl + q` 组合键即可。`Ultimate Plumber` 的输入缓冲区大小一般为 40 MB,到达这个限制之后,屏幕的左上角会显示一个加号。
+如果通过管道发送到 `up` 的命令运行时间太长,终端窗口的左上角会显示一个波浪号(~)字符,这就表示 `up` 在等待前一个命令的输出结果作为输入。在这种情况下,你可能需要使用 `ctrl + s` 组合键暂时冻结 `up` 的输入缓冲区大小。在需要解冻的时候,使用 `ctrl + q` 组合键即可。Ultimate Plumber 的输入缓冲区大小一般为 40 MB,到达这个限制之后,屏幕的左上角会显示一个加号。
+
+以下是 `up` 命令的一个简单演示:
-以下是 `UP` 命令的一个简单演示:

### 安装 Ultimate Plumber
-喜欢这个工具的话,你可以在你的 Linux 系统上安装使用。安装过程也相当简单,只需要在终端里执行以下两个命令就可以安装 `UP` 了。
+喜欢这个工具的话,你可以在你的 Linux 系统上安装使用。安装过程也相当简单,只需要在终端里执行以下两个命令就可以安装 `up` 了。
-首先从 Ultimate Plumber 的[发布页面][1]下载最新的二进制文件,并将放在你系统的某个路径下,例如`/usr/local/bin/`。
+首先从 Ultimate Plumber 的[发布页面][1]下载最新的二进制文件,并将放在你系统的某个路径下,例如 `/usr/local/bin/`。
```
$ sudo wget -O /usr/local/bin/up wget https://github.com/akavel/up/releases/download/v0.2.1/up
```
-然后向 `UP` 二进制文件赋予可执行权限:
+然后向 `up` 二进制文件赋予可执行权限:
```
$ sudo chmod a+x /usr/local/bin/up
```
-至此,你已经完成了 `UP` 的安装,可以开始编写你的管道命令了。
-
+至此,你已经完成了 `up` 的安装,可以开始编写你的管道命令了。
--------------------------------------------------------------------------------
@@ -73,7 +74,7 @@ via: https://www.ostechnix.com/ultimate-plumber-writing-linux-pipes-with-instant
作者:[SK][a]
选题:[lujun9972][b]
译者:[HankChow](https://github.com/HankChow)
-校对:[校对者ID](https://github.com/校对者ID)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/translated/tech/20181027 Design faster web pages, part 3- Font and CSS tweaks.md b/published/20181027 Design faster web pages, part 3- Font and CSS tweaks.md
similarity index 89%
rename from translated/tech/20181027 Design faster web pages, part 3- Font and CSS tweaks.md
rename to published/20181027 Design faster web pages, part 3- Font and CSS tweaks.md
index c6a6e044eb..e0b157c37a 100644
--- a/translated/tech/20181027 Design faster web pages, part 3- Font and CSS tweaks.md
+++ b/published/20181027 Design faster web pages, part 3- Font and CSS tweaks.md
@@ -1,11 +1,11 @@
-设计更快的网页(三):字体和 CSS 转换
+设计更快的网页(三):字体和 CSS 调整
======

-欢迎回到我们为了构建更快网页所写的系列文章。本系列的[第一][1]和[第二][2]部分讲述了如何通过优化和替换图片来减少浏览器脂肪。本部分会着眼于在 CSS([层叠式样式表][3])和字体中减掉更多的脂肪。
+欢迎回到我们为了构建更快网页所写的系列文章。本系列的[第一部分][1]和[第二部分][2]讲述了如何通过优化和替换图片来减少浏览器脂肪。本部分会着眼于在 CSS([层叠式样式表][3])和字体中减掉更多的脂肪。
-### CSS 转换
+### 调整 CSS
首先,我们先来看看问题的源头。CSS 的出现曾是技术的一大进步。你可以用一个集中式的样式表来装饰多个网页。如今很多 Web 开发者都会使用 Bootstrap 这样的框架。
@@ -35,7 +35,7 @@ Font-awesome CSS 代表了包含未使用样式的极端。这个页面中只用
current free version 912 glyphs/icons, smallest set ttf 30.9KB, woff 14.7KB, woff2 12.2KB, svg 107.2KB, eot 31.2
```
-所以问题是,你需要所有的字形吗?很可能不需要。你可以通过 [FontForge][10] 来摆脱这些无用字形,但这需要很大的工作量。你还可以用 [Fontello][11]. 你可以使用公共实例,也可以配置你自己的版本,因为它是自由软件,可以在 [Github][12] 上找到。
+所以问题是,你需要所有的字形吗?很可能不需要。你可以通过 [FontForge][10] 来去除这些无用字形,但这需要很大的工作量。你还可以用 [Fontello][11]. 你可以使用公共实例,也可以配置你自己的版本,因为它是自由软件,可以在 [Github][12] 上找到。
这种自定义字体集的缺点在于,你必须自己来托管字体文件。你也没法使用其它在线服务来提供更新。但与更快的性能相比,这可能算不上一个缺点。
@@ -53,14 +53,14 @@ via: https://fedoramagazine.org/design-faster-web-pages-part-3-font-css-tweaks/
作者:[Sirko Kemter][a]
选题:[lujun9972][b]
译者:[StdioA](https://github.com/StdioA)
-校对:[校对者ID](https://github.com/校对者ID)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://fedoramagazine.org/author/gnokii/
[b]: https://github.com/lujun9972
-[1]: https://fedoramagazine.org/design-faster-web-pages-part-1-image-compression/
-[2]: https://fedoramagazine.org/design-faster-web-pages-part-2-image-replacement/
+[1]: https://linux.cn/article-10166-1.html
+[2]: https://linux.cn/article-10217-1.html
[3]: https://en.wikipedia.org/wiki/Cascading_Style_Sheets
[4]: https://getfedora.org
[5]: https://fedoramagazine.org/wp-content/uploads/2018/02/CSS_delivery_tool_-_Examine_how_a_page_uses_CSS_-_2018-02-24_15.00.46.png
diff --git a/translated/tech/20181029 Machine learning with Python- Essential hacks and tricks.md b/published/20181029 Machine learning with Python- Essential hacks and tricks.md
similarity index 71%
rename from translated/tech/20181029 Machine learning with Python- Essential hacks and tricks.md
rename to published/20181029 Machine learning with Python- Essential hacks and tricks.md
index 1685c700ad..34901c542d 100644
--- a/translated/tech/20181029 Machine learning with Python- Essential hacks and tricks.md
+++ b/published/20181029 Machine learning with Python- Essential hacks and tricks.md
@@ -1,32 +1,28 @@
Python 机器学习的必备技巧
======
+
> 尝试使用 Python 掌握机器学习、人工智能和深度学习。

-想要入门机器学习并不难。除了大规模网络公开课Massive Open Online Courses(MOOCs)之外,还有很多其它优秀的免费资源。下面我分享一些我觉得比较有用的方法。
+想要入门机器学习并不难。除了大规模网络公开课Massive Open Online Courses(MOOC)之外,还有很多其它优秀的免费资源。下面我分享一些我觉得比较有用的方法。
- 1. 阅览一些关于这方面的视频、文章或者书籍,例如 [The Master Algorithm: How the Quest for the Ultimate Learning Machine Will Remake Our World][29],你肯定会喜欢这些[关于机器学习的互动页面][30]。
-
- 2. 对于“机器学习”、“人工智能”、“深度学习”、“数据科学”、“计算机视觉”和“机器人技术”这一堆新名词,你需要知道它们之前的区别。你可以阅览这些领域的专家们的演讲,例如[数据科学家 Brandon Rohrer 的这个视频][1]。
-
- 3. 明确你自己的学习目标,并选择合适的 [Coursera 课程][3],或者参加高校的网络公开课。例如[华盛顿大学的课程][4]就很不错。
-
- 4. 关注优秀的博客:例如 [KDnuggets][32] 的博客、[Mark Meloon][33] 的博客、[Brandon Rohrer][34] 的博客、[Open AI][35] 的博客,这些都值得推荐。
-
- 5. 如果你对在线课程有很大兴趣,后文中会有如何[正确选择 MOOC 课程][31]的指导。
-
- 6. 最重要的是,培养自己对这些技术的兴趣。加入一些优秀的社交论坛,专注于阅读和了解,将这些技术的背景知识和发展方向理解透彻,并积极思考在日常生活和工作中如何应用机器学习或数据科学的原理。例如建立一个简单的回归模型来预测下一次午餐的成本,又或者是从电力公司的网站上下载历史电费数据,在 Excel 中进行简单的时序分析以发现某种规律。在你对这些技术产生了浓厚兴趣之后,可以观看以下这个视频。
+1. 从一些 YouTube 上的好视频开始,阅览一些关于这方面的文章或者书籍,例如 《[主算法:终极学习机器的探索将如何重塑我们的世界][29]》,而且我觉得你肯定会喜欢这些[关于机器学习的很酷的互动页面][30]。
+2. 对于“机器学习machine learning”、“人工智能artificial intelligence”、“深度学习deep learning”、“数据科学data science”、“计算机视觉computer vision”和“机器人技术robotics”这一堆新名词,你需要知道它们之间的区别。你可以阅览或聆听这些领域的专家们的演讲,例如这位有影响力的[数据科学家 Brandon Rohrer 的精彩视频][1]。或者这个讲述了数据科学相关的[各种角色之间的区别][2]的视频。
+3. 明确你自己的学习目标,并选择合适的 [Coursera 课程][3],或者参加高校的网络公开课,例如[华盛顿大学的课程][4]就很不错。
+4. 关注优秀的博客:例如 [KDnuggets][32] 的博客、[Mark Meloon][33] 的博客、[Brandon Rohrer][34] 的博客、[Open AI][35] 的研究博客,这些都值得推荐。
+5. 如果你热衷于在线课程,后文中会有如何[正确选择 MOOC 课程][31]的指导。
+6. 最重要的是,培养自己对这些技术的兴趣。加入一些优秀的社交论坛,不要被那些耸人听闻的头条和新闻所吸引,专注于阅读和了解,将这些技术的背景知识和发展方向理解透彻,并积极思考在日常生活和工作中如何应用机器学习或数据科学的原理。例如建立一个简单的回归模型来预测下一次午餐的成本,又或者是从电力公司的网站上下载历史电费数据,在 Excel 中进行简单的时序分析以发现某种规律。在你对这些技术产生了浓厚兴趣之后,可以观看以下这个视频。
### Python 是机器学习和人工智能方面的最佳语言吗?
-除非你是一名专业的研究一些复杂算法纯理论证明的研究人员,否则,对于一个机器学习的入门者来说,需要熟悉至少一种高级编程语言一家相关的专业知识。因为大多数情况下都是需要考虑如何将机器学习算法应用于解决实际问题,而这需要有一定的编程能力作为基础。
+除非你是一名专业的研究一些复杂算法纯理论证明的研究人员,否则,对于一个机器学习的入门者来说,需要熟悉至少一种高级编程语言。因为大多数情况下都是需要考虑如何将现有的机器学习算法应用于解决实际问题,而这需要有一定的编程能力作为基础。
-哪一种语言是数据科学的最佳语言?这个讨论一直没有停息过。对于这方面,你可以提起精神来看一下 FreeCodeCamp 上这一篇关于[数据科学语言][6]的文章,又或者是 KDnuggets 关于 [Python 和 R][7] 之间的深入探讨。
+哪一种语言是数据科学的最佳语言?这个讨论一直没有停息过。对于这方面,你可以提起精神来看一下 FreeCodeCamp 上这一篇关于[数据科学语言][6]的文章,又或者是 KDnuggets 关于 [Python 和 R 之争][7]的深入探讨。
-目前人们普遍认为 Python 在开发、部署、维护各方面的效率都是比较高的。与 Java、C 和 C++ 这些较为传统的语言相比,Python 的语法更为简单和高级。而且 Python 拥有活跃的社区群体、广泛的开源文化、数百个专用于机器学习的优质代码库,以及来自业界巨头(包括Google、Dropbox、Airbnb 等)的强大技术支持。
+目前人们普遍认为 Python 在开发、部署、维护各方面的效率都是比较高的。与 Java、C 和 C++ 这些较为传统的语言相比,Python 的语法更为简单和高级。而且 Python 拥有活跃的社区群体、广泛的开源文化、数百个专用于机器学习的优质代码库,以及来自业界巨头(包括 Google、Dropbox、Airbnb 等)的强大技术支持。
### 基础 Python 库
@@ -46,7 +42,7 @@ Pandas 是 Python 生态中用于进行通用数据分析的最受欢迎的库
* 选择数据子集
* 跨行列计算
* 查找并补充缺失的数据
- * 将操作应用于数据中的独立组
+ * 将操作应用于数据中的独立分组
* 按照多种格式转换数据
* 组合多个数据集
* 高级时间序列功能
@@ -68,7 +64,7 @@ Pandas 是 Python 生态中用于进行通用数据分析的最受欢迎的库
#### Scikit-learn
-Scikit-learn 是机器学习方面通用的重要 Python 包。它实现了多种[分类][16]、[回归][17]和[聚类][18]算法,包括[支持向量机][19]、[随机森林][20]、[梯度增强][21]、[k-means 算法][22]和 [DBSCAN 算法][23],可以与 Python 的数值库 NumPy 和科学计算库 [SciPy][24] 结合使用。它通过兼容的接口提供了有监督和无监督的学习算法。Scikit-learn 的强壮性让它可以稳定运行在生产环境中,同时它在易用性、代码质量、团队协作、文档和性能等各个方面都有良好的表现。可以参考这篇基于 Scikit-learn 的[机器学习入门][25],或者这篇基于 Scikit-learn 的[简单机器学习用例演示][26]。
+Scikit-learn 是机器学习方面通用的重要 Python 包。它实现了多种[分类][16]、[回归][17]和[聚类][18]算法,包括[支持向量机][19]、[随机森林][20]、[梯度增强][21]、[k-means 算法][22]和 [DBSCAN 算法][23],可以与 Python 的数值库 NumPy 和科学计算库 [SciPy][24] 结合使用。它通过兼容的接口提供了有监督和无监督的学习算法。Scikit-learn 的强壮性让它可以稳定运行在生产环境中,同时它在易用性、代码质量、团队协作、文档和性能等各个方面都有良好的表现。可以参考[这篇基于 Scikit-learn 的机器学习入门][25],或者[这篇基于 Scikit-learn 的简单机器学习用例演示][26]。
本文使用 [CC BY-SA 4.0][28] 许可,在 [Heartbeat][27] 上首发。
@@ -79,7 +75,7 @@ via: https://opensource.com/article/18/10/machine-learning-python-essential-hack
作者:[Tirthajyoti Sarkar][a]
选题:[lujun9972][b]
译者:[HankChow](https://github.com/HankChow)
-校对:[校对者ID](https://github.com/校对者ID)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/published/20181030 How Do We Find Out The Installed Packages Came From Which Repository.md b/published/20181030 How Do We Find Out The Installed Packages Came From Which Repository.md
new file mode 100644
index 0000000000..f675342f6f
--- /dev/null
+++ b/published/20181030 How Do We Find Out The Installed Packages Came From Which Repository.md
@@ -0,0 +1,367 @@
+我们如何得知安装的包来自哪个仓库?
+==========
+
+有时候你可能想知道安装的软件包来自于哪个仓库。这将帮助你在遇到包冲突问题时进行故障排除。
+
+因为[第三方仓库][1]拥有最新版本的软件包,所以有时候当你试图安装一些包的时候会出现兼容性的问题。
+
+在 Linux 上一切都是可能的,因为你可以安装一个即使在你的发行版系统上不能使用的包。
+
+你也可以安装一个最新版本的包,即使你的发行版系统仓库还没有这个版本,怎么做到的呢?
+
+这就是为什么出现了第三方仓库。它们允许用户从库中安装所有可用的包。
+
+几乎所有的发行版系统都允许第三方软件库。一些发行版还会官方推荐一些不会取代基础仓库的第三方仓库,例如 CentOS 官方推荐安装 [EPEL 库][2]。
+
+下面是常用的仓库列表和它们的详细信息。
+
+ * CentOS: [EPEL][2]、[ELRepo][3] 等是 [Centos 社区认证仓库](4)。
+ * Fedora: [RPMfusion 仓库][5] 是经常被很多 [Fedora][6] 用户使用的仓库。
+ * ArchLinux: ArchLinux 社区仓库包含了来自于 Arch 用户仓库的可信用户审核通过的软件包。
+ * openSUSE: [Packman 仓库][7] 为 openSUSE 提供了各种附加的软件包,特别是但不限于那些在 openSUSE Build Service 应用黑名单上的与多媒体相关的应用和库。它是 openSUSE 软件包的最大外部软件库。
+ * Ubuntu:个人软件包归档(PPA)是一种软件仓库。开发者们可以创建这种仓库来分发他们的软件。你可以在 PPA 导航页面找到相关信息。同时,你也可以启用 Cananical 合作伙伴软件仓库。
+
+### 仓库是什么?
+
+软件仓库是存储特定的应用程序的软件包的集中场所。
+
+所有的 Linux 发行版都在维护他们自己的仓库,并允许用户在他们的机器上获取和安装包。
+
+每个厂商都提供了各自的包管理工具来管理它们的仓库,例如搜索、安装、更新、升级、删除等等。
+
+除了 RHEL 和 SUSE 以外大部分 Linux 发行版都是自由软件。要访问付费的仓库,你需要购买其订阅服务。
+
+### 为什么我们需要启用第三方仓库?
+
+在 Linux 里,并不建议从源代码安装包,因为这样做可能会在升级软件和系统的时候产生很多问题,这也是为什么我们建议从库中安装包而不是从源代码安装。
+
+### 在 RHEL/CentOS 系统上我们如何得知安装的软件包来自哪个仓库?
+
+这可以通过很多方法实现。我们会给你所有可能的选择,你可以选择一个对你来说最合适的。
+
+#### 方法-1:使用 yum 命令
+
+RHEL 和 CentOS 系统使用 RPM 包,因此我们能够使用 [Yum 包管理器][8] 来获得信息。
+
+YUM 即 “Yellodog Updater, Modified” 是适用于基于 RPM 的系统例如 RHEL 和 CentOS 的一个开源命令行前端包管理工具。
+
+`yum` 是从发行版仓库和其他第三方库中获取、安装、删除、查询和管理 RPM 包的一个主要工具。
+
+```
+# yum info apachetop
+Loaded plugins: fastestmirror
+Loading mirror speeds from cached hostfile
+ * epel: epel.mirror.constant.com
+Installed Packages
+Name : apachetop
+Arch : x86_64
+Version : 0.15.6
+Release : 1.el7
+Size : 65 k
+Repo : installed
+From repo : epel
+Summary : A top-like display of Apache logs
+URL : https://github.com/tessus/apachetop
+License : BSD
+Description : ApacheTop watches a logfile generated by Apache (in standard common or
+ : combined logformat, although it doesn't (yet) make use of any of the extra
+ : fields in combined) and generates human-parsable output in realtime.
+```
+
+`apachetop` 包来自 EPEL 仓库。
+
+#### 方法-2:使用 yumdb 命令
+
+`yumdb info` 提供了类似于 `yum info` 的信息但是它又提供了包校验和数据、类型、用户信息(谁安装的软件包)。从 yum 3.2.26 开始,yum 已经开始在 rpmdatabase 之外存储额外的信息(user 表示软件是用户安装的,dep 表示它是作为依赖项引入的)。
+
+```
+# yumdb info lighttpd
+Loaded plugins: fastestmirror
+lighttpd-1.4.50-1.el7.x86_64
+ checksum_data = a24d18102ed40148cfcc965310a516050ed437d728eeeefb23709486783a4d37
+ checksum_type = sha256
+ command_line = --enablerepo=epel install lighttpd apachetop aria2 atop axel
+ from_repo = epel
+ from_repo_revision = 1540756729
+ from_repo_timestamp = 1540757483
+ installed_by = 0
+ origin_url = https://epel.mirror.constant.com/7/x86_64/Packages/l/lighttpd-1.4.50-1.el7.x86_64.rpm
+ reason = user
+ releasever = 7
+ var_contentdir = centos
+ var_infra = stock
+ var_uuid = ce328b07-9c0a-4765-b2ad-59d96a257dc8
+```
+
+`lighttpd` 包来自 EPEL 仓库。
+
+#### 方法-3:使用 rpm 命令
+
+[RPM 命令][9] 即 “Red Hat Package Manager” 是一个适用于基于 Red Hat 的系统(例如 RHEL、CentOS、Fedora、openSUSE & Mageia)的强大的命令行包管理工具。
+
+这个工具允许你在你的 Linux 系统/服务器上安装、更新、移除、查询和验证软件。RPM 文件具有 .rpm 后缀名。RPM 包是用必需的库和依赖关系构建的,不会与系统上安装的其他包冲突。
+
+```
+# rpm -qi apachetop
+Name : apachetop
+Version : 0.15.6
+Release : 1.el7
+Architecture: x86_64
+Install Date: Mon 29 Oct 2018 06:47:49 AM EDT
+Group : Applications/Internet
+Size : 67020
+License : BSD
+Signature : RSA/SHA256, Mon 22 Jun 2015 09:30:26 AM EDT, Key ID 6a2faea2352c64e5
+Source RPM : apachetop-0.15.6-1.el7.src.rpm
+Build Date : Sat 20 Jun 2015 09:02:37 PM EDT
+Build Host : buildvm-22.phx2.fedoraproject.org
+Relocations : (not relocatable)
+Packager : Fedora Project
+Vendor : Fedora Project
+URL : https://github.com/tessus/apachetop
+Summary : A top-like display of Apache logs
+Description :
+ApacheTop watches a logfile generated by Apache (in standard common or
+combined logformat, although it doesn't (yet) make use of any of the extra
+fields in combined) and generates human-parsable output in realtime.
+```
+
+`apachetop` 包来自 EPEL 仓库。
+
+#### 方法-4:使用 repoquery 命令
+
+`repoquery` 是一个从 YUM 库查询信息的程序,类似于 rpm 查询。
+
+```
+# repoquery -i httpd
+
+Name : httpd
+Version : 2.4.6
+Release : 80.el7.centos.1
+Architecture: x86_64
+Size : 9817285
+Packager : CentOS BuildSystem
+Group : System Environment/Daemons
+URL : http://httpd.apache.org/
+Repository : updates
+Summary : Apache HTTP Server
+Source : httpd-2.4.6-80.el7.centos.1.src.rpm
+Description :
+The Apache HTTP Server is a powerful, efficient, and extensible
+web server.
+```
+
+`httpd` 包来自 CentOS updates 仓库。
+
+### 在 Fedora 系统上我们如何得知安装的包来自哪个仓库?
+
+DNF 是 “Dandified yum” 的缩写。DNF 是使用 hawkey/libsolv 库作为后端的下一代 yum 包管理器(yum 的分支)。从 Fedora 18 开始 Aleš Kozumplík 开始开发 DNF,并最终在 Fedora 22 上得以应用/启用。
+
+[dnf 命令][10] 用于在 Fedora 22 以及之后的系统上安装、更新、搜索和删除包。它会自动解决依赖并使安装包的过程变得顺畅,不会出现任何问题。
+
+```
+$ dnf info tilix
+Last metadata expiration check: 27 days, 10:00:23 ago on Wed 04 Oct 2017 06:43:27 AM IST.
+Installed Packages
+Name : tilix
+Version : 1.6.4
+Release : 1.fc26
+Arch : x86_64
+Size : 3.6 M
+Source : tilix-1.6.4-1.fc26.src.rpm
+Repo : @System
+From repo : updates
+Summary : Tiling terminal emulator
+URL : https://github.com/gnunn1/tilix
+License : MPLv2.0 and GPLv3+ and CC-BY-SA
+Description : Tilix is a tiling terminal emulator with the following features:
+ :
+ : - Layout terminals in any fashion by splitting them horizontally or vertically
+ : - Terminals can be re-arranged using drag and drop both within and between
+ : windows
+ : - Terminals can be detached into a new window via drag and drop
+ : - Input can be synchronized between terminals so commands typed in one
+ : terminal are replicated to the others
+ : - The grouping of terminals can be saved and loaded from disk
+ : - Terminals support custom titles
+ : - Color schemes are stored in files and custom color schemes can be created by
+ : simply creating a new file
+ : - Transparent background
+ : - Supports notifications when processes are completed out of view
+ :
+ : The application was written using GTK 3 and an effort was made to conform to
+ : GNOME Human Interface Guidelines (HIG).
+```
+
+`tilix` 包来自 Fedora updates 仓库。
+
+### 在 openSUSE 系统上我们如何得知安装的包来自哪个仓库?
+
+Zypper 是一个使用 libzypp 的命令行包管理器。[Zypper 命令][11] 提供了存储库访问、依赖处理、包安装等功能。
+
+```
+$ zypper info nano
+
+Loading repository data...
+Reading installed packages...
+
+
+Information for package nano:
+-----------------------------
+Repository : Main Repository (OSS)
+Name : nano
+Version : 2.4.2-5.3
+Arch : x86_64
+Vendor : openSUSE
+Installed Size : 1017.8 KiB
+Installed : No
+Status : not installed
+Source package : nano-2.4.2-5.3.src
+Summary : Pico editor clone with enhancements
+Description :
+ GNU nano is a small and friendly text editor. It aims to emulate
+ the Pico text editor while also offering a few enhancements.
+```
+
+`nano` 包来自于 openSUSE Main 仓库(OSS)。
+
+### 在 ArchLinux 系统上我们如何得知安装的包来自哪个仓库?
+
+[Pacman 命令][12] 即包管理器工具(package manager utility ),是一个简单的用来安装、构建、删除和管理 Arch Linux 软件包的命令行工具。Pacman 使用 libalpm 作为后端来执行所有的操作。
+
+```
+# pacman -Ss chromium
+extra/chromium 48.0.2564.116-1
+ The open-source project behind Google Chrome, an attempt at creating a safer, faster, and more stable browser
+extra/qt5-webengine 5.5.1-9 (qt qt5)
+ Provides support for web applications using the Chromium browser project
+community/chromium-bsu 0.9.15.1-2
+ A fast paced top scrolling shooter
+community/chromium-chromevox latest-1
+ Causes the Chromium web browser to automatically install and update the ChromeVox screen reader extention. Note: This
+ package does not contain the extension code.
+community/fcitx-mozc 2.17.2313.102-1
+ Fcitx Module of A Japanese Input Method for Chromium OS, Windows, Mac and Linux (the Open Source Edition of Google Japanese
+ Input)
+```
+
+`chromium` 包来自 ArchLinux extra 仓库。
+
+或者,我们可以使用以下选项获得关于包的详细信息。
+
+```
+# pacman -Si chromium
+Repository : extra
+Name : chromium
+Version : 48.0.2564.116-1
+Description : The open-source project behind Google Chrome, an attempt at creating a safer, faster, and more stable browser
+Architecture : x86_64
+URL : http://www.chromium.org/
+Licenses : BSD
+Groups : None
+Provides : None
+Depends On : gtk2 nss alsa-lib xdg-utils bzip2 libevent libxss icu libexif libgcrypt ttf-font systemd dbus
+ flac snappy speech-dispatcher pciutils libpulse harfbuzz libsecret libvpx perl perl-file-basedir
+ desktop-file-utils hicolor-icon-theme
+Optional Deps : kdebase-kdialog: needed for file dialogs in KDE
+ gnome-keyring: for storing passwords in GNOME keyring
+ kwallet: for storing passwords in KWallet
+Conflicts With : None
+Replaces : None
+Download Size : 44.42 MiB
+Installed Size : 172.44 MiB
+Packager : Evangelos Foutras
+Build Date : Fri 19 Feb 2016 04:17:12 AM IST
+Validated By : MD5 Sum SHA-256 Sum Signature
+```
+
+`chromium` 包来自 ArchLinux extra 仓库。
+
+### 在基于 Debian 的系统上我们如何得知安装的包来自哪个仓库?
+
+在基于 Debian 的系统例如 Ubuntu、LinuxMint 上可以使用两种方法实现。
+
+#### 方法-1:使用 apt-cache 命令
+
+[apt-cache 命令][13] 可以显示存储在 APT 内部数据库的很多信息。这些信息是一种缓存,因为它们是从列在 `source.list` 文件里的不同的源中获得的。这个过程发生在 apt 更新操作期间。
+
+```
+$ apt-cache policy python3
+python3:
+ Installed: 3.6.3-0ubuntu2
+ Candidate: 3.6.3-0ubuntu3
+ Version table:
+ 3.6.3-0ubuntu3 500
+ 500 http://in.archive.ubuntu.com/ubuntu artful-updates/main amd64 Packages
+ *** 3.6.3-0ubuntu2 500
+ 500 http://in.archive.ubuntu.com/ubuntu artful/main amd64 Packages
+ 100 /var/lib/dpkg/status
+```
+
+`python3` 包来自 Ubuntu updates 仓库。
+
+#### 方法-2:使用 apt 命令
+
+[APT 命令][14] 即 “Advanced Packaging Tool”,是 `apt-get` 命令的替代品,就像 DNF 是如何取代 YUM 一样。它是具有丰富功能的命令行工具并将所有的功能例如 `apt-cache`、`apt-search`、`dpkg`、`apt-cdrom`、`apt-config`、`apt-ket` 等包含在一个命令(APT)中,并且还有几个独特的功能。例如我们可以通过 APT 轻松安装 .dpkg 包,但我们不能使用 `apt-get` 命令安装,更多类似的功能都被包含进了 APT 命令。`apt-get` 因缺失了很多未被解决的特性而被 `apt` 取代。
+
+```
+$ apt -a show notepadqq
+Package: notepadqq
+Version: 1.3.2-1~artful1
+Priority: optional
+Section: editors
+Maintainer: Daniele Di Sarli
+Installed-Size: 1,352 kB
+Depends: notepadqq-common (= 1.3.2-1~artful1), coreutils (>= 8.20), libqt5svg5 (>= 5.2.1), libc6 (>= 2.14), libgcc1 (>= 1:3.0), libqt5core5a (>= 5.9.0~beta), libqt5gui5 (>= 5.7.0), libqt5network5 (>= 5.2.1), libqt5printsupport5 (>= 5.2.1), libqt5webkit5 (>= 5.6.0~rc), libqt5widgets5 (>= 5.2.1), libstdc++6 (>= 5.2)
+Download-Size: 356 kB
+APT-Sources: http://ppa.launchpad.net/notepadqq-team/notepadqq/ubuntu artful/main amd64 Packages
+Description: Notepad++-like editor for Linux
+ Text editor with support for multiple programming
+ languages, multiple encodings and plugin support.
+
+Package: notepadqq
+Version: 1.2.0-1~artful1
+Status: install ok installed
+Priority: optional
+Section: editors
+Maintainer: Daniele Di Sarli
+Installed-Size: 1,352 kB
+Depends: notepadqq-common (= 1.2.0-1~artful1), coreutils (>= 8.20), libqt5svg5 (>= 5.2.1), libc6 (>= 2.14), libgcc1 (>= 1:3.0), libqt5core5a (>= 5.9.0~beta), libqt5gui5 (>= 5.7.0), libqt5network5 (>= 5.2.1), libqt5printsupport5 (>= 5.2.1), libqt5webkit5 (>= 5.6.0~rc), libqt5widgets5 (>= 5.2.1), libstdc++6 (>= 5.2)
+Homepage: http://notepadqq.altervista.org
+Download-Size: unknown
+APT-Manual-Installed: yes
+APT-Sources: /var/lib/dpkg/status
+Description: Notepad++-like editor for Linux
+ Text editor with support for multiple programming
+ languages, multiple encodings and plugin support.
+```
+
+`notepadqq` 包来自 Launchpad PPA。
+
+--------------------------------------------------------------------------------
+
+via: https://www.2daygeek.com/how-do-we-find-out-the-installed-packages-came-from-which-repository/
+
+作者:[Prakash Subramanian][a]
+选题:[lujun9972][b]
+译者:[zianglei](https://github.com/zianglei)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.2daygeek.com/author/prakash/
+[b]: https://github.com/lujun9972
+[1]: https://www.2daygeek.com/category/repository/
+[2]: https://www.2daygeek.com/install-enable-epel-repository-on-rhel-centos-scientific-linux-oracle-linux/
+[3]: https://www.2daygeek.com/install-enable-elrepo-on-rhel-centos-scientific-linux/
+[4]: https://www.2daygeek.com/additional-yum-repositories-for-centos-rhel-fedora-systems/
+[5]: https://www.2daygeek.com/install-enable-rpm-fusion-repository-on-centos-fedora-rhel/
+[6]: https://fedoraproject.org/wiki/Third_party_repositories
+[7]: https://www.2daygeek.com/install-enable-packman-repository-on-opensuse-leap/
+[8]: https://www.2daygeek.com/yum-command-examples-manage-packages-rhel-centos-systems/
+[9]: https://www.2daygeek.com/rpm-command-examples/
+[10]: https://www.2daygeek.com/dnf-command-examples-manage-packages-fedora-system/
+[11]: https://www.2daygeek.com/zypper-command-examples-manage-packages-opensuse-system/
+[12]: https://www.2daygeek.com/pacman-command-examples-manage-packages-arch-linux-system/
+[13]: https://www.2daygeek.com/apt-get-apt-cache-command-examples-manage-packages-debian-ubuntu-systems/
+[14]: https://www.2daygeek.com/apt-command-examples-manage-packages-debian-ubuntu-systems/
diff --git a/published/20181031 8 creepy commands that haunt the terminal - Opensource.com.md b/published/20181031 8 creepy commands that haunt the terminal - Opensource.com.md
new file mode 100644
index 0000000000..8b21e7b55a
--- /dev/null
+++ b/published/20181031 8 creepy commands that haunt the terminal - Opensource.com.md
@@ -0,0 +1,58 @@
+8 个出没于终端中的吓人命令
+======
+
+> 欢迎来到 Linux 令人毛骨悚然的一面。
+
+
+
+又是一年中的这个时候:天气变冷了、树叶变色了,各处的孩子都化妆成了小鬼、妖精和僵尸。(LCTT 译注:本文原发表于万圣节)但你知道吗, Unix (和 Linux) 和它们的各个分支也充满了令人毛骨悚然的东西?让我们来看一下我们所熟悉和喜爱的操作系统的一些令人毛骨悚然的一面。
+
+### 半神(守护进程)
+
+如果没有潜伏于系统中的各种守护进程daemon,那么 Unix 就没什么不同。守护进程是运行在后台的进程,并为用户和操作系统本身提供有用的服务,比如 SSH、FTP、HTTP 等等。
+
+### 僵尸(僵尸进程)
+
+不时出现的僵尸进程是一种被杀死但是拒绝离开的进程。当它出现时,无疑你只能选择你有的工具来赶走它。僵尸进程通常表明产生它的进程出现了问题。
+
+### 杀死(kill)
+
+你不仅可以使用 `kill` 来干掉一个僵尸进程,你还可以用它杀死任何对你系统产生负面影响的进程。有一个使用太多 RAM 或 CPU 周期的进程?使用 `kill` 命令杀死它。
+
+### 猫(cat)
+
+`cat` 和猫科动物无关,但是与文件操作有关:`cat` 是 “concatenate” 的缩写。你甚至可以使用这个方便的命令来查看文件的内容。
+
+### 尾巴(tail)
+
+当你想要查看文件中最后 n 行时,`tail` 命令很有用。当你想要监控一个文件时,它也很棒。
+
+### 巫师(which)
+
+哦,不,它不是巫师(witch)的一种。而是打印传递给它的命令所在的文件位置的命令。例如,`which python` 将在你系统上打印每个版本的 Python 的位置。
+
+### 地下室(crypt)
+
+`crypt` 命令,以前称为 `mcrypt`,当你想要加密(encrypt)文件的内容时,它是很方便的,这样除了你之外没有人可以读取它。像大多数 Unix 命令一样,你可以单独使用 `crypt` 或在系统脚本中调用它。
+
+### 切碎(shred)
+
+当你不仅要删除文件还想要确保没有人能够恢复它时,`shred` 命令很方便。使用 `rm` 命令删除文件是不够的。你还需要覆盖该文件以前占用的空间。这就是 `shred` 的用武之地。
+
+这些只是你会在 Unix 中发现的一部分令人毛骨悚然的东西。你还知道其他诡异的命令么?请随时告诉我。
+
+万圣节快乐!(LCTT:可惜我们翻译完了,只能将恐怖的感觉延迟了 :D)
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/10/spookier-side-unix-linux
+
+作者:[Patrick H.Mullins][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/pmullins
+[b]: https://github.com/lujun9972
diff --git a/published/20181101 KRS- A new tool for gathering Kubernetes resource statistics.md b/published/20181101 KRS- A new tool for gathering Kubernetes resource statistics.md
new file mode 100644
index 0000000000..56b2bb1c40
--- /dev/null
+++ b/published/20181101 KRS- A new tool for gathering Kubernetes resource statistics.md
@@ -0,0 +1,73 @@
+KRS:一个收集 Kubernetes 资源统计数据的新工具
+======
+
+> 零配置工具简化了信息收集,例如在某个命名空间中运行了多少个 pod。
+
+
+
+最近我在纽约的 O'Reilly Velocity 就 [Kubernetes 应用故障排除][1]的主题发表了演讲,并且在积极的反馈和讨论的推动下,我决定重新审视这个领域的工具。结果,除了 [kubernetes-incubator/spartakus][2] 和 [kubernetes/kube-state-metrics][3] 之外,我们还没有太多的轻量级工具来收集资源统计数据(例如命名空间中的 pod 或服务的数量)。所以,我在回家的路上开始编写一个小工具 —— 创造性地命名为 `krs`,它是 Kubernetes Resource Stats 的简称 ,它允许你收集这些统计数据。
+
+你可以通过两种方式使用 [mhausenblas/krs][5]:
+
+* 直接在命令行(有 Linux、Windows 和 MacOS 的二进制文件),以及
+* 在集群中使用 [launch.sh][4] 脚本部署,该脚本动态创建适当的基于角色的访问控制(RBAC) 权限。
+
+提醒你,它还在早期,并且还在开发中。但是,`krs` 的 0.1 版本提供以下功能:
+
+* 在每个命名空间的基础上,它定期收集资源统计信息(支持 pod、部署和服务)。
+* 它以 [OpenMetrics 格式][6]公开这些统计。
+* 它可以直接通过二进制文件使用,也可以在包含所有依赖项的容器化设置中使用。
+
+目前,你需要安装并配置 `kubectl`,因为 `krs` 依赖于执行 `kubectl get all` 命令来收集统计数据。(另一方面,谁会使用 Kubernetes 但没有安装 `kubectl` 呢?)
+
+使用 `krs` 很简单。[下载][7]适合你平台的二进制文件,并按如下方式执行:
+
+```
+$ krs thenamespacetowatch
+# HELP pods Number of pods in any state, for example running
+# TYPE pods gauge
+pods{namespace="thenamespacetowatch"} 13
+# HELP deployments Number of deployments
+# TYPE deployments gauge
+deployments{namespace="thenamespacetowatch"} 6
+# HELP services Number of services
+# TYPE services gauge
+services{namespace="thenamespacetowatch"} 4
+```
+
+这将在前台启动 `krs`,从名称空间 `thenamespacetowatch` 收集资源统计信息,并分别在标准输出中以 OpenMetrics 格式输出它们,以供你进一步处理。
+
+![krs screenshot][9]
+
+*krs 实战截屏*
+
+也许你会问,Michael,为什么它不能做一些有用的事(例如将指标存储在 S3 中)?因为 [Unix 哲学][10]。
+
+对于那些想知道他们是否可以直接使用 Prometheus 或 [kubernetes/kube-state-metrics][3] 来完成这项任务的人:是的,你可以,为什么不行呢? `krs` 的重点是作为已有工具的轻量级且易于使用的替代品 —— 甚至可能在某些方面略微互补。
+
+本文最初发表在 [Medium 的 ITNext][11] 上,并获得授权转载。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/11/kubernetes-resource-statistics
+
+作者:[Michael Hausenblas][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/mhausenblas
+[b]: https://github.com/lujun9972
+[1]: http://troubleshooting.kubernetes.sh/
+[2]: https://github.com/kubernetes-incubator/spartakus
+[3]: https://github.com/kubernetes/kube-state-metrics
+[4]: https://github.com/mhausenblas/krs/blob/master/launch.sh
+[5]: https://github.com/mhausenblas/krs
+[6]: https://openmetrics.io/
+[7]: https://github.com/mhausenblas/krs/releases
+[8]: /file/412706
+[9]: https://opensource.com/sites/default/files/uploads/krs_screenshot.png (krs screenshot)
+[10]: http://harmful.cat-v.org/cat-v/
+[11]: https://itnext.io/kubernetes-resource-statistics-e8247f92b45c
diff --git a/published/20181105 CPod- An Open Source, Cross-platform Podcast App.md b/published/20181105 CPod- An Open Source, Cross-platform Podcast App.md
new file mode 100644
index 0000000000..ea0dbe77e7
--- /dev/null
+++ b/published/20181105 CPod- An Open Source, Cross-platform Podcast App.md
@@ -0,0 +1,111 @@
+CPod:一个开源、跨平台播客应用
+======
+
+播客是一个很好的娱乐和获取信息的方式。事实上,我会听十几个不同的播客,包括技术、神秘事件、历史和喜剧。当然,[Linux 播客][1]也在此列表中。
+
+今天,我们将看一个简单的跨平台应用来收听你的播客。
+
+![][2]
+
+*推荐的播客和播客搜索*
+
+### 应用程序
+
+[CPod][3] 是 [Zack Guard(z-------------)][4] 的作品。**它是一个 [Election][5] 程序**,这使它能够在大多数操作系统(Linux、Windows、Mac OS)上运行。
+
+> 一个小事:CPod 最初被命名为 Cumulonimbus。
+
+应用的大部分被两个面板占用,来显示内容和选项。屏幕左侧的小条让你可以使用应用的不同功能。CPod 的不同栏目包括主页、队列、订阅、浏览和设置。
+
+![cpod settings][6]
+
+*设置*
+
+### CPod 的功能
+
+以下是 CPod 提供的功能列表:
+
+ * 简洁,干净的设计
+ * 可在主流计算机平台上使用
+ * 有 Snap 包
+ * 搜索 iTunes 的播客目录
+ * 可下载也可无需下载就播放节目
+ * 查看播客信息和节目
+ * 搜索播客的个别节目
+ * 深色模式
+ * 改变播放速度
+ * 键盘快捷键
+ * 将你的播客订阅与 gpodder.net 同步
+ * 导入和导出订阅
+ * 根据长度、日期、下载状态和播放进度对订阅进行排序
+ * 在应用启动时自动获取新节目
+ * 多语言支持
+
+
+![search option in cpod application][7]
+
+*搜索 ZFS 节目*
+
+### 在 Linux 上体验 CPod
+
+我最后在两个系统上安装了 CPod:ArchLabs 和 Windows。[Arch 用户仓库][8] 中有两个版本的 CPod。但是,它们都已过时,一个是版本 1.14.0,另一个是 1.22.6。最新版本的 CPod 是 1.27.0。由于 ArchLabs 和 Windows 之间的版本差异,我的体验有所不同。在本文中,我将重点关注 1.27.0,因为它是最新且功能最多的。
+
+我马上能够找到我最喜欢的播客。我可以粘贴 RSS 源的 URL 来添加 iTunes 列表中没有的那些播客。
+
+找到播客的特定节目也很容易。例如,我最近在寻找 [Late Night Linux][9] 中的一集,这集中他们在谈论 [ZFS][10]。我点击播客,在搜索框中输入 “ZFS” 然后找到了它。
+
+我很快发现播放一堆播客节目的最简单方法是将它们添加到队列中。一旦它们进入队列,你可以流式传输或下载它们。你也可以通过拖放重新排序它们。每集在播放时,它会显示可视化的声波以及节目摘要。
+
+### 安装 CPod
+
+在 [GitHub][11] 上,你可以下载适用于 Linux 的 AppImage 或 Deb 文件,适用于 Windows 的 .exe 文件或适用于 Mac OS 的 .dmg 文件。
+
+你可以使用 [Snap][12] 安装 CPod。你需要做的就是使用以下命令:
+
+```
+sudo snap install cpod
+```
+
+就像我之前说的那样,CPod 的 [Arch 用户仓库][8]的版本已经过时了。我已经给其中一个打包者发了消息。如果你使用 Arch(或基于 Arch 的发行版),我建议你这样做。
+
+![cpod for Linux pidcasts][13]
+
+*播放其中一个我最喜欢的播客*
+
+### 最后的想法
+
+总的来说,我喜欢 CPod。它外观漂亮,使用简单。事实上,我更喜欢原来的名字(Cumulonimbus),但是它有点拗口。
+
+我刚刚在程序中遇到两个问题。首先,我希望每个播客都有评分。其次,在打开黑暗模式后,根据长度、日期、下载状态和播放进度对剧集进行排序的菜单不起作用。
+
+你有没有用过 CPod?如果没有,你最喜欢的播客应用是什么?你最喜欢的播客有哪些?请在下面的评论中告诉我们。
+
+如果你发现这篇文章很有意思,请花一点时间在社交媒体、Hacker News 或 [Reddit][14] 上分享它。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/cpod-podcast-app/
+
+作者:[John Paul][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/john/
+[b]: https://github.com/lujun9972
+[1]: https://itsfoss.com/linux-podcasts/
+[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2018/10/cpod1.1.jpg?w=800&ssl=1
+[3]: https://github.com/z-------------/CPod
+[4]: https://github.com/z-------------
+[5]: https://electronjs.org/
+[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/10/cpod2.1.png?w=800&ssl=1
+[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/10/cpod4.1.jpg?w=800&ssl=1
+[8]: https://aur.archlinux.org/packages/?O=0&K=cpod
+[9]: https://latenightlinux.com/
+[10]: https://itsfoss.com/what-is-zfs/
+[11]: https://github.com/z-------------/CPod/releases
+[12]: https://snapcraft.io/cumulonimbus
+[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/10/cpod3.1.jpg?w=800&ssl=1
+[14]: http://reddit.com/r/linuxusersgroup
diff --git a/published/20181105 Commandline quick tips- How to locate a file.md b/published/20181105 Commandline quick tips- How to locate a file.md
new file mode 100644
index 0000000000..6b8d9a1109
--- /dev/null
+++ b/published/20181105 Commandline quick tips- How to locate a file.md
@@ -0,0 +1,229 @@
+命令行快速技巧:如何定位一个文件
+======
+
+
+
+我们都会有文件存储在电脑里 —— 目录、相片、源代码等等。它们是如此之多。也无疑超出了我的记忆范围。要是毫无目标,找到正确的那一个可能会很费时间。在这篇文章里我们来看一下如何在命令行里找到需要的文件,特别是快速找到你想要的那一个。
+
+好消息是 Linux 命令行专门设计了很多非常有用的命令行工具在你的电脑上查找文件。下面我们看一下它们其中三个:`ls`、`tree` 和 `find`。
+
+### ls
+
+如果你知道文件在哪里,你只需要列出它们或者查看有关它们的信息,`ls` 就是为此而生的。
+
+只需运行 `ls` 就可以列出当下目录中所有可见的文件和目录:
+
+```
+$ ls
+Documents Music Pictures Videos notes.txt
+```
+
+添加 `-l` 选项可以查看文件的相关信息。同时再加上 `-h` 选项,就可以用一种人们易读的格式查看文件的大小:
+
+```
+$ ls -lh
+total 60K
+drwxr-xr-x 2 adam adam 4.0K Nov 2 13:07 Documents
+drwxr-xr-x 2 adam adam 4.0K Nov 2 13:07 Music
+drwxr-xr-x 2 adam adam 4.0K Nov 2 13:13 Pictures
+drwxr-xr-x 2 adam adam 4.0K Nov 2 13:07 Videos
+-rw-r--r-- 1 adam adam 43K Nov 2 13:12 notes.txt
+```
+
+`ls` 也可以搜索一个指定位置:
+
+```
+$ ls Pictures/
+trees.png wallpaper.png
+```
+
+或者一个指定文件 —— 即便只跟着名字的一部分:
+
+```
+$ ls *.txt
+notes.txt
+```
+
+少了点什么?想要查看一个隐藏文件?没问题,使用 `-a` 选项:
+
+```
+$ ls -a
+. .bash_logout .bashrc Documents Pictures notes.txt
+.. .bash_profile .vimrc Music Videos
+```
+
+`ls` 还有很多其他有用的选项,你可以把它们组合在一起获得你想要的效果。可以使用以下命令了解更多:
+
+```
+$ man ls
+```
+
+### tree
+
+如果你想查看你的文件的树状结构,`tree` 是一个不错的选择。可能你的系统上没有默认安装它,你可以使用包管理 DNF 手动安装:
+
+```
+$ sudo dnf install tree
+```
+
+如果不带任何选项或者参数地运行 `tree`,将会以当前目录开始,显示出包含其下所有目录和文件的一个树状图。提醒一下,这个输出可能会非常大,因为它包含了这个目录下的所有目录和文件:
+
+```
+$ tree
+.
+|-- Documents
+| |-- notes.txt
+| |-- secret
+| | `-- christmas-presents.txt
+| `-- work
+| |-- project-abc
+| | |-- README.md
+| | |-- do-things.sh
+| | `-- project-notes.txt
+| `-- status-reports.txt
+|-- Music
+|-- Pictures
+| |-- trees.png
+| `-- wallpaper.png
+|-- Videos
+`-- notes.txt
+```
+
+如果列出的太多了,使用 `-L` 选项,并在其后加上你想查看的层级数,可以限制列出文件的层级:
+
+```
+$ tree -L 2
+.
+|-- Documents
+| |-- notes.txt
+| |-- secret
+| `-- work
+|-- Music
+|-- Pictures
+| |-- trees.png
+| `-- wallpaper.png
+|-- Videos
+`-- notes.txt
+```
+
+你也可以显示一个指定目录的树状图:
+
+```
+$ tree Documents/work/
+Documents/work/
+|-- project-abc
+| |-- README.md
+| |-- do-things.sh
+| `-- project-notes.txt
+`-- status-reports.txt
+```
+
+如果使用 `tree` 列出的是一个很大的树状图,你可以把它跟 `less` 组合使用:
+
+```
+$ tree | less
+```
+
+再一次,`tree` 有很多其他的选项可以使用,你可以把他们组合在一起发挥更强大的作用。man 手册页有所有这些选项:
+
+```
+$ man tree
+```
+
+### find
+
+那么如果不知道文件在哪里呢?就让我们来找到它们吧!
+
+要是你的系统中没有 `find`,你可以使用 DNF 安装它:
+
+```
+$ sudo dnf install findutils
+```
+
+运行 `find` 时如果没有添加任何选项或者参数,它将会递归列出当前目录下的所有文件和目录。
+
+```
+$ find
+.
+./Documents
+./Documents/secret
+./Documents/secret/christmas-presents.txt
+./Documents/notes.txt
+./Documents/work
+./Documents/work/status-reports.txt
+./Documents/work/project-abc
+./Documents/work/project-abc/README.md
+./Documents/work/project-abc/do-things.sh
+./Documents/work/project-abc/project-notes.txt
+./.bash_logout
+./.bashrc
+./Videos
+./.bash_profile
+./.vimrc
+./Pictures
+./Pictures/trees.png
+./Pictures/wallpaper.png
+./notes.txt
+./Music
+```
+
+但是 `find` 真正强大的是你可以使用文件名进行搜索:
+
+```
+$ find -name do-things.sh
+./Documents/work/project-abc/do-things.sh
+```
+
+或者仅仅是名字的一部分 —— 像是文件后缀。我们来找一下所有的 .txt 文件:
+
+```
+$ find -name "*.txt"
+./Documents/secret/christmas-presents.txt
+./Documents/notes.txt
+./Documents/work/status-reports.txt
+./Documents/work/project-abc/project-notes.txt
+./notes.txt
+```
+
+你也可以根据大小寻找文件。如果你的空间不足的时候,这种方法也许特别有用。现在来列出所有大于 1 MB 的文件:
+
+```
+$ find -size +1M
+./Pictures/trees.png
+./Pictures/wallpaper.png
+```
+
+当然也可以搜索一个具体的目录。假如我想在我的 Documents 文件夹下找一个文件,而且我知道它的名字里有 “project” 这个词:
+
+```
+$ find Documents -name "*project*"
+Documents/work/project-abc
+Documents/work/project-abc/project-notes.txt
+```
+
+除了文件它还显示目录。你可以限制仅搜索查询文件:
+
+```
+$ find Documents -name "*project*" -type f
+Documents/work/project-abc/project-notes.txt
+```
+
+最后再一次,`find` 还有很多供你使用的选项,要是你想使用它们,man 手册页绝对可以帮到你:
+
+```
+$ man find
+```
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/commandline-quick-tips-locate-file/
+
+作者:[Adam Šamalík][a]
+选题:[lujun9972][b]
+译者:[dianbanjiu](https://github.com/dianbanjiu)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://fedoramagazine.org/author/asamalik/
+[b]: https://github.com/lujun9972
diff --git a/published/20181105 Introducing pydbgen- A random dataframe-database table generator.md b/published/20181105 Introducing pydbgen- A random dataframe-database table generator.md
new file mode 100644
index 0000000000..27bb64d37e
--- /dev/null
+++ b/published/20181105 Introducing pydbgen- A random dataframe-database table generator.md
@@ -0,0 +1,171 @@
+pydbgen:一个数据库随机生成器
+======
+
+> 用这个简单的工具生成带有多表的大型数据库,让你更好地用 SQL 研究数据科学。
+
+
+
+在研究数据科学的过程中,最麻烦的往往不是算法或者技术,而是如何获取到一批原始数据。尽管网上有很多真实优质的数据集可以用于机器学习,然而在学习 SQL 时却不是如此。
+
+对于数据科学来说,熟悉 SQL 的重要性不亚于了解 Python 或 R 编程。如果想收集诸如姓名、年龄、信用卡信息、地址这些信息用于机器学习任务,在 Kaggle 上查找专门的数据集比使用足够大的真实数据库要容易得多。
+
+如果有一个简单的工具或库来帮助你生成一个大型数据库,表里还存放着大量你需要的数据,岂不美哉?
+
+不仅仅是数据科学的入门者,即使是经验丰富的软件测试人员也会需要这样一个简单的工具,只需编写几行代码,就可以通过随机(但是是假随机)生成任意数量但有意义的数据集。
+
+因此,我要推荐这个名为 [pydbgen][1] 的轻量级 Python 库。在后文中,我会简要说明这个库的相关内容,你也可以[阅读它的文档][2]详细了解更多信息。
+
+### pydbgen 是什么
+
+`pydbgen` 是一个轻量的纯 Python 库,它可以用于生成随机但有意义的数据记录(包括姓名、地址、信用卡号、日期、时间、公司名称、职位、车牌号等等),存放在 Pandas Dataframe 对象中,并保存到 SQLite 数据库或 Excel 文件。
+
+### 如何安装 pydbgen
+
+目前 1.0.5 版本的 pydbgen 托管在 PyPI(Python 包索引存储库Python Package Index repository)上,并且对 [Faker][3] 有依赖关系。安装 pydbgen 只需要执行命令:
+
+```
+pip install pydbgen
+```
+
+已经在 Python 3.6 环境下测试安装成功,但在 Python 2 环境下无法正常安装。
+
+### 如何使用 pydbgen
+
+在使用 `pydbgen` 之前,首先要初始化 `pydb` 对象。
+
+```
+import pydbgen
+from pydbgen import pydbgen
+myDB=pydbgen.pydb()
+```
+
+随后就可以调用 `pydb` 对象公开的各种内部函数了。可以按照下面的例子,输出随机的美国城市和车牌号码:
+
+```
+myDB.city_real()
+>> 'Otterville'
+for _ in range(10):
+ print(myDB.license_plate())
+>> 8NVX937
+ 6YZH485
+ XBY-564
+ SCG-2185
+ XMR-158
+ 6OZZ231
+ CJN-850
+ SBL-4272
+ TPY-658
+ SZL-0934
+```
+
+另外,如果你输入的是 `city()` 而不是 `city_real()`,返回的将会是虚构的城市名。
+
+```
+print(myDB.gen_data_series(num=8,data_type='city'))
+>>
+New Michelle
+Robinborough
+Leebury
+Kaylatown
+Hamiltonfort
+Lake Christopher
+Hannahstad
+West Adamborough
+```
+
+### 生成随机的 Pandas Dataframe
+
+你可以指定生成数据的数量和种类,但需要注意的是,返回结果均为字符串或文本类型。
+
+```
+testdf=myDB.gen_dataframe(5,['name','city','phone','date'])
+testdf
+```
+
+最终产生的 Dataframe 类似下图所示。
+
+
+
+### 生成数据库表
+
+你也可以指定生成数据的数量和种类,而返回结果是数据库中的文本或者变长字符串类型。在生成过程中,你可以指定对应的数据库文件名和表名。
+
+```
+myDB.gen_table(db_file='Testdb.DB',table_name='People',
+
+fields=['name','city','street_address','email'])
+```
+
+上面的例子种生成了一个能被 MySQL 和 SQLite 支持的 `.db` 文件。下图则显示了这个文件中的数据表在 SQLite 可视化客户端中打开的画面。
+
+
+
+### 生成 Excel 文件
+
+和上面的其它示例类似,下面的代码可以生成一个具有随机数据的 Excel 文件。值得一提的是,通过将 `phone_simple` 参数设为 `False` ,可以生成较长较复杂的电话号码。如果你想要提高自己在数据提取方面的能力,不妨尝试一下这个功能。
+
+```
+myDB.gen_excel(num=20,fields=['name','phone','time','country'],
+phone_simple=False,filename='TestExcel.xlsx')
+```
+
+最终的结果类似下图所示:
+
+
+
+### 生成随机电子邮箱地址
+
+`pydbgen` 内置了一个 `realistic_email` 方法,它基于种子来生成随机的电子邮箱地址。如果你不想在网络上使用真实的电子邮箱地址时,这个功能可以派上用场。
+
+```
+for _ in range(10):
+ print(myDB.realistic_email('Tirtha Sarkar'))
+>>
+Tirtha_Sarkar@gmail.com
+Sarkar.Tirtha@outlook.com
+Tirtha_S48@verizon.com
+Tirtha_Sarkar62@yahoo.com
+Tirtha.S46@yandex.com
+Tirtha.S@att.com
+Sarkar.Tirtha60@gmail.com
+TirthaSarkar@zoho.com
+Sarkar.Tirtha@protonmail.com
+Tirtha.S@comcast.net
+```
+
+### 未来的改进和用户贡献
+
+目前的版本中并不完美。如果你发现了 pydbgen 的 bug 导致它在运行期间发生崩溃,请向我反馈。如果你打算对这个项目贡献代码,[也随时欢迎你][1]。当然现在也还有很多改进的方向:
+
+ * pydbgen 作为随机数据生成器,可以集成一些机器学习或统计建模的功能吗?
+ * pydbgen 是否会添加可视化功能?
+
+一切皆有可能!
+
+如果你有任何问题或想法想要分享,都可以通过 [tirthajyoti@gmail.com][4] 与我联系。如果你像我一样对机器学习和数据科学感兴趣,也可以添加我的 [LinkedIn][5] 或在 [Twitter][6] 上关注我。另外,还可以在我的 [GitHub][7] 上找到更多 Python、R 或 MATLAB 的有趣代码和机器学习资源。
+
+本文以 [CC BY-SA 4.0][9] 许可在 [Towards Data Science][8] 首发。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/11/pydbgen-random-database-table-generator
+
+作者:[Tirthajyoti Sarkar][a]
+选题:[lujun9972][b]
+译者:[HankChow](https://github.com/HankChow)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/tirthajyoti
+[b]: https://github.com/lujun9972
+[1]: https://github.com/tirthajyoti/pydbgen
+[2]: http://pydbgen.readthedocs.io/en/latest/
+[3]: https://faker.readthedocs.io/en/latest/index.html
+[4]: mailto:tirthajyoti@gmail.com
+[5]: https://www.linkedin.com/in/tirthajyoti-sarkar-2127aa7/
+[6]: https://twitter.com/tirthajyotiS
+[7]: https://github.com/tirthajyoti?tab=repositories
+[8]: https://towardsdatascience.com/introducing-pydbgen-a-random-dataframe-database-table-generator-b5c7bdc84be5
+[9]: https://creativecommons.org/licenses/by-sa/4.0/
+
diff --git a/published/20181105 Revisiting the Unix philosophy in 2018.md b/published/20181105 Revisiting the Unix philosophy in 2018.md
new file mode 100644
index 0000000000..7c9931e601
--- /dev/null
+++ b/published/20181105 Revisiting the Unix philosophy in 2018.md
@@ -0,0 +1,102 @@
+2018 重温 Unix 哲学
+======
+> 在现代微服务环境中,构建小型、单一的应用程序的旧策略又再一次流行了起来。
+
+
+
+1984 年,Rob Pike 和 Brian W. Kernighan 在 AT&T 贝尔实验室技术期刊上发表了名为 “[Unix 环境编程][1]” 的文章,其中他们使用 BSD 的 `cat -v` 例子来认证 Unix 哲学。简而言之,Unix 哲学是:构建小型、单一的应用程序 —— 不管用什么语言 —— 只做一件小而美的事情,用 `stdin` / `stdout` 进行通信,并通过管道进行连接。
+
+听起来是不是有点耳熟?
+
+是的,我也这么认为。这就是 James Lewis 和 Martin Fowler 给出的 [微服务的定义][2] 。
+
+> 简单来说,微服务架构的风格是将单个 应用程序开发为一套小型服务的方法,每个服务都运行在它的进程中,并用轻量级机制进行通信,通常是 HTTP 资源 API 。
+
+虽然一个 *nix 程序或者是一个微服务本身可能非常局限甚至不是很有用,但是当这些独立工作的单元组合在一起的时候就显示出了它们真正的好处和强大。
+
+### *nix程序 vs 微服务
+
+下面的表格对比了 *nix 环境中的程序(例如 `cat` 或 `lsof`)与微服务环境中的程序。
+
+| | *nix 程序 | 微服务 |
+| ------------- | ------------------------- | ----------------------- |
+| 执行单元 | 程序使用 `stdin`/`stdout` | 使用 HTTP 或 gRPC API |
+| 数据流 | 管道 | ? |
+| 可配置和参数化 | 命令行参数、环境变量和配置文件 | JSON/YAML 文档 |
+| 发现 | 包管理器、man、make | DNS、环境变量、OpenAPI |
+
+让我们详细的看看每一行。
+
+#### 执行单元
+
+*nix 系统(如 Linux)中的执行单元是一个可执行的文件(二进制或者是脚本),理想情况下,它们从 `stdin` 读取输入并将输出写入 `stdout`。而微服务通过暴露一个或多个通信接口来提供服务,比如 HTTP 和 gRPC API。在这两种情况下,你都会发现无状态示例(本质上是纯函数行为)和有状态示例,除了输入之外,还有一些内部(持久)状态决定发生了什么。
+
+#### 数据流
+
+传统的,*nix 程序能够通过管道进行通信。换句话说,我们要感谢 [Doug McIlroy][3],你不需要创建临时文件来传递,而可以在每个进程之间处理无穷无尽的数据流。据我所知,除了我在 [2017 年做的基于 Apache Kafka 小实验][4],没有什么能比得上管道化的微服务了。
+
+#### 可配置和参数化
+
+你是如何配置程序或者服务的,无论是永久性的服务还是即时的服务?是的,在 *nix 系统上,你通常有三种方法:命令行参数、环境变量,或全面的配置文件。在微服务架构中,典型的做法是用 YAML(或者甚至是 JSON)文档,定制好一个服务的布局和配置以及依赖的组件和通信、存储和运行时配置。例如 [Kubernetes 资源定义][5]、[Nomad 工作规范][6] 或 [Docker 编排][7] 文档。这些可能参数化也可能不参数化;也就是说,除非你知道一些模板语言,像 Kubernetes 中的 [Helm][8],否则你会发现你使用了很多 `sed -i` 这样的命令。
+
+#### 发现
+
+你怎么知道有哪些程序和服务可用,以及如何使用它们?在 *nix 系统中通常都有一个包管理器和一个很好用的 man 页面;使用它们,应该能够回答你所有的问题。在微服务的设置中,在寻找一个服务的时候会相对更自动化一些。除了像 [Airbnb 的 SmartStack][9] 或 [Netflix 的 Eureka][10] 等可以定制以外,通常还有基于环境变量或基于 DNS 的[方法][11],允许您动态的发现服务。同样重要的是,事实上 [OpenAPI][12] 为 HTTP API 提供了一套标准文档和设计模式,[gRPC][13] 为一些耦合性强的高性能项目也做了同样的事情。最后非常重要的一点是,考虑到开发者经验(DX),应该从写一份好的 [Makefile][14] 开始,并以编写符合 [风格][15] 的文档结束。
+
+### 优点和缺点
+
+*nix 系统和微服务都提供了许多挑战和机遇。
+
+#### 模块性
+
+要设计一个简洁、有清晰的目的,并且能够很好地和其它模块配合的某个东西是很困难的。甚至是在不同版本中实现并引入相应的异常处理流程都很困难的。在微服务中,这意味着重试逻辑和超时机制,或者将这些功能外包到服务网格service mesh是不是一个更好的选择呢?这确实比较难,可如果你做好了,那它的可重用性是巨大的。
+
+#### 可观测性
+
+在一个独石monolith(2018 年)或是一个试图做任何事情的大型程序(1984 年),当情况恶化的时候,应当能够直接的找到问题的根源。但是在一个
+
+```
+yes | tr \\n x | head -c 450m | grep n
+```
+
+或者在一个微服务设置中请求一个路径,例如,涉及 20 个服务,你怎么弄清楚是哪个服务的问题?幸运的是,我们有很多标准,特别是 [OpenCensus][16] 和 [OpenTracing][17]。如果您希望转向微服务,可预测性仍然可能是最大的问题。
+
+#### 全局状态
+
+对于 *nix 程序来说可能不是一个大问题,但在微服务中,全局状态仍然是一个需要讨论的问题。也就是说,如何确保有效的管理本地化(持久性)的状态以及尽可能在少做变更的情况下使全局保持一致。
+
+### 总结一下
+
+最后,问题仍然是:你是否在使用合适的工具来完成特定的工作?也就是说,以同样的方式实现一个特定的 *nix 程序在某些时候或者阶段会是一个更好的选择,它是可能在你的组织或工作过程中的一个[最好的选择][18]。无论如何,我希望这篇文章可以让你看到 Unix 哲学和微服务之间许多强有力的相似之处。也许我们可以从前者那里学到一些东西使后者受益。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/11/revisiting-unix-philosophy-2018
+
+作者:[Michael Hausenblas][a]
+选题:[lujun9972][b]
+译者:[Jamskr](https://github.com/Jamskr)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/mhausenblas
+[b]: https://github.com/lujun9972
+[1]: http://harmful.cat-v.org/cat-v/
+[2]: https://martinfowler.com/articles/microservices.html
+[3]: https://en.wikipedia.org/wiki/Douglas_McIlroy
+[4]: https://speakerdeck.com/mhausenblas/distributed-named-pipes-and-other-inter-services-communication
+[5]: http://kubernetesbyexample.com/
+[6]: https://www.nomadproject.io/docs/job-specification/index.html
+[7]: https://docs.docker.com/compose/overview/
+[8]: https://helm.sh/
+[9]: https://github.com/airbnb/smartstack-cookbook
+[10]: https://github.com/Netflix/eureka
+[11]: https://kubernetes.io/docs/concepts/services-networking/service/#discovering-services
+[12]: https://www.openapis.org/
+[13]: https://grpc.io/
+[14]: https://suva.sh/posts/well-documented-makefiles/
+[15]: https://www.linux.com/news/improve-your-writing-gnu-style-checkers
+[16]: https://opencensus.io/
+[17]: https://opentracing.io/
+[18]: https://robertnorthard.com/devops-days-well-architected-monoliths-are-okay/
diff --git a/published/20181105 Some Good Alternatives To ‘du- Command.md b/published/20181105 Some Good Alternatives To ‘du- Command.md
new file mode 100644
index 0000000000..cd08bac2a2
--- /dev/null
+++ b/published/20181105 Some Good Alternatives To ‘du- Command.md
@@ -0,0 +1,305 @@
+几个用于替代 du 命令的更好选择
+======
+
+
+
+大家对 `du` 命令应该都不陌生,它可以在类 Unix 系统中对文件和目录的空间使用情况进行计算和汇总。如果你也经常需要使用 `du` 命令,你会对以下内容感兴趣的。我发现了五个可以替代原有的 `du` 命令的更好的工具。当然,如果后续有更多更好的选择,我会继续列出来。如果你有其它推荐,也欢迎在评论中留言。
+
+### ncdu
+
+`ncdu` 作为普通 `du` 的替代品,这在 Linux 社区中已经很流行了。`ncdu` 正是基于开发者们对 `du` 的性能不满意而被开发出来的。`ncdu` 是一个使用 C 语言和 ncurses 接口开发的简易快速的磁盘用量分析器,可以用来查看目录或文件在本地或远程系统上占用磁盘空间的情况。如果你有兴趣查看关于 `ncdu` 的详细介绍,可以浏览《[如何在 Linux 上使用 ncdu 查看磁盘占用量][9]》这一篇文章。
+
+### tin-summer
+
+tin-summer 是使用 Rust 语言编写的自由开源工具,它可以用于查找占用磁盘空间的文件,它也是 `du` 命令的另一个替代品。由于使用了多线程,因此 tin-summer 在计算大目录的大小时会比 `du` 命令快得多。tin-summer 与 `du` 命令之间的区别是前者读取文件的大小,而后者则读取磁盘使用情况。
+
+tin-summer 的开发者认为它可以替代 `du`,因为它具有以下优势:
+
+ * 在大目录的操作速度上比 `du` 更快;
+ * 在显示结果上默认采用易读格式;
+ * 可以使用正则表达式排除文件或目录;
+ * 可以对输出进行排序和着色处理;
+ * 可扩展,等等。
+
+**安装 tin-summer**
+
+要安装 tin-summer,只需要在终端中执行以下命令:
+
+```
+$ curl -LSfs https://japaric.github.io/trust/install.sh | sh -s -- --git vmchale/tin-summer
+```
+
+你也可以使用 `cargo` 软件包管理器安装 tin-summer,但你需要在系统上先安装 Rust。在 Rust 已经安装好的情况下,执行以下命令:
+
+```
+$ cargo install tin-summer
+```
+
+如果上面提到的这两种方法都不能成功安装 tin-summer,还可以从它的[软件发布页][1]下载最新版本的二进制文件编译,进行手动安装。
+
+**用法**
+
+(LCTT 译注:tin-summer 的命令名为 `sn`)
+
+如果需要查看当前工作目录的文件大小,可以执行以下命令:
+
+```
+$ sn f
+749 MB ./.rustup/toolchains
+749 MB ./.rustup
+147 MB ./.cargo/bin
+147 MB ./.cargo
+900 MB .
+```
+
+不需要进行额外声明,它也是默认以易读的格式向用户展示数据。在使用 `du` 命令的时候,则必须加上额外的 `-h` 参数才能得到同样的效果。
+
+只需要按以下的形式执行命令,就可以查看某个特定目录的文件大小。
+
+```
+$ sn f
+```
+
+还可以对输出结果进行排序,例如下面的命令可以输出指定目录中最大的 5 个文件或目录:
+
+```
+$ sn sort /home/sk/ -n5
+749 MB /home/sk/.rustup
+749 MB /home/sk/.rustup/toolchains
+147 MB /home/sk/.cargo
+147 MB /home/sk/.cargo/bin
+2.6 MB /home/sk/mcelog
+900 MB /home/sk/
+```
+
+顺便一提,上面结果中的最后一行是指定目录 `/home/sk` 的总大小。所以不要惊讶为什么输入的是 5 而实际输出了 6 行结果。
+
+在当前目录下查找带有构建工程的目录,可以使用以下命令:
+
+```
+$ sn ar
+```
+
+tin-summer 同样支持查找指定大小的带有构建工程的目录。例如执行以下命令可以查找到大小在 100 MB 以上的带有构建工程的目录:
+
+```
+$ sn ar -t100M
+```
+
+如上文所说,tin-summer 在操作大目录的时候速度比较快,因此在操作小目录的时候,速度会相对比较慢一些。不过它的开发者已经表示,将会在以后的版本中优化这个缺陷。
+
+要获取相关的帮助,可以执行以下命令:
+
+```
+$ sn --help
+```
+
+如果想要更详尽的介绍,可以查看[这个项目的 GitHub 页面][10]。
+
+### dust
+
+`dust` (含义是 `du` + `rust` = `dust`)使用 Rust 编写,是一个免费、开源的更直观的 `du` 工具。它可以在不需要 `head` 或`sort` 命令的情况下即时显示目录占用的磁盘空间。与 tin-summer 一样,它会默认情况以易读的格式显示每个目录的大小。
+
+**安装 dust**
+
+由于 `dust` 也是使用 Rust 编写,因此它也可以通过 `cargo` 软件包管理器进行安装:
+
+```
+$ cargo install du-dust
+```
+
+也可以从它的[软件发布页][2]下载最新版本的二进制文件,并按照以下步骤安装。在写这篇文章的时候,最新的版本是 0.3.1。
+
+```
+$ wget https://github.com/bootandy/dust/releases/download/v0.3.1/dust-v0.3.1-x86_64-unknown-linux-gnu.tar.gz
+```
+
+抽取文件:
+
+```
+$ tar -xvf dust-v0.3.1-x86_64-unknown-linux-gnu.tar.gz
+```
+
+最后将可执行文件复制到你的 `$PATH`(例如 `/usr/local/bin`)下:
+
+```
+$ sudo mv dust /usr/local/bin/
+```
+
+**用法**
+
+需要查看当前目录及所有子目录下的文件大小,可以执行以下命令:
+
+```
+$ dust
+```
+
+输出示例:
+
+
+
+带上 `-p` 参数可以按照从当前目录起始的完整目录显示。
+
+```
+$ dust -p
+```
+
+![dust 2][4]
+
+如果需要查看多个目录的大小,只需要同时列出这些目录,并用空格分隔开即可:
+
+```
+$ dust
+```
+
+下面再多举几个例子,例如:
+
+显示文件的长度:
+
+```
+$ dust -s
+```
+
+只显示 10 个目录:
+
+```
+$ dust -n 10
+```
+
+查看当前目录下最多 3 层子目录:
+
+```
+$ dust -d 3
+```
+
+查看帮助:
+
+```
+$ dust -h
+```
+
+如果想要更详尽的介绍,可以查看[这个项目的 GitHub 页面][11]。
+
+### diskus
+
+`diskus` 也是使用 Rust 编写的一个小型、快速的开源工具,它可以用于替代 `du -sh` 命令。`diskus` 将会计算当前目录下所有文件的总大小,它的效果相当于 `du -sh` 或 `du -sh --bytes`,但其开发者表示 `diskus` 的运行速度是 `du -sh` 的 9 倍。
+
+**安装 diskus**
+
+`diskus` 已经存放于 Arch Linux 社区用户软件仓库Arch Linux User-community Repository([AUR][5])当中,可以通过任何一种 AUR 帮助工具(例如 [`yay`][6])把它安装在基于 Arch 的系统上:
+
+```
+$ yay -S diskus
+```
+
+对于 Ubuntu 及其衍生发行版,可以在 `diskus` 的[软件发布页][7]上下载最新版的软件包并安装:
+
+```
+$ wget "https://github.com/sharkdp/diskus/releases/download/v0.3.1/diskus_0.3.1_amd64.deb"
+
+$ sudo dpkg -i diskus_0.3.1_amd64.deb
+```
+
+还可以使用 `cargo` 软件包管理器安装 `diskus`,但必须在系统上先安装 Rust 1.29+。
+
+安装好 Rust 之后,就可以使用以下命令安装 `diskus`:
+
+```
+$ cargo install diskus
+```
+
+**用法**
+
+在通常情况下,如果需要查看某个目录的大小,我会使用形如 `du -sh` 的命令。
+
+```
+$ du -sh dir
+```
+
+这里的 `-s` 参数表示显示总大小。
+
+如果使用 `diskus`,直接就可以显示当前目录的总大小。
+
+```
+$ diskus
+```
+
+
+
+我使用 `diskus` 查看 Arch Linux 系统上各个目录的总大小,这个工具的速度确实比 `du -sh` 快得多。但是它目前只能显示当前目录的大小。
+
+要获取相关的帮助,可以执行以下命令:
+
+```
+$ diskus -h
+```
+
+如果想要更详尽的介绍,可以查看[这个项目的 GitHub 页面][12]。
+
+### duu
+
+`duu` 是 Directory Usage Utility 的缩写。它是使用 Python 编写的查看指定目录大小的工具。它具有跨平台的特性,因此在 Windows、Mac OS 和 Linux 系统上都能够使用。
+
+**安装 duu**
+
+安装这个工具之前需要先安装 Python 3。不过目前很多 Linux 发行版的默认软件仓库中都带有 Python 3,所以这个依赖并不难解决。
+
+Python 3 安装完成后,从 `duu` 的[软件发布页][8]下载其最新版本。
+
+```
+$ wget https://github.com/jftuga/duu/releases/download/2.20/duu.py
+```
+
+**用法**
+
+要查看当前目录的大小,只需要执行以下命令:
+
+```
+$ python3 duu.py
+```
+
+输出示例:
+
+
+
+从上图可以看出,`duu` 会显示当前目录下文件的数量情况,按照 Byte、KB、MB 单位显示这些文件的总大小,以及每个文件的大小。
+
+如果需要查看某个目录的大小,只需要声明目录的绝对路径即可:
+
+```
+$ python3 duu.py /home/sk/Downloads/
+```
+
+如果想要更详尽的介绍,可以查看[这个项目的 GitHub 页面][13]。
+
+以上就是 `du` 命令的五种替代方案,希望这篇文章能够帮助到你。就我自己而言,我并不会在这五种工具之间交替使用,我更喜欢使用 `ncdu`。欢迎在下面的评论区发表你对这些工具的评论。
+
+
+
+--------------------------------------------------------------------------------
+
+via: https://www.ostechnix.com/some-good-alternatives-to-du-command/
+
+作者:[SK][a]
+选题:[lujun9972][b]
+译者:[HankChow](https://github.com/HankChow)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.ostechnix.com/author/sk/
+[b]: https://github.com/lujun9972
+[1]: https://github.com/vmchale/tin-summer/releases
+[2]: https://github.com/bootandy/dust/releases
+[3]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
+[4]: http://www.ostechnix.com/wp-content/uploads/2018/11/dust-2.png
+[5]: https://aur.archlinux.org/packages/diskus-bin/
+[6]: https://www.ostechnix.com/yay-found-yet-another-reliable-aur-helper/
+[7]: https://github.com/sharkdp/diskus/releases
+[8]: https://github.com/jftuga/duu/releases
+[9]: https://www.ostechnix.com/check-disk-space-usage-linux-using-ncdu/
+[10]: https://github.com/vmchale/tin-summer
+[11]: https://github.com/bootandy/dust
+[12]: https://github.com/sharkdp/diskus
+[13]: https://github.com/jftuga/duu
+
diff --git a/published/20181107 Gitbase- Exploring git repos with SQL.md b/published/20181107 Gitbase- Exploring git repos with SQL.md
new file mode 100644
index 0000000000..994474d949
--- /dev/null
+++ b/published/20181107 Gitbase- Exploring git repos with SQL.md
@@ -0,0 +1,92 @@
+gitbase:用 SQL 查询 Git 仓库
+======
+
+> gitbase 是一个使用 go 开发的的开源项目,它实现了在 Git 仓库上执行 SQL 查询。
+
+
+
+Git 已经成为了代码版本控制的事实标准,但尽管 Git 相当普及,对代码仓库的深入分析的工作难度却没有因此而下降;而 SQL 在大型代码库的查询方面则已经是一种久经考验的语言,因此诸如 Spark 和 BigQuery 这样的项目都采用了它。
+
+所以,source{d} 很顺理成章地将这两种技术结合起来,就产生了 gitbase(LCTT 译注:source{d} 是一家开源公司,本文作者是该公司开发者关系副总裁)。gitbase 是一个代码即数据code-as-data的解决方案,可以使用 SQL 对 git 仓库进行大规模分析。
+
+[gitbase][1] 是一个完全开源的项目。它站在了很多巨人的肩上,因此得到了足够的发展竞争力。下面就来介绍一下其中的一些“巨人”。
+
+
+
+*[gitbase playground][2] 为 gitbase 提供了一个可视化的操作环境。*
+
+### 用 Vitess 解析 SQL
+
+gitbase 通过 SQL 与用户进行交互,因此需要能够遵循 MySQL 协议来对通过网络传入的 SQL 请求作出解析和理解,万幸由 YouTube 建立的 [Vitess][3] 项目已经在这一方面给出了解决方案。Vitess 是一个横向扩展的 MySQL 数据库集群系统。
+
+我们只是使用了这个项目中的部分重要代码,并将其转化为一个可以让任何人在数分钟以内编写出一个 MySQL 服务器的[开源程序][4],就像我在 [justforfunc][5] 视频系列中展示的 [CSVQL][6] 一样,它可以使用 SQL 操作 CSV 文件。
+
+### 用 go-git 读取 git 仓库
+
+在成功解析 SQL 请求之后,还需要对数据集中的 git 仓库进行查询才能返回结果。因此,我们还结合使用了 source{d} 最成功的 [go-git][7] 仓库。go-git 是使用纯 go 语言编写的具有高度可扩展性的 git 实现。
+
+借此我们就可以很方便地将存储在磁盘上的代码仓库保存为 [siva][8] 文件格式(这同样是 source{d} 的一个开源项目),也可以通过 `git clone` 来对代码仓库进行复制。
+
+### 使用 enry 检测语言、使用 babelfish 解析文件
+
+gitbase 集成了我们开源的语言检测项目 [enry][9] 以及代码解析项目 [babelfish][10],因此在分析 git 仓库历史代码的能力也相当强大。babelfish 是一个自托管服务,普适于各种源代码解析,并将代码文件转换为通用抽象语法树Universal Abstract Syntax Tree(UAST)。
+
+这两个功能在 gitbase 中可以被用户以函数 `LANGUAGE` 和 `UAST` 调用,诸如“查找上个月最常被修改的函数的名称”这样的请求就需要通过这两个功能实现。
+
+### 提高性能
+
+gitbase 可以对非常大的数据集进行分析,例如来自 GitHub 高达 3 TB 源代码的 Public Git Archive([公告][11])。面临的工作量如此巨大,因此每一点性能都必须运用到极致。于是,我们也使用到了 Rubex 和 Pilosa 这两个项目。
+
+#### 使用 Rubex 和 Oniguruma 优化正则表达式速度
+
+[Rubex][12] 是 go 的正则表达式标准库包的一个准替代品。之所以说它是准替代品,是因为它没有在 `regexp.Regexp` 类中实现 `LiteralPrefix` 方法,直到现在都还没有。
+
+Rubex 的高性能是由于使用 [cgo][14] 调用了 [Oniguruma][13],它是一个高度优化的 C 代码库。
+
+#### 使用 Pilosa 索引优化查询速度
+
+索引几乎是每个关系型数据库都拥有的特性,但 Vitess 由于不需要用到索引,因此并没有进行实现。
+
+于是我们引入了 [Pilosa][15] 这个开源项目。Pilosa 是一个使用 go 实现的分布式位图索引,可以显著提升跨多个大型数据集的查询的速度。通过 Pilosa,gitbase 才得以在巨大的数据集中进行查询。
+
+### 总结
+
+我想用这一篇文章来对开源社区表达我衷心的感谢,让我们能够不负众望的在短时间内完成 gitbase 的开发。我们 source{d} 的每一位成员都是开源的拥护者,github.com/src-d 下的每一行代码都是见证。
+
+你想使用 gitbase 吗?最简单快捷的方式是从 sourced.tech/engine 下载 source{d} 引擎,就可以通过单个命令运行 gitbase 了。
+
+想要了解更多,可以听听我在 [Go SF 大会][16]上的演讲录音。
+
+本文在 [Medium][17] 首发,并经许可在此发布。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/11/gitbase
+
+作者:[Francesc Campoy][a]
+选题:[lujun9972][b]
+译者:[HankChow](https://github.com/HankChow)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/francesc
+[b]: https://github.com/lujun9972
+[1]: https://github.com/src-d/gitbase
+[2]: https://github.com/src-d/gitbase-web
+[3]: https://github.com/vitessio/vitess
+[4]: https://github.com/src-d/go-mysql-server
+[5]: http://justforfunc.com/
+[6]: https://youtu.be/bcRDXAraprk
+[7]: https://github.com/src-d/go-git
+[8]: https://github.com/src-d/siva
+[9]: https://github.com/src-d/enry
+[10]: https://github.com/bblfsh/bblfshd
+[11]: https://blog.sourced.tech/post/announcing-pga/
+[12]: https://github.com/moovweb/rubex
+[13]: https://github.com/kkos/oniguruma
+[14]: https://golang.org/cmd/cgo/
+[15]: https://github.com/pilosa/pilosa
+[16]: https://www.meetup.com/golangsf/events/251690574/
+[17]: https://medium.com/sourcedtech/gitbase-exploring-git-repos-with-sql-95ec0986386c
+
diff --git a/published/20181107 How To Find The Execution Time Of A Command Or Process In Linux.md b/published/20181107 How To Find The Execution Time Of A Command Or Process In Linux.md
new file mode 100644
index 0000000000..4d7112d397
--- /dev/null
+++ b/published/20181107 How To Find The Execution Time Of A Command Or Process In Linux.md
@@ -0,0 +1,186 @@
+在 Linux 中如何查找一个命令或进程的执行时间
+======
+
+
+
+在类 Unix 系统中,你可能知道一个命令或进程开始执行的时间,以及[一个进程运行了多久][1]。 但是,你如何知道这个命令或进程何时结束或者它完成运行所花费的总时长呢? 在类 Unix 系统中,这是非常容易的! 有一个专门为此设计的程序名叫 **GNU time**。 使用 `time` 程序,我们可以轻松地测量 Linux 操作系统中命令或程序的总执行时间。 `time` 命令在大多数 Linux 发行版中都有预装,所以你不必去安装它。
+
+### 在 Linux 中查找一个命令或进程的执行时间
+
+要测量一个命令或程序的执行时间,运行:
+
+```
+$ /usr/bin/time -p ls
+```
+
+或者,
+
+```
+$ time ls
+```
+
+输出样例:
+
+```
+dir1 dir2 file1 file2 mcelog
+
+real 0m0.007s
+user 0m0.001s
+sys 0m0.004s
+```
+
+```
+$ time ls -a
+. .bash_logout dir1 file2 mcelog .sudo_as_admin_successful
+.. .bashrc dir2 .gnupg .profile .wget-hsts
+.bash_history .cache file1 .local .stack
+
+real 0m0.008s
+user 0m0.001s
+sys 0m0.005s
+```
+
+以上命令显示出了 `ls` 命令的总执行时间。 你可以将 `ls` 替换为任何命令或进程,以查找总的执行时间。
+
+输出详解:
+
+ 1. `real` —— 指的是命令或程序所花费的总时间
+ 2. `user` —— 指的是在用户模式下程序所花费的时间
+ 3. `sys` —— 指的是在内核模式下程序所花费的时间
+
+
+
+我们也可以将命令限制为仅运行一段时间。参考如下教程了解更多细节:
+
+- [在 Linux 中如何让一个命令运行特定的时长](https://www.ostechnix.com/run-command-specific-time-linux/)
+
+### time 与 /usr/bin/time
+
+你可能注意到了, 我们在上面的例子中使用了两个命令 `time` 和 `/usr/bin/time` 。 所以,你可能会想知道他们的不同。
+
+首先, 让我们使用 `type` 命令看看 `time` 命令到底是什么。对于那些我们不了解的 Linux 命令,`type` 命令用于查找相关命令的信息。 更多详细信息,[请参阅本指南][2]。
+
+```
+$ type -a time
+time is a shell keyword
+time is /usr/bin/time
+```
+
+正如你在上面的输出中看到的一样,`time` 是两个东西:
+
+ * 一个是 BASH shell 中内建的关键字
+ * 一个是可执行文件,如 `/usr/bin/time`
+
+由于 shell 关键字的优先级高于可执行文件,当你没有给出完整路径只运行 `time` 命令时,你运行的是 shell 内建的命令。 但是,当你运行 `/usr/bin/time` 时,你运行的是真正的 **GNU time** 命令。 因此,为了执行真正的命令你可能需要给出完整路径。
+
+在大多数 shell 中如 BASH、ZSH、CSH、KSH、TCSH 等,内建的关键字 `time` 是可用的。 `time` 关键字的选项少于该可执行文件,你可以使用的唯一选项是 `-p`。
+
+你现在知道了如何使用 `time` 命令查找给定命令或进程的总执行时间。 想进一步了解 GNU time 工具吗? 继续阅读吧!
+
+### 关于 GNU time 程序的简要介绍
+
+GNU time 程序运行带有给定参数的命令或程序,并在命令完成后将系统资源使用情况汇总到标准输出。 与 `time` 关键字不同,GNU time 程序不仅显示命令或进程的执行时间,还显示内存、I/O 和 IPC 调用等其他资源。
+
+`time` 命令的语法是:
+
+```
+/usr/bin/time [options] command [arguments...]
+```
+
+上述语法中的 `options` 是指一组可以与 `time` 命令一起使用去执行特定功能的选项。 下面给出了可用的选项:
+
+ * `-f, –format` —— 使用此选项可以根据需求指定输出格式。
+ * `-p, –portability` —— 使用简要的输出格式。
+ * `-o file, –output=FILE` —— 将输出写到指定文件中而不是到标准输出。
+ * `-a, –append` —— 将输出追加到文件中而不是覆盖它。
+ * `-v, –verbose` —— 此选项显示 `time` 命令输出的详细信息。
+ * `–quiet` – 此选项可以防止 `time` 命令报告程序的状态.
+
+当不带任何选项使用 GNU time 命令时,你将看到以下输出。
+
+```
+$ /usr/bin/time wc /etc/hosts
+9 28 273 /etc/hosts
+0.00user 0.00system 0:00.00elapsed 66%CPU (0avgtext+0avgdata 2024maxresident)k
+0inputs+0outputs (0major+73minor)pagefaults 0swaps
+```
+
+如果你用 shell 关键字 `time` 运行相同的命令, 输出会有一点儿不同:
+
+```
+$ time wc /etc/hosts
+9 28 273 /etc/hosts
+
+real 0m0.006s
+user 0m0.001s
+sys 0m0.004s
+```
+
+有时,你可能希望将系统资源使用情况输出到文件中而不是终端上。 为此, 你可以使用 `-o` 选项,如下所示。
+
+```
+$ /usr/bin/time -o file.txt ls
+dir1 dir2 file1 file2 file.txt mcelog
+```
+
+正如你看到的,`time` 命令不会显示到终端上。因为我们将输出写到了`file.txt` 的文件中。 让我们看一下这个文件的内容:
+
+```
+$ cat file.txt
+0.00user 0.00system 0:00.00elapsed 66%CPU (0avgtext+0avgdata 2512maxresident)k
+0inputs+0outputs (0major+106minor)pagefaults 0swaps
+```
+
+当你使用 `-o` 选项时, 如果你没有一个名为 `file.txt` 的文件,它会创建一个并把输出写进去。如果文件存在,它会覆盖文件原来的内容。
+
+你可以使用 `-a` 选项将输出追加到文件后面,而不是覆盖它的内容。
+
+```
+$ /usr/bin/time -a file.txt ls
+```
+
+`-f` 选项允许用户根据自己的喜好控制输出格式。 比如说,以下命令的输出仅显示用户,系统和总时间。
+
+```
+$ /usr/bin/time -f "\t%E real,\t%U user,\t%S sys" ls
+dir1 dir2 file1 file2 mcelog
+0:00.00 real, 0.00 user, 0.00 sys
+```
+
+请注意 shell 中内建的 `time` 命令并不具有 GNU time 程序的所有功能。
+
+有关 GNU time 程序的详细说明可以使用 `man` 命令来查看。
+
+```
+$ man time
+```
+
+想要了解有关 Bash 内建 `time` 关键字的更多信息,请运行:
+
+```
+$ help time
+```
+
+就到这里吧。 希望对你有所帮助。
+
+会有更多好东西分享哦。 请关注我们!
+
+加油哦!
+
+
+
+--------------------------------------------------------------------------------
+
+via: https://www.ostechnix.com/how-to-find-the-execution-time-of-a-command-or-process-in-linux/
+
+作者:[SK][a]
+选题:[lujun9972][b]
+译者:[caixiangyue](https://github.com/caixiangyue)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.ostechnix.com/author/sk/
+[b]: https://github.com/lujun9972
+[1]: https://www.ostechnix.com/find-long-process-running-linux/
+[2]: https://www.ostechnix.com/the-type-command-tutorial-with-examples-for-beginners/
diff --git a/published/20181108 Choosing a printer for Linux.md b/published/20181108 Choosing a printer for Linux.md
new file mode 100644
index 0000000000..0d13ffd990
--- /dev/null
+++ b/published/20181108 Choosing a printer for Linux.md
@@ -0,0 +1,79 @@
+为 Linux 选择打印机
+======
+
+> Linux 为打印机提供了广泛的支持。学习如何利用它。
+
+
+
+我们在传闻已久的无纸化社会方面取得了重大进展,但我们仍需要不时打印文件。如果你是 Linux 用户,并有一台没有 Linux 安装盘的打印机,或者你正准备在市场上购买新设备,那么你很幸运。因为大多数 Linux 发行版(以及 MacOS)都使用通用 Unix 打印系统([CUPS][1]),它包含了当今大多数打印机的驱动程序。这意味着 Linux 为打印机提供了比 Windows 更广泛的支持。
+
+### 选择打印机
+
+如果你需要购买新打印机,了解它是否支持 Linux 的最佳方法是查看包装盒或制造商网站上的文档。你也可以搜索 [Open Printing][2] 数据库。它是检查各种打印机与 Linux 兼容性的绝佳资源。
+
+以下是与 Linux 兼容的佳能打印机的一些 Open Printing 结果。
+
+
+
+下面的截图是 Open Printing 的 Hewlett-Packard LaserJet 4050 的结果 —— 根据数据库,它应该可以“完美”工作。这里列出了建议驱动以及通用说明,让我了解它适用于 CUPS、行式打印守护程序(LPD)、LPRng 等。
+
+
+
+在任何情况下,最好在购买打印机之前检查制造商的网站并询问其他 Linux 用户。
+
+### 检查你的连接
+
+有几种方法可以将打印机连接到计算机。如果你的打印机是通过 USB 连接的,那么可以在 Bash 提示符下输入 `lsusb` 来轻松检查连接。
+
+```
+$ lsusb
+```
+
+该命令返回 “Bus 002 Device 004: ID 03f0:ad2a Hewlett-Packard” —— 这没有太多价值,但可以得知打印机已连接。我可以通过输入以下命令获得有关打印机的更多信息:
+
+```
+$ dmesg | grep -i usb
+```
+
+结果更加详细。
+
+
+
+如果你尝试将打印机连接到并口(假设你的计算机有并口 —— 如今很少见),你可以使用此命令检查连接:
+
+```
+$ dmesg | grep -i parport
+```
+
+返回的信息可以帮助我为我的打印机选择正确的驱动程序。我发现,如果我坚持使用流行的名牌打印机,大部分时间我都能获得良好的效果。
+
+### 设置你的打印机软件
+
+Fedora Linux 和 Ubuntu Linux 都包含简单的打印机设置工具。[Fedora][3] 为打印问题的答案维护了一个出色的 wiki。可以在 GUI 中的设置轻松启动这些工具,也可以在命令行上调用 `system-config-printer`。
+
+
+
+HP 支持 Linux 打印的 [HP Linux 成像和打印][4] (HPLIP) 软件可能已安装在你的 Linux 系统上。如果没有,你可以为你的发行版[下载][5]最新版本。打印机制造商 [Epson][6] 和 [Brother][7] 也有带有 Linux 打印机驱动程序和信息的网页。
+
+你最喜欢的 Linux 打印机是什么?请在评论中分享你的意见。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/11/choosing-printer-linux
+
+作者:[Don Watkins][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/don-watkins
+[b]: https://github.com/lujun9972
+[1]: https://www.cups.org/
+[2]: http://www.openprinting.org/printers
+[3]: https://fedoraproject.org/wiki/Printing
+[4]: https://developers.hp.com/hp-linux-imaging-and-printing
+[5]: https://developers.hp.com/hp-linux-imaging-and-printing/gethplip
+[6]: https://epson.com/Support/wa00821
+[7]: https://support.brother.com/g/s/id/linux/en/index.html?c=us_ot&lang=en&comple=on&redirect=on
diff --git a/published/20181108 The Difference Between more, less And most Commands.md b/published/20181108 The Difference Between more, less And most Commands.md
new file mode 100644
index 0000000000..14e1fc87fd
--- /dev/null
+++ b/published/20181108 The Difference Between more, less And most Commands.md
@@ -0,0 +1,221 @@
+more、less 和 most 的区别
+======
+
+
+如果你是一个 Linux 方面的新手,你可能会在 `more`、`less`、`most` 这三个命令行工具之间产生疑惑。在本文当中,我会对这三个命令行工具进行对比,以及展示它们各自在 Linux 中的一些使用例子。总的来说,这几个命令行工具之间都有相通和差异,而且它们在大部分 Linux 发行版上都有自带。
+
+我们首先来看看 `more` 命令。
+
+### more 命令
+
+`more` 是一个老式的、基础的终端分页阅读器,它可以用于打开指定的文件并进行交互式阅读。如果文件的内容太长,在一屏以内无法完整显示,就会逐页显示文件内容。使用回车键或者空格键可以滚动浏览文件的内容,但有一个限制,就是只能够单向滚动。也就是说只能按顺序往下翻页,而不能进行回看。
+
+
+
+**更正**
+
+有的 Linux 用户向我指出,在 `more` 当中是可以向上翻页的。不过,最原始版本的 `more` 确实只允许向下翻页,在后续出现的较新的版本中也允许了有限次数的向上翻页,只需要在浏览过程中按 `b` 键即可向上翻页。唯一的限制是 `more` 不能搭配管道使用(如 `ls | more`)。(LCTT 译注:此处原作者疑似有误,译者使用 `more` 是可以搭配管道使用的,或许与不同 `more` 版本有关)
+
+按 `q` 即可退出 `more`。
+
+**更多示例**
+
+打开 `ostechnix.txt` 文件进行交互式阅读,可以执行以下命令:
+
+```
+$ more ostechnix.txt
+```
+
+在阅读过程中,如果需要查找某个字符串,只需要像下面这样输入斜杠(`/`)之后接着输入需要查找的内容:
+
+```
+/linux
+```
+
+按 `n` 键可以跳转到下一个匹配的字符串。
+
+如果需要在文件的第 `10` 行开始阅读,只需要执行:
+
+```
+$ more +10 file
+```
+
+就可以从文件的第 `10` 行开始显示文件的内容了。
+
+如果你需要让 `more` 提示你按空格键来翻页,可以加上 `-d` 参数:
+
+```
+$ more -d ostechnix.txt
+```
+
+![][2]
+
+如上图所示,`more` 会提示你可以按空格键翻页。
+
+如果需要查看所有选项以及对应的按键,可以按 `h` 键。
+
+要查看 `more` 的更多详细信息,可以参考手册:
+
+```
+$ man more
+```
+
+### less 命令
+
+`less` 命令也是用于打开指定的文件并进行交互式阅读,它也支持翻页和搜索。如果文件的内容太长,也会对输出进行分页,因此也可以翻页阅读。比 `more` 命令更好的一点是,`less` 支持向上翻页和向下翻页,也就是可以在整个文件中任意阅读。
+
+![][4]
+
+在使用功能方面,`less` 比 `more` 命令具有更多优点,以下列出其中几个:
+
+ * 支持向上翻页和向下翻页
+ * 支持向上搜索和向下搜索
+ * 可以跳转到文件的末尾并立即从文件的开头开始阅读
+ * 在编辑器中打开指定的文件
+
+**更多示例**
+
+打开文件:
+
+```
+$ less ostechnix.txt
+```
+
+按空格键或回车键可以向下翻页,按 `b` 键可以向上翻页。
+
+如果需要向下搜索,在输入斜杠(`/`)之后接着输入需要搜索的内容:
+
+```
+/linux
+```
+
+按 `n` 键可以跳转到下一个匹配的字符串,如果需要跳转到上一个匹配的字符串,可以按 `N` 键。
+
+如果需要向上搜索,在输入问号(`?`)之后接着输入需要搜索的内容:
+
+```
+?linux
+```
+
+同样是按 `n` 键或 `N` 键跳转到下一个或上一个匹配的字符串。
+
+只需要按 `v` 键,就会将正在阅读的文件在默认编辑器中打开,然后就可以对文件进行各种编辑操作了。
+
+按 `h` 键可以查看 `less` 工具的选项和对应的按键。
+
+按 `q` 键可以退出阅读。
+
+要查看 `less` 的更多详细信息,可以参考手册:
+
+```
+$ man less
+```
+
+### most 命令
+
+`most` 同样是一个终端阅读工具,而且比 `more` 和 `less` 的功能更为丰富。`most` 支持同时打开多个文件。你可以在打开的文件之间切换、编辑当前打开的文件、迅速跳转到文件中的某一行、分屏阅读、同时锁定或滚动多个屏幕等等功能。在默认情况下,对于较长的行,`most` 不会将其截断成多行显示,而是提供了左右滚动功能以在同一行内显示。
+
+**更多示例**
+
+打开文件:
+
+```
+$ most ostechnix1.txt
+```
+
+
+
+按 `e` 键可以编辑当前文件。
+
+如果需要向下搜索,在斜杠(`/`)或 `S` 或 `f` 之后输入需要搜索的内容,按 `n` 键就可以跳转到下一个匹配的字符串。
+
+![][3]
+
+如果需要向上搜索,在问号(`?`)之后输入需要搜索的内容,也是通过按 `n` 键跳转到下一个匹配的字符串。
+
+同时打开多个文件:
+
+```
+$ most ostechnix1.txt ostechnix2.txt ostechnix3.txt
+```
+
+在打开了多个文件的状态下,可以输入 `:n` 切换到下一个文件,使用 `↑` 或 `↓` 键选择需要切换到的文件,按回车键就可以查看对应的文件。
+
+
+
+要打开文件并跳转到某个字符串首次出现的位置(例如 linux),可以执行以下命令:
+
+```
+$ most file +/linux
+```
+
+按 `h` 键可以查看帮助。
+
+**按键操作列表**
+
+移动:
+
+ * 空格键或 `D` 键 – 向下滚动一屏
+ * `DELETE` 键或 `U` 键 – 向上滚动一屏
+ * `↓` 键 – 向下移动一行
+ * `↑` 键 – 向上移动一行
+ * `T` 键 – 移动到文件开头
+ * `B` 键 – 移动到文件末尾
+ * `>` 键或 `TAB` 键 – 向右滚动屏幕
+ * `<` 键 – 向左滚动屏幕
+ * `→` 键 – 向右移动一列
+ * `←` 键 – 向左移动一列
+ * `J` 键或 `G` 键 – 移动到某一行,例如 `10j` 可以移动到第 10 行
+ * `%` 键 – 移动到文件长度某个百分比的位置
+
+窗口命令:
+
+ * `Ctrl-X 2`、`Ctrl-W 2` – 分屏
+ * `Ctrl-X 1`、`Ctrl-W 1` – 只显示一个窗口
+ * `O` 键、`Ctrl-X O` – 切换到另一个窗口
+ * `Ctrl-X 0` – 删除窗口
+
+文件内搜索:
+
+ * `S` 键或 `f` 键或 `/` 键 – 向下搜索
+ * `?` 键 – 向上搜索
+ * `n` 键 – 跳转到下一个匹配的字符串
+
+退出:
+
+ * `q` 键 – 退出 `most` ,且所有打开的文件都会被关闭
+ * `:N`、`:n` – 退出当前文件并查看下一个文件(使用 `↑` 键、`↓` 键选择下一个文件)
+
+要查看 `most` 的更多详细信息,可以参考手册:
+
+```
+$ man most
+```
+
+### 总结
+
+`more` – 传统且基础的分页阅读工具,仅支持向下翻页和有限次数的向上翻页。
+
+`less` – 比 `more` 功能丰富,支持向下翻页和向上翻页,也支持文本搜索。在打开大文件的时候,比 `vi` 这类文本编辑器启动得更快。
+
+`most` – 在上述两个工具功能的基础上,还加入了同时打开多个文件、同时锁定或滚动多个屏幕、分屏等等大量功能。
+
+以上就是我的介绍,希望能让你通过我的文章对这三个工具有一定的认识。如果想了解这篇文章以外的关于这几个工具的详细功能,请参阅它们的 `man` 手册。
+
+--------------------------------------------------------------------------------
+
+via: https://www.ostechnix.com/the-difference-between-more-less-and-most-commands/
+
+作者:[SK][a]
+选题:[lujun9972][b]
+译者:[HankChow](https://github.com/HankChow)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.ostechnix.com/author/sk/
+[b]: https://github.com/lujun9972
+[1]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
+[2]: http://www.ostechnix.com/wp-content/uploads/2018/11/more-1.png
+[3]: http://www.ostechnix.com/wp-content/uploads/2018/11/most-1-1.gif
+[4]: https://www.ostechnix.com/wp-content/uploads/2018/11/less-command-demo.gif
diff --git a/published/20181109 7 reasons I love open source.md b/published/20181109 7 reasons I love open source.md
new file mode 100644
index 0000000000..f45dfa2e86
--- /dev/null
+++ b/published/20181109 7 reasons I love open source.md
@@ -0,0 +1,41 @@
+我爱开源的 7 个理由
+======
+
+> 成为开源社区的一员绝对是一个明智之举,原因有很多。
+
+
+
+这就是我为什么包括晚上和周末在内花费非常多的时间待在 [GitHub][1] 上,成为开源社区的一个活跃成员。
+
+我参加过各种规模的项目,从个人项目到几个人的协作项目,乃至有数百位贡献者的项目,每一个项目都让我有新的受益。
+
+
+
+也就是说,这里有七个原因让我为开源做出贡献:
+
+ * **它让我的技能与时俱进。** 在咨询公司的管理职位工作,有时我觉得自己与创建软件的实际过程越来越远。参与开源项目使我可以重新回到我最热爱的编程之中。也使我能够体验新技术,学习新技术和语言,并且使我不被酷酷的孩子们落下。
+ * **它教我如何与人打交道。** 与一群素未谋面的人合作开源项目在与人交往方面能够教会你很多。你很快会发现每个人有他们自己的压力,他们自己的义务,以及不同的时间表。学习如何与一群陌生人合作是一种很好的生活技能。
+ * **它使我成为一个更好的沟通者。** 开源项目的维护者的时间有限。你很快就知道,要成功地贡献,你必须能够清楚、简明地表达你所做的改变、添加或修复,最重要的是,你为什么要这么做。
+ * **它使我成为一个更好的开发者。** 没有什么能像成百上千的其他开发者依赖你的代码一样 —— 它敦促你更加专注软件设计、测试和文档。
+ * **它使我的造物变得更好。** 可能开源背后最强大的观念是它允许你驾驭一个由有创造力、有智慧、有知识的个人组成的全球网络。我知道我自己一个人的能力是有限的,我不可能什么都知道,但与开源社区的合作有助于我改进我的创作。
+ * **它告诉我小事物的价值。** 如果一个项目的文档不清楚或不完整,我会毫不犹豫地把它做得更好。一个小小的更新或修复可能只节省开发人员几分钟的时间,但是随着用户数量的增加,您一个小小的更改可能产生巨大的价值。
+ * **它使我更好的营销。** 好的,这是一个奇怪的例子。有这么多伟大的开源项目在那里,感觉像一场争夺关注的拼搏。从事于开源让我学到了很多营销的价值。这不是关于讲述或创建一个华丽的网站。而是关于如何清楚地传达你所创造的,它是如何使用的,以及它带来的好处。
+
+我可以继续讨论开源是如何帮助你发展伙伴、关系和朋友的,不过你应该都知道了。有许多原因让我乐于成为开源社区的一员。
+
+你可能想知道这些如何用于大型金融服务机构的 IT 战略。简单来说:谁不想要一个擅长与人交流和工作,具有尖端的技能,并能够推销他们的成果的开发团队呢?
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/11/reasons-love-open-source
+
+作者:[Colin Eberhardt][a]
+选题:[lujun9972][b]
+译者:[ChiZelin](https://github.com/ChiZelin)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/colineberhardt
+[b]: https://github.com/lujun9972
+[1]: https://github.com/ColinEberhardt/
diff --git a/published/20181113 4 tips for learning Golang.md b/published/20181113 4 tips for learning Golang.md
new file mode 100644
index 0000000000..ed80a40ded
--- /dev/null
+++ b/published/20181113 4 tips for learning Golang.md
@@ -0,0 +1,80 @@
+学习 Golang 的 4 个技巧
+======
+
+> 到达 Golang 大陆:一位资深开发者之旅。
+
+
+
+2014 年夏天……
+
+> IBM:“我们需要你弄清楚这个 Docker。”
+
+> 我:“没问题。”
+
+> IBM:“那就开始吧。”
+
+> 我:“好的。”(内心声音):”Docker 是用 Go 编写的。是吗?“(Google 一下)“哦,一门编程语言。我在我的岗位上已经学习了很多了。这不会太难。”
+
+我的大学新生编程课是使用 VAX 汇编程序教授的。在数据结构课上,我们使用 Pascal —— 在图书馆计算机中心的旧电脑上使用软盘加载。在一门更高一级的课程中,我的教授教授喜欢用 ADA 去展示所有的例子。在我们的 Sun 工作站上,我通过各种 UNIX 的实用源代码学到了一点 C。在 IBM,OS/2 源代码中我们使用了 C 和一些 x86 汇编程序;在一个与 Apple 合作的项目中我们大量使用 C++ 的面向对象功能。不久后我学到了 shell 脚本,开始是 csh,但是在 90 年代中期发现 Linux 后就转到了 Bash。在 90 年代后期,我在将 IBM 的定制的 JVM 代码中的即时(JIT)编译器移植到 Linux 时,我不得不开始学习 m4(与其说是编程语言,不如说是一种宏处理器)。
+
+一晃 20 年……我从未因为学习一门新的编程语言而焦灼。但是 [Go][1] 让我感觉有些不同。我打算公开贡献,上传到 GitHub,让任何有兴趣的人都可以看到!作为一个 40 多岁的资深开发者的 Go 新手,我不想成为一个笑话。我们都知道程序员的骄傲,不想丢人,不论你的经验水平如何。
+
+我早期的调研显示,Go 似乎比某些语言更 “地道”。它不仅仅是让代码可以编译;也需要让代码可以 “Go Go Go”。
+
+现在,我的个人的 Go 之旅四年间有了几百个拉取请求(PR),我不是致力于成为一个专家,但是现在我觉得贡献和编写代码比我在 2014 年的时候更舒服了。所以,你该怎么教一个老人新的技能或者一门编程语言呢?以下是我自己在前往 Golang 大陆之旅的四个步骤。
+
+### 1、不要跳过基础
+
+虽然你可以通过复制代码来进行你早期的学习(谁还有时间阅读手册!?),Go 有一个非常易读的 [语言规范][2],它写的很易于理解,即便你在语言或者编译理论方面没有取得硕士学位。鉴于 Go 的 **参数:类型** 顺序的特有习惯,以及一些有趣的语言功能,例如通道和 go 协程,搞定这些新概念是非常重要的是事情。阅读这个附属的文档 [高效 Go 编程][3],这是 Golang 创造者提供的另一个重要资源,它将为你提供有效和正确使用语言的准备。
+
+### 2、从最好的中学习
+
+有许多宝贵的资源可供挖掘,可以将你的 Go 知识提升到下一个等级。最近在 [GopherCon][4] 上的所有讲演都可以在网上找到,如这个 [GopherCon US 2018][5] 的详尽列表。这些讲演的专业知识和技术水平各不相同,但是你可以通过它们轻松地找到一些你所不了解的事情。[Francesc Campoy][6] 创建了一个名叫 [JustForFunc][7] 的 Go 编程视频系列,其不断增多的剧集可以用来拓宽你的 Go 知识和理解。直接搜索 “Golang" 可以为那些想要了解更多信息的人们展示许多其它视频和在线资源。
+
+想要看代码?在 GitHub 上许多受欢迎的云原生项目都是用 Go 写的:[Docker/Moby][8]、[Kubernetes][9]、[Istio][10]、[containerd][11]、[CoreDNS][12],以及许多其它的。语言纯粹主义者可能会认为一些项目比另外一些更地道,但这些都是很好的起点,可以看到在高度活跃的项目的大型代码库中使用 Go 的程度。
+
+### 3、使用优秀的语言工具
+
+你会很快了解到 [gofmt][13] 的宝贵之处。Go 最漂亮的一个地方就在于没有关于每个项目代码格式的争论 —— **gofmt** 内置在语言的运行环境中,并且根据一系列可靠的、易于理解的语言规则对 Go 代码进行格式化。我不知道有哪个基于 Golang 的项目会在持续集成中不坚持使用 **gofmt** 检查拉取请求。
+
+除了直接构建于运行环境和 SDK 中的一系列有价值的工具之外,我强烈建议使用一个对 Golang 的特性有良好支持的编辑器或者 IDE。由于我经常在命令行中进行工作,我依赖于 Vim 加上强大的 [vim-go][14] 插件。我也喜欢微软提供的 [VS Code][15],特别是它的 [Go 语言][16] 插件。
+
+想要一个调试器?[Delve][17] 项目在不断的改进和成熟,它是在 Go 二进制文件上进行 [gdb][18] 式调试的强有力的竞争者。
+
+### 4、写一些代码
+
+你要是不开始尝试使用 Go 写代码,你永远不知道它有什么好的地方。找一个有 “需要帮助” 问题标签的项目,然后开始贡献代码。如果你已经使用了一个用 Go 编写的开源项目,找出它是否有一些可以用初学者方式解决的 Bug,然后开始你的第一个拉取请求。与生活中的大多数事情一样,实践出真知,所以开始吧。
+
+事实证明,你可以教会一个资深的老开发者一门新的技能甚至编程语言。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/11/learning-golang
+
+作者:[Phill Estes][a]
+选题:[lujun9972][b]
+译者:[dianbanjiu](https://github.com/dianbanjiu)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/estesp
+[b]: https://github.com/lujun9972
+[1]: https://golang.org/
+[2]: https://golang.org/ref/spec
+[3]: https://golang.org/doc/effective_go.html
+[4]: https://www.gophercon.com/
+[5]: https://tqdev.com/2018-gophercon-2018-videos-online
+[6]: https://twitter.com/francesc
+[7]: https://www.youtube.com/channel/UC_BzFbxG2za3bp5NRRRXJSw
+[8]: https://github.com/moby/moby
+[9]: https://github.com/kubernetes/kubernetes
+[10]: https://github.com/istio/istio
+[11]: https://github.com/containerd/containerd
+[12]: https://github.com/coredns/coredns
+[13]: https://blog.golang.org/go-fmt-your-code
+[14]: https://github.com/fatih/vim-go
+[15]: https://code.visualstudio.com/
+[16]: https://code.visualstudio.com/docs/languages/go
+[17]: https://github.com/derekparker/delve
+[18]: https://www.gnu.org/software/gdb/
diff --git a/published/20181113 The alias And unalias Commands Explained With Examples.md b/published/20181113 The alias And unalias Commands Explained With Examples.md
new file mode 100644
index 0000000000..1448918a1e
--- /dev/null
+++ b/published/20181113 The alias And unalias Commands Explained With Examples.md
@@ -0,0 +1,156 @@
+举例说明 alias 和 unalias 命令
+======
+
+
+
+如果不是一个命令行重度用户的话,过了一段时间之后,你就可能已经忘记了这些复杂且冗长的 Linux 命令了。当然,有很多方法可以让你 [回想起遗忘的命令][1]。你可以简单的 [保存常用的命令][2] 然后按需使用。也可以在终端里 [标记重要的命令][3],然后在任何时候你想要的时间使用它们。而且,Linux 有一个内建命令 `history` 可以帮助你记忆这些命令。另外一个记住这些如此长的命令的简便方式就是为这些命令创建一个别名。你可以为任何经常重复调用的常用命令创建别名,而不仅仅是长命令。通过这种方法,你不必再过多地记忆这些命令。这篇文章中,我们将会在 Linux 环境下举例说明 `alias` 和 `unalias` 命令。
+
+### alias 命令
+
+`alias` 使用一个用户自定义的字符串来代替一个或者一串命令(包括多个选项、参数)。这个字符串可以是一个简单的名字或者缩写,不管这个命令原来多么复杂。`alias` 命令已经预装在 shell(包括 BASH、Csh、Ksh 和 Zsh 等) 当中。
+
+`alias` 的通用语法是:
+
+```
+alias [alias-name[=string]...]
+```
+
+接下来看几个例子。
+
+#### 列出别名
+
+可能在你的系统中已经设置了一些别名。有些应用在你安装它们的时候可能已经自动创建了别名。要查看已经存在的别名,运行:
+
+```
+$ alias
+```
+
+或者,
+
+```
+$ alias -p
+```
+
+在我的 Arch Linux 系统中已经设置了下面这些别名。
+
+```
+alias betty='/home/sk/betty/main.rb'
+alias ls='ls --color=auto'
+alias pbcopy='xclip -selection clipboard'
+alias pbpaste='xclip -selection clipboard -o'
+alias update='newsbeuter -r && sudo pacman -Syu'
+```
+
+#### 创建一个新的别名
+
+像我之前说的,你不必去记忆这些又臭又长的命令。你甚至不必一遍一遍的运行长命令。只需要为这些命令创建一个简单易懂的别名,然后在任何你想使用的时候运行这些别名就可以了。这种方式会让你爱上命令行。
+
+```
+$ du -h --max-depth=1 | sort -hr
+```
+
+这个命令将会查找当前工作目录下的各个子目录占用的磁盘大小,并按照从大到小的顺序进行排序。这个命令有点长。我们可以像下面这样轻易地为其创建一个 别名:
+
+```
+$ alias du='du -h --max-depth=1 | sort -hr'
+```
+
+这里的 `du` 就是这条命令的别名。这个别名可以被设置为任何名字,主要便于记忆和区别。
+
+在创建一个别名的时候,使用单引号或者双引号都是可以的。这两种方法最后的结果没有任何区别。
+
+现在你可以运行这个别名(例如我们这个例子中的 `du` )。它和上面的原命令将会产生相同的结果。
+
+这个别名仅限于当前 shell 会话中。一旦你退出了当前 shell 会话,别名也就失效了。为了让这些别名长久有效,你需要把它们添加到你 shell 的配置文件当中。
+
+BASH,编辑 `~/.bashrc` 文件:
+
+```
+$ nano ~/.bashrc
+```
+
+一行添加一个别名:
+
+
+
+保存并退出这个文件。然后运行以下命令更新修改:
+
+```
+$ source ~/.bashrc
+```
+
+现在,这些别名在所有会话中都可以永久使用了。
+
+ZSH,你需要添加这些别名到 `~/.zshrc`文件中。Fish,跟上面的类似,添加这些别名到 `~/.config/fish/config.fish` 文件中。
+
+#### 查看某个特定的命令别名
+
+像我上面提到的,你可以使用 `alias` 命令列出你系统中所有的别名。如果你想查看跟给定的别名有关的命令,例如 `du`,只需要运行:
+
+```
+$ alias du
+alias du='du -h --max-depth=1 | sort -hr'
+```
+
+像你看到的那样,上面的命令可以显示与单词 `du` 有关的命令。
+
+关于 `alias` 命令更多的细节,参阅 man 手册页:
+
+```
+$ man alias
+```
+
+### unalias 命令
+
+跟它的名字说的一样,`unalias` 命令可以很轻松地从你的系统当中移除别名。`unalias` 命令的通用语法是:
+
+```
+unalias
+```
+
+要移除命令的别名,像我们之前创建的 `du`,只需要运行:
+
+```
+$ unalias du
+```
+
+`unalias` 命令不仅会从当前会话中移除别名,也会从你的 shell 配置文件中永久地移除别名。
+
+还有一种移除别名的方法,是创建具有相同名称的新别名。
+
+要从当前会话中移除所有的别名,使用 `-a` 选项:
+
+```
+$ unalias -a
+```
+
+更多细节,参阅 man 手册页。
+
+```
+$ man unalias
+```
+
+如果你经常一遍又一遍的运行这些繁杂又冗长的命令,给它们创建别名可以节省你的时间。现在是你为常用命令创建别名的时候了。
+
+这就是所有的内容了。希望可以帮到你。还有更多的干货即将到来,敬请期待!
+
+祝近祺!
+
+
+
+--------------------------------------------------------------------------------
+
+via: https://www.ostechnix.com/the-alias-and-unalias-commands-explained-with-examples/
+
+作者:[SK][a]
+选题:[lujun9972][b]
+译者:[dianbanjiu](https://github.com/dianbanjiu)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.ostechnix.com/author/sk/
+[b]: https://github.com/lujun9972
+[1]: https://www.ostechnix.com/easily-recall-forgotten-linux-commands/
+[2]: https://www.ostechnix.com/save-commands-terminal-use-demand/
+[3]: https://www.ostechnix.com/bookmark-linux-commands-easier-repeated-invocation/
diff --git a/published/20181113 What you need to know about the GPL Cooperation Commitment.md b/published/20181113 What you need to know about the GPL Cooperation Commitment.md
new file mode 100644
index 0000000000..2218dfcd2c
--- /dev/null
+++ b/published/20181113 What you need to know about the GPL Cooperation Commitment.md
@@ -0,0 +1,55 @@
+GPL 合作承诺的发展历程
+======
+
+> GPL 合作承诺GPL Cooperation Commitment消除了开发者对许可证失效的顾虑,从而达到促进技术创新的目的。
+
+
+
+假如能免于顾虑,技术创新和发展将会让世界发生天翻地覆的改变。[GPL 合作承诺][1]GPL Cooperation Commitment就这样应运而生,只为通过公平、一致、可预测的许可证来让科技创新无后顾之忧。
+
+去年,我曾经写过一篇文章,讨论了许可证对开源软件下游用户的影响。在进行研究的时候,我就发现许可证的约束力并不强,而且很多情况下是不可预测的。因此,我在文章中提出了一个能使开源许可证具有一致性和可预测性的潜在解决方案。但我只考虑到了诸如通过法律系统立法的“传统”方法。
+
+2017 年 11 月,RedHat、IBM、Google 和 Facebook 提出了这种我从未考虑过的非传统的解决方案:GPL 合作承诺。GPL 合作承诺规定了 GPL 公平一致执行的方式。我认为,GPL 合作承诺之所以有这么深刻的意义,有以下两个原因:一是许可证的公平性和一致性对于开源社区的发展来说至关重要,二是法律对不可预测性并不容忍。
+
+### 了解 GPL
+
+要了解 GPL 合作承诺,首先要了解什么是 GPL。GPL 是 [GNU 通用许可证][2]GNU General Public License的缩写,它是一个公共版权的开源许可证,这就意味着开源软件的分发者必须向下游用户公开源代码。GPL 还禁止对下游的使用作出限制,要求个人用户不得拒绝他人对开源软件的使用自由、研究自由、共享自由和改进自由。GPL 规定,只要下游用户满足了许可证的要求和条件,就可以使用该许可证。如果被许可人出现了不符合许可证的情况,则视为违规。
+
+按照第二版 GPL(GPLv2)的描述,许可证会在任何违规的情况下自动终止,这就导致了部分开发者对 GPL 有所抗拒。而在第三版 GPL(GPLv3)中则引入了“[治愈条款][3]cure provision”,这一条款规定,被许可人可以在 30 天内对违反 GPL 的行为进行改正,如果在这个缓冲期内改正完成,许可证就不会被终止。
+
+这一规定消除了许可证被无故终止的顾虑,从而让软件的开发者和用户专注于开发和创新。
+
+### GPL 合作承诺做了什么
+
+GPL 合作承诺将 GPLv3 的治愈条款应用于使用 GPLv2 的软件上,让使用 GPLv2 许可证的开发者避免许可证无故终止的窘境,并与 GPLv3 许可证保持一致。
+
+很多软件开发者都希望正确合规地做好一件事情,但有时候却不了解具体的实施细节。因此,GPL 合作承诺的重要性就在于能够对软件开发者们做出一些引导,让他们避免因一些简单的错误导致许可证违规终止。
+
+Linux 基金会技术顾问委员会在 2017 年宣布,Linux 内核项目将会[采用 GPLv3 的治愈条款][4]。在 GPL 合作承诺的推动下,很多大型科技公司和个人开发者都做出了相同的承诺,会将该条款扩展应用于他们采用 GPLv2(或 LGPLv2.1)许可证的所有软件,而不仅仅是对 Linux 内核的贡献。
+
+GPL 合作承诺的广泛采用将会对开源社区产生非常积极的影响。如果更多的公司和个人开始采用 GPL 合作承诺,就能让大量正在使用 GPLv2 或 LGPLv2.1 许可证的软件以更公平和更可预测的形式履行许可证中的条款。
+
+截至 2018 年 11 月,包括 IBM、Google、亚马逊、微软、腾讯、英特尔、RedHat 在内的 40 余家行业巨头公司都已经[签署了 GPL 合作承诺][5],以期为开源社区创立公平的标准以及提供可预测的执行力。GPL 合作承诺是开源社区齐心协力引领开源未来发展方向的一个成功例子。
+
+GPL 合作承诺能够让下游用户了解到开发者对他们的尊重,同时也表示了开发者使用了 GPLv2 许可证的代码是安全的。如果你想查阅更多信息,包括如何将自己的名字添加到 GPL 合作承诺中,可以访问 [GPL 合作承诺的网站][6]。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/11/gpl-cooperation-commitment
+
+作者:[Brooke Driver][a]
+选题:[lujun9972][b]
+译者:[HankChow](https://github.com/HankChow)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/bdriver
+[b]: https://github.com/lujun9972
+[1]: https://gplcc.github.io/gplcc/
+[2]: https://www.gnu.org/licenses/licenses.en.html
+[3]: https://opensource.com/article/18/6/gplv3-anniversary
+[4]: https://www.kernel.org/doc/html/v4.16/process/kernel-enforcement-statement.html
+[5]: https://gplcc.github.io/gplcc/Company/Company-List.html
+[6]: http://gplcc.github.io/gplcc
+
diff --git a/published/20181114 ProtectedText - A Free Encrypted Notepad To Save Your Notes Online.md b/published/20181114 ProtectedText - A Free Encrypted Notepad To Save Your Notes Online.md
new file mode 100644
index 0000000000..99a92d917b
--- /dev/null
+++ b/published/20181114 ProtectedText - A Free Encrypted Notepad To Save Your Notes Online.md
@@ -0,0 +1,79 @@
+ProtectedText:一个免费的在线加密笔记
+======
+
+
+
+记录笔记是我们每个人必备的重要技能,它可以帮助我们把自己听到、读到、学到的内容长期地保留下来,也有很多的应用和工具都能让我们更好地记录笔记。下面我要介绍一个叫做 **ProtectedText** 的应用,这是一个可以将你的笔记在线上保存起来的免费的加密笔记。它是一个免费的 web 服务,在上面记录文本以后,它将会对文本进行加密,只需要一台支持连接到互联网并且拥有 web 浏览器的设备,就可以访问到记录的内容。
+
+ProtectedText 不会向你询问任何个人信息,也不会保存任何密码,没有广告,没有 Cookies,更没有用户跟踪和注册流程。除了拥有密码能够解密文本的人,任何人都无法查看到笔记的内容。而且,使用前不需要在网站上注册账号,写完笔记之后,直接关闭浏览器,你的笔记也就保存好了。
+
+### 在加密笔记本上记录笔记
+
+访问 这个链接,就可以打开 ProtectedText 页面了(LCTT 译注:如果访问不了,你知道的)。这个时候你将进入网站主页,接下来需要在页面上的输入框输入一个你想用的名称,或者在地址栏后面直接加上想用的名称。这个名称是一个自定义的名称(例如 ),是你查看自己保存的笔记的专有入口。
+
+
+
+如果你选用的名称还没有被占用,你就会看到下图中的提示信息。点击 “Create” 键就可以创建你的个人笔记页了。
+
+
+
+至此你已经创建好了你自己的笔记页面,可以开始记录笔记了。目前每个笔记页的最大容量是每页 750000+ 个字符。
+
+ProtectedText 使用 AES 算法对你的笔记内容进行加密和解密,而计算散列则使用了 SHA512 算法。
+
+笔记记录完毕以后,点击顶部的 “Save” 键保存。
+
+
+
+按下保存键之后,ProtectedText 会提示你输入密码以加密你的笔记内容。按照它的要求输入两次密码,然后点击 “Save” 键。
+
+
+
+尽管 ProtectedText 对你使用的密码没有太多要求,但毕竟密码总是一寸长一寸强,所以还是最好使用长且复杂的密码(用到数字和特殊字符)以避免暴力破解。由于 ProtectedText 不会保存你的密码,一旦密码丢失,密码和笔记内容就都找不回来了。因此,请牢记你的密码,或者使用诸如 [Buttercup][3]、[KeeWeb][4] 这样的密码管理器来存储你的密码。
+
+在使用其它设备时,可以通过访问之前创建的 URL 就可以访问你的笔记了。届时会出现如下的提示信息,只需要输入正确的密码,就可以查看和编辑你的笔记。
+
+
+
+一般情况下,只有知道密码的人才能正常访问笔记的内容。如果你希望将自己的笔记公开,只需要以 的形式访问就可以了,ProtectedText 将会自动使用 `yourPassword` 字符串解密你的笔记。
+
+ProtectedText 还有配套的 [Android 应用][6] 可以让你在移动设备上进行同步笔记、离线工作、备份笔记、锁定/解锁笔记等等操作。
+
+**优点**
+
+ * 简单、易用、快速、免费
+ * ProtectedText.com 的客户端代码可以在[这里][7]免费获取,如果你想了解它的底层实现,可以自行学习它的源代码
+ * 存储的内容没有到期时间,只要你愿意,笔记内容可以一直保存在服务器上
+ * 可以让你的数据限制为私有或公开开放
+
+**缺点**
+
+ * 尽管客户端代码是公开的,但服务端代码并没有公开,因此你无法自行搭建一个类似的服务。如果你不信任这个网站,请不要使用。
+ * 由于网站不存储你的任何个人信息,包括你的密码,因此如果你丢失了密码,数据将永远无法恢复。网站方还声称他们并不清楚谁拥有了哪些数据,所以一定要牢记密码。
+
+
+如果你想通过一种简单的方式将笔记保存到线上,并且需要在不需要安装任何工具的情况下访问,那么 ProtectedText 会是一个好的选择。如果你还知道其它类似的应用程序,欢迎在评论区留言!
+
+
+
+--------------------------------------------------------------------------------
+
+via: https://www.ostechnix.com/protectedtext-a-free-encrypted-notepad-to-save-your-notes-online/
+
+作者:[SK][a]
+选题:[lujun9972][b]
+译者:[HankChow](https://github.com/HankChow)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.ostechnix.com/author/sk/
+[b]: https://github.com/lujun9972
+[1]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
+[2]: http://www.ostechnix.com/wp-content/uploads/2018/11/Protected-Text-4.png
+[3]: https://www.ostechnix.com/buttercup-a-free-secure-and-cross-platform-password-manager/
+[4]: https://www.ostechnix.com/keeweb-an-open-source-cross-platform-password-manager/
+[5]: http://www.ostechnix.com/wp-content/uploads/2018/11/Protected-Text-5.png
+[6]: https://play.google.com/store/apps/details?id=com.protectedtext.android
+[7]: https://www.protectedtext.com/js/main.js
+
diff --git a/published/20181115 How to install a device driver on Linux.md b/published/20181115 How to install a device driver on Linux.md
new file mode 100644
index 0000000000..bd1c3fd353
--- /dev/null
+++ b/published/20181115 How to install a device driver on Linux.md
@@ -0,0 +1,144 @@
+如何在 Linux 上安装设备驱动程序
+======
+
+> 学习 Linux 设备驱动如何工作,并知道如何使用它们。
+
+
+
+对于一个熟悉 Windows 或者 MacOS 的人,想要切换到 Linux,它们都会面临一个艰巨的问题就是怎么安装和配置设备驱动。这是可以理解的,因为 Windows 和 MacOS 都有一套机制把这个过程做得非常的友好。比如说,当你插入一个新的硬件设备, Windows 能够自动检测并会弹出一个窗口询问你是否要继续驱动程序的安装。你也可以从网络上下载驱动程序,仅仅需要双击解压或者是通过设备管理器导入驱动程序即可。
+
+而这在 Linux 操作系统上并非这么简单。第一个原因是, Linux 是一个开源的操作系统,所以有 [数百种 Linux 发行版的变体][1]。也就是说不可能做一个指南来适应所有的 Linux 发行版。因为每种 Linux 安装驱动程序的过程都有差异。
+
+第二,大多数默认的 Linux 驱动程序也都是开源的,并被集成到了系统中,这使得安装一些并未包含的驱动程序变得非常复杂,即使已经可以检测大多数的硬件设备。第三,不同发行版的许可也有差异。例如,[Fedora 禁止事项][2] 禁止包含专有的、受法律保护,或者是违反美国法律的驱动程序。而 Ubuntu 则让用户[避免使用受法律保护或闭源的硬件设备][3]。
+
+为了更好的学习 Linux 驱动程序是如何工作的,我建议阅读 《Linux 设备驱动程序》一书中的 [设备驱动程序简介][4]。
+
+### 两种方式来寻找驱动程序
+
+#### 1、 用户界面
+
+如果是一个刚从 Windows 或 MacOS 转过来的 Linux 新手,那你会很高兴知道 Linux 也提供了一个通过向导式的程序来查看驱动程序是否可用的方法。 Ubuntu 提供了一个 [附加驱动程序][5] 选项。其它的 Linux 发行版也提供了帮助程序,像 [GNOME 的包管理器][6],你可以使用它来检查驱动程序是否可用。
+
+#### 2、 命令行
+
+如果你通过漂亮的用户界面没有找到驱动程序,那又该怎么办呢?或许你只能通过没有任何图形界面的 shell?甚至你可以使用控制台来展现你的技能。你有两个选择:
+
+1. **通过一个仓库**
+
+ 这和 MacOS 中的 [homebrew][7] 命令行很像。通过使用 `yum`、 `dnf`、`apt-get` 等等。你基本可以通过添加仓库,并更新包缓存。
+2. **下载、编译,然后自己构建**
+
+ 这通常包括直接从网络,或通过 `wget` 命令下载源码包,然后运行配置和编译、安装。这超出了本文的范围,但是你可以在网络上找到很多在线指南,如果你选择的是这条路的话。
+
+### 检查是否已经安装了这个驱动程序
+
+在进一步学习安装 Linux 驱动程序之前,让我们来学习几条命令,用来检测驱动程序是否已经在你的系统上可用。
+
+[lspci][8] 命令显示了系统上所有 PCI 总线和设备驱动程序的详细信息。
+
+```
+$ lscpci
+```
+
+或者使用 `grep`:
+
+```
+$ lscpci | grep SOME_DRIVER_KEYWORD
+```
+
+例如,你可以使用 `lspci | grep SAMSUNG` 命令,如果你想知道是否安装过三星的驱动。
+
+[dmesg][9] 命令显示了所有内核识别的驱动程序。
+
+```
+$ dmesg
+```
+
+或配合 `grep` 使用:
+
+```
+$ dmesg | grep SOME_DRIVER_KEYWORD
+```
+
+任何识别到的驱动程序都会显示在结果中。
+
+如果通过 `dmesg` 或者 `lscpi` 命令没有识别到任何驱动程序,尝试下这两个命令,看看驱动程序至少是否加载到硬盘。
+
+```
+$ /sbin/lsmod
+```
+
+和
+
+```
+$ find /lib/modules
+```
+
+技巧:和 `lspci` 或 `dmesg` 一样,通过在上面的命令后面加上 `| grep` 来过滤结果。
+
+如果一个驱动程序已经被识别到了,但是通过 `lscpi` 或 `dmesg` 并没有找到,这意味着驱动程序已经存在于硬盘上,但是并没有加载到内核中,这种情况,你可以通过 `modprobe` 命令来加载这个模块。
+
+```
+$ sudo modprobe MODULE_NAME
+```
+
+使用 `sudo` 来运行这个命令,因为这个模块要使用 root 权限来安装。
+
+### 添加仓库并安装
+
+可以通过 `yum`、`dnf` 和 `apt-get` 几种不同的方式来添加一个仓库;一个个介绍完它们并不在本文的范围。简单一点来说,这个示例将会使用 `apt-get` ,但是这个命令和其它的几个都是很类似的。
+
+#### 1、删除存在的仓库,如果它存在
+
+```
+$ sudo apt-get purge NAME_OF_DRIVER*
+```
+
+其中 `NAME_OF_DRIVER` 是你的驱动程序的可能的名称。你还可以将模式匹配加到正则表达式中来进一步过滤。
+
+#### 2、将仓库加入到仓库表中,这应该在驱动程序指南中有指定
+
+```
+$ sudo add-apt-repository REPOLIST_OF_DRIVER
+```
+
+其中 `REPOLIST_OF_DRIVER` 应该从驱动文档中有指定(例如:`epel-list`)。
+
+#### 3、更新仓库列表
+
+```
+$ sudo apt-get update
+```
+
+#### 4、安装驱动程序
+
+```
+$ sudo apt-get install NAME_OF_DRIVER
+```
+
+#### 5、检查安装状态
+
+像上面说的一样,通过 `lscpi` 命令来检查驱动程序是否已经安装成功。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/11/how-install-device-driver-linux
+
+作者:[Bryant Son][a]
+选题:[lujun9972][b]
+译者:[Jamskr](https://github.com/Jamskr)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/brson
+[b]: https://github.com/lujun9972
+[1]: https://en.wikipedia.org/wiki/List_of_Linux_distributions
+[2]: https://fedoraproject.org/wiki/Forbidden_items?rd=ForbiddenItems
+[3]: https://www.ubuntu.com/licensing
+[4]: https://www.xml.com/ldd/chapter/book/ch01.html
+[5]: https://askubuntu.com/questions/47506/how-do-i-install-additional-drivers
+[6]: https://help.gnome.org/users/gnome-packagekit/stable/add-remove.html.en
+[7]: https://brew.sh/
+[8]: https://en.wikipedia.org/wiki/Lspci
+[9]: https://en.wikipedia.org/wiki/Dmesg
diff --git a/published/20181119 How To Customize Bash Prompt In Linux.md b/published/20181119 How To Customize Bash Prompt In Linux.md
new file mode 100644
index 0000000000..190fdb914b
--- /dev/null
+++ b/published/20181119 How To Customize Bash Prompt In Linux.md
@@ -0,0 +1,313 @@
+在 Linux 上自定义 bash 命令提示符
+======
+
+
+
+众所周知,**bash**(the **B**ourne-**A**gain **Sh**ell)是目前绝大多数 Linux 发行版使用的默认 shell。本文将会介绍如何通过添加颜色和样式来自定义 bash 命令提示符的显示。尽管很多插件或工具都可以很轻易地满足这一需求,但我们也可以不使用插件和工具,自己手动自定义一些基本的显示方式,例如添加或者修改某些元素、更改前景色、更改背景色等等。
+
+### 在 Linux 中自定义 bash 命令提示符
+
+在 bash 中,我们可以通过更改 `$PS1` 环境变量的值来自定义 bash 命令提示符。
+
+一般情况下,bash 命令提示符会是以下这样的形式:
+
+
+
+在上图这种默认显示形式当中,“sk” 是我的用户名,而 “ubuntuserver” 是我的主机名。
+
+只要插入一些以反斜杠开头的特殊转义字符串,就可以按照你的喜好修改命令提示符了。下面我来举几个例子。
+
+在开始之前,我强烈建议你预先备份 `~/.bashrc` 文件。
+
+```
+$ cp ~/.bashrc ~/.bashrc.bak
+```
+
+#### 更改 bash 命令提示符中的 username@hostname 部分
+
+如上所示,bash 命令提示符一般都带有 “username@hostname” 部分,这个部分是可以修改的。
+
+只需要编辑 `~/.bashrc` 文件:
+
+```
+$ vi ~/.bashrc
+```
+
+在文件的最后添加一行:
+
+```
+PS1="ostechnix> "
+```
+
+将上面的 “ostechnix” 替换为任意一个你想使用的单词,然后按 `ESC` 并输入 `:wq` 保存、退出文件。
+
+执行以下命令使刚才的修改生效:
+
+```
+$ source ~/.bashrc
+```
+
+你就可以看见 bash 命令提示符中出现刚才添加的 “ostechnix” 了。
+
+![][3]
+
+再来看看另一个例子,比如将 “username@hostname” 替换为 “Hello@welcome>”。
+
+同样是像刚才那样修改 `~/.bashrc` 文件。
+
+```
+export PS1="Hello@welcome> "
+```
+
+然后执行 `source ~/.bashrc` 让修改结果立即生效。
+
+以下是我在 Ubuntu 18.04 LTS 上修改后的效果。
+
+
+
+#### 仅显示用户名
+
+如果需要仅显示用户名,只需要在 `~/.bashrc` 文件中加入以下这一行。
+
+```
+export PS1="\u "
+```
+
+这里的 `\u` 就是一个转义字符串。
+
+下面提供了一些可以添加到 `$PS1` 环境变量中的用以改变 bash 命令提示符样式的转义字符串。每次修改之后,都需要执行 `source ~/.bashrc` 命令才能立即生效。
+
+#### 显示用户名和主机名
+
+```
+export PS1="\u\h "
+```
+
+命令提示符会这样显示:
+
+```
+skubuntuserver
+```
+
+#### 显示用户名和完全限定域名
+
+```
+export PS1="\u\H "
+```
+
+#### 在用户名和主机名之间显示其它字符
+
+如果你还需要在用户名和主机名之间显示其它字符(例如 `@`),可以使用以下格式:
+
+```
+export PS1="\u@\h "
+```
+
+命令提示符会这样显示:
+
+```
+sk@ubuntuserver
+```
+
+#### 显示用户名、主机名,并在末尾添加 $ 符号
+
+```
+export PS1="\u@\h\\$ "
+```
+
+#### 综合以上两种显示方式
+
+```
+export PS1="\u@\h> "
+```
+
+命令提示符最终会这样显示:
+
+```
+sk@ubuntuserver>
+```
+
+相似地,还可以添加其它特殊字符,例如冒号、分号、星号、下划线、空格等等。
+
+#### 显示用户名、主机名、shell 名称
+
+```
+export PS1="\u@\h>\s "
+```
+
+#### 显示用户名、主机名、shell 名称以及 shell 版本
+
+```
+export PS1="\u@\h>\s\v "
+```
+
+bash 命令提示符显示样式:
+
+![][4]
+
+#### 显示用户名、主机名、当前目录
+
+```
+export PS1="\u@\h\w "
+```
+
+如果当前目录是 `$HOME` ,会以一个波浪线(`~`)显示。
+
+#### 在 bash 命令提示符中显示日期
+
+除了用户名和主机名,如果还想在 bash 命令提示符中显示日期,可以在 `~/.bashrc` 文件中添加以下内容:
+
+```
+export PS1="\u@\h>\d "
+```
+
+![][5]
+
+#### 在 bash 命令提示符中显示日期及 12 小时制时间
+
+```
+export PS1="\u@\h>\d\@ "
+```
+
+#### 显示日期及 hh:mm:ss 格式时间
+
+```
+export PS1="\u@\h>\d\T "
+```
+
+#### 显示日期及 24 小时制时间
+
+```
+export PS1="\u@\h>\d\A "
+```
+
+#### 显示日期及 24 小时制 hh:mm:ss 格式时间
+
+```
+export PS1="\u@\h>\d\t "
+```
+
+以上是一些常见的可以改变 bash 命令提示符的转义字符串。除此以外的其它转义字符串,可以在 bash 的 man 手册 PROMPTING 章节中查阅。
+
+你也可以随时执行以下命令查看当前的命令提示符样式。
+
+```
+$ echo $PS1
+```
+
+#### 在 bash 命令提示符中去掉 username@hostname 部分
+
+如果我不想做任何调整,直接把 username@hostname 部分整个去掉可以吗?答案是肯定的。
+
+如果你是一个技术方面的博主,你有可能会需要在网站或者博客中上传自己的 Linux 终端截图。或许你的用户名和主机名太拉风、太另类,不想让别人看到,在这种情况下,你就需要隐藏命令提示符中的 “username@hostname” 部分。
+
+如果你不想暴露自己的用户名和主机名,只需要按照以下步骤操作。
+
+编辑 `~/.bashrc` 文件:
+
+```
+$ vi ~/.bashrc
+```
+
+在文件末尾添加这一行:
+
+```
+PS1="\W> "
+```
+
+输入 `:wq` 保存并关闭文件。
+
+执行以下命令让修改立即生效。
+
+```
+$ source ~/.bashrc
+```
+
+现在看一下你的终端,“username@hostname” 部分已经消失了,只保留了一个 `~>` 标记。
+
+![][6]
+
+如果你想要尽可能简单的操作,又不想弄乱你的 `~/.bashrc` 文件,最好的办法就是在系统中创建另一个用户(例如 “user@example”、“admin@demo”)。用带有这样的命令提示符的用户去截图或者录屏,就不需要顾虑自己的用户名或主机名被别人看见了。
+
+**警告:**在某些情况下,这种做法并不推荐。例如像 zsh 这种 shell 会继承当前 shell 的设置,这个时候可能会出现一些意想不到的问题。这个技巧只用于隐藏命令提示符中的 “username@hostname” 部分,仅此而已,如果把这个技巧挪作他用,也可能会出现异常。
+
+### 为 bash 命令提示符着色
+
+目前我们也只是变更了 bash 命令提示符中的内容,下面介绍一下如何对命令提示符进行着色。
+
+通过向 `~/.bashrc` 文件写入一些配置,可以修改 bash 命令提示符的前景色(也就是文本的颜色)和背景色。
+
+例如,下面这一行配置可以令某些文本的颜色变成红色:
+
+```
+export PS1="\u@\[\e[31m\]\h\[\e[m\] "
+```
+
+添加配置后,执行 `source ~/.bashrc` 立即生效。
+
+你的 bash 命令提示符就会变成这样:
+
+![][7]
+
+类似地,可以用这样的配置来改变背景色:
+
+```
+export PS1="\u@\[\e[31;46m\]\h\[\e[m\] "
+```
+
+![][8]
+
+### 添加 emoji
+
+大家都喜欢 emoji。还可以按照以下配置把 emoji 插入到命令提示符中。
+
+```
+PS1="\W 🔥 >"
+```
+
+需要注意的是,emoji 的显示取决于使用的字体,因此某些终端可能会无法正常显示 emoji,取而代之的是一些乱码或者单色表情符号。
+
+### 自定义 bash 命令提示符有点难,有更简单的方法吗?
+
+如果你是一个新手,编辑 `$PS1` 环境变量的过程可能会有些困难,因为命令提示符中的大量转义字符串可能会让你有点晕头转向。但不要担心,有一个在线的 bash `$PS1` 生成器可以帮助你轻松生成各种 `$PS1` 环境变量值。
+
+就是这个[网站][9]:
+
+[][9]
+
+只需要直接选择你想要的 bash 命令提示符样式,添加颜色、设计排序,然后就完成了。你可以预览输出,并将配置代码复制粘贴到 `~/.bashrc` 文件中。就这么简单。顺便一提,本文中大部分的示例都是通过这个网站制作的。
+
+### 我把我的 ~/.bashrc 文件弄乱了,该如何恢复?
+
+正如我在上面提到的,强烈建议在更改 `~/.bashrc` 文件前做好备份(在更改其它重要的配置文件之前也一定要记得备份)。这样一旦出现任何问题,你都可以很方便地恢复到更改之前的配置状态。当然,如果你忘记了备份,还可以按照下面这篇文章中介绍的方法恢复为默认配置。
+
+- [如何将 `~/.bashrc` 文件恢复到默认配置][10]
+
+这篇文章是基于 ubuntu 的,但也适用于其它的 Linux 发行版。不过事先声明,这篇文章的方法会将 `~/.bashrc` 文件恢复到系统最初时的状态,你对这个文件做过的任何修改都将丢失。
+
+感谢阅读!
+
+--------------------------------------------------------------------------------
+
+via: https://www.ostechnix.com/hide-modify-usernamelocalhost-part-terminal/
+
+作者:[SK][a]
+选题:[lujun9972][b]
+译者:[HankChow](https://github.com/HankChow)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.ostechnix.com/author/sk/
+[b]: https://github.com/lujun9972
+[1]: https://www.ostechnix.com/cdn-cgi/l/email-protection
+[2]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
+[3]: http://www.ostechnix.com/wp-content/uploads/2017/10/Linux-Terminal-2.png
+[4]: http://www.ostechnix.com/wp-content/uploads/2017/10/bash-prompt-2.png
+[5]: http://www.ostechnix.com/wp-content/uploads/2017/10/bash-prompt-3.png
+[6]: http://www.ostechnix.com/wp-content/uploads/2017/10/Linux-Terminal-1.png
+[7]: http://www.ostechnix.com/hide-modify-usernamelocalhost-part-terminal/bash-prompt-4/
+[8]: http://www.ostechnix.com/hide-modify-usernamelocalhost-part-terminal/bash-prompt-5/
+[9]: http://ezprompt.net/
+[10]: https://www.ostechnix.com/restore-bashrc-file-default-settings-ubuntu/
+
diff --git a/published/20181120 How To Change GDM Login Screen Background In Ubuntu.md b/published/20181120 How To Change GDM Login Screen Background In Ubuntu.md
new file mode 100644
index 0000000000..9fbf743381
--- /dev/null
+++ b/published/20181120 How To Change GDM Login Screen Background In Ubuntu.md
@@ -0,0 +1,86 @@
+如何更换 Ubuntu 系统的 GDM 登录界面背景
+======
+
+
+
+Ubuntu 18.04 LTS 桌面系统在登录、锁屏和解锁状态下,我们会看到一个纯紫色的背景。它是 GDM(GNOME 显示管理器GNOME Display Manager)从 ubuntu 17.04 版本开始使用的默认背景。有一些人可能会不喜欢这个纯色的背景,想换一个酷一点、更吸睛的!如果是这样,你找对地方了。这篇短文将会告诉你如何更换 Ubuntu 18.04 LTS 的 GDM 登录界面的背景。
+
+### 更换 Ubuntu 的登录界面背景
+
+这是 Ubuntu 18.04 LTS 桌面系统默认的登录界面。
+
+
+
+不管你喜欢与否,你总是会不经意在登录、解屏/锁屏的时面对它。别担心!你可以随便更换一个你喜欢的图片。
+
+在 Ubuntu 上更换桌面壁纸和用户的资料图像不难。我们可以点击鼠标就搞定了。但更换解屏/锁屏的背景则需要修改文件 `ubuntu.css`,它位于 `/usr/share/gnome-shell/theme`。
+
+修改这个文件之前,最好备份一下它。这样我们可以避免出现问题时可以恢复它。
+
+```
+$ sudo cp /usr/share/gnome-shell/theme/ubuntu.css /usr/share/gnome-shell/theme/ubuntu.css.bak
+```
+
+修改文件 `ubuntu.css`:
+
+```
+$ sudo nano /usr/share/gnome-shell/theme/ubuntu.css
+```
+
+在文件中找到关键字 `lockDialogGroup`,如下行:
+
+```
+#lockDialogGroup {
+ background: #2c001e url(resource:///org/gnome/shell/theme/noise-texture.png);
+ background-repeat: repeat;
+}
+```
+
+
+
+可以看到,GDM 默认登录的背景图片是 `noise-texture.png`。
+
+现在修改为你自己的图片路径。也可以选择 .jpg 或 .png 格式的文件,两种格式的图片文件都是支持的。修改完成后的文件内容如下:
+
+```
+#lockDialogGroup {
+ background: #2c001e url(file:///home/sk/image.png);
+ background-repeat: no-repeat;
+ background-size: cover;
+ background-position: center;
+}
+```
+
+请注意 `ubuntu.css` 文件里这个关键字的修改,我把修改点加粗了。
+
+你可能注意到,我把原来的 `... url(resource:///org/gnome/shell/theme/noise-texture.png);` 修改为 `... url(file:///home/sk/image.png);`。也就是说,你可以把 `... url(resource ...` 修改为 `.. url(file ...`。
+
+同时,你可以把参数 `background-repeat:` 的值 `repeat` 修改为 `no-repeat`,并增加另外两行。你可以直接复制上面几行的修改到你的 `ubuntu.css` 文件,对应的修改为你的图片路径。
+
+修改完成后,保存和关闭此文件。然后系统重启生效。
+
+下面是 GDM 登录界面的最新背景图片:
+
+
+
+是不是很酷,你都看到了,更换 GDM 登录的默认背景很简单。你只需要修改 `ubuntu.css` 文件中图片的路径然后重启系统。是不是很简单也很有意思.
+
+你可以修改 `/usr/share/gnome-shell/theme` 目录下的文件 `gdm3.css` ,具体修改内容和修改结果和上面一样。同时记得修改前备份要修改的文件。
+
+就这些了。如果有好的东东再分享了,请大家关注!
+
+后会有期。
+
+--------------------------------------------------------------------------------
+
+via: https://www.ostechnix.com/how-to-change-gdm-login-screen-background-in-ubuntu/
+
+作者:[SK][a]
+选题:[lujun9972][b]
+译者:[Guevaraya](https://github.com/guevaraya)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.ostechnix.com/author/sk/
+[b]: https://github.com/lujun9972
diff --git a/published/20181126 How to use multiple programming languages without losing your mind.md b/published/20181126 How to use multiple programming languages without losing your mind.md
new file mode 100644
index 0000000000..bbb310fa4e
--- /dev/null
+++ b/published/20181126 How to use multiple programming languages without losing your mind.md
@@ -0,0 +1,71 @@
+[#]: collector: (lujun9972)
+[#]: translator: (heguangzhi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: subject: (How to use multiple programming languages without losing your mind)
+[#]: via: (https://opensource.com/article/18/11/multiple-programming-languages)
+[#]: author: (Bart Copeland https://opensource.com/users/bartcopeland)
+[#]: url: (https://linux.cn/article-10291-1.html)
+
+如何使用多种编程语言而又不失理智
+======
+
+> 多语言编程环境是一把双刃剑,既带来好处,也带来可能威胁组织的复杂性。
+
+
+
+如今,随着各种不同的编程语言的出现,许多组织已经变成了数字多语种组织digital polyglots。开源打开了一个语言和技术堆栈的世界,开发人员可以使用这些语言和技术堆栈来完成他们的任务,包括开发、支持过时的和现代的软件应用。
+
+与那些只说母语的人相比,通晓多种语言的人可以与数百万人交谈。在软件环境中,开发人员不会引入新的语言来达到特定的目的,也不会更好地交流。一些语言对于一项任务来说很棒,但是对于另一项任务来说却不行,因此使用多种编程语言可以让开发人员使用合适的工具来完成这项任务。这样,所有的开发都是多语种的;这只是野兽的本性。
+
+多语种环境的创建通常是渐进的和情景化的。例如,当一家企业收购一家公司时,它就承担了该公司的技术堆栈 —— 包括其编程语言。或者,随着技术领导的改变,新的领导者可能会将不同的技术纳入其中。技术也有过时的时候,随着时间的推移,增加了组织必须维护的编程语言和技术的数量。
+
+多语言环境对企业来说是一把双刃剑,既带来好处,也带来复杂性和挑战。最终,如果这种情况得不到控制,多语言将会扼杀你的企业。
+
+### 棘手的技术绕口令
+
+如果有多种不同的技术 —— 编程语言、过时的工具和新兴的技术堆栈 —— 就有复杂性。工程师团队花更多的时间努力改进编程语言,包括许可证、安全性和依赖性。与此同时,管理层缺乏对代码合规性的监督,无法衡量风险。
+
+发生的情况是,企业具有不同程度的编程语言质量和工具支持的高度可变性。当你需要和十几个人一起工作时,很难成为一种语言的专家。一个能流利地说法语和意大利语的人和一个能用八种语言串成几个句子的人在技能水平上有很大差异。开发人员和编程语言也是如此。
+
+随着更多编程语言的加入,困难只会增加,导致数字巴别塔的出现。
+
+答案是不要拿走开发人员工作所需的工具。添加新的编程语言可以建立他们的技能基础,并为他们提供合适的设备来完成他们的工作。所以,你想对你的开发者说“是”,但是随着越来越多的编程语言被添加到企业中,它们会拖累你的软件开发生命周期(SDLC)。在规模上,所有这些语言和工具都可能扼杀企业。
+
+企业应注意三个主要问题:
+
+1. **可见性:** 团队聚在一起执行项目,然后解散。应用程序已经发布,但从未更新 —— 为什么要修复那些没有被破坏的东西?因此,当发现一个关键漏洞时,企业可能无法了解哪些应用程序受到影响,这些应用程序包含哪些库,甚至无法了解它们是用什么语言构建的。这可能导致成本高昂的“勘探项目”,以确保漏洞得到适当解决。
+
+2. **更新或编码:** 一些企业将更新和修复功能集中在一个团队中。其他人要求每个“比萨团队”管理自己的开发工具。无论是哪种情况,工程团队和管理层都要付出机会成本:这些团队没有编码新特性,而是不断更新和修复开源工具中的库,因为它们移动得如此之快。
+
+3. **重新发明轮子:** 由于代码依赖性和库版本不断更新,当发现漏洞时,与应用程序原始版本相关联的工件可能不再可用。因此,许多开发周期都被浪费在试图重新创建一个可以修复漏洞的环境上。
+
+将你组织中的每种编程语言乘以这三个问题,开始时被认为是分子一样小的东西突然看起来像珠穆朗玛峰。就像登山者一样,没有合适的设备和工具,你将无法生存。
+
+### 找到你的罗塞塔石碑
+
+一个全面的解决方案可以满足 SDLC 中企业及其个人利益相关者的需求。企业可以使用以下最佳实践创建解决方案:
+
+ 1. 监控生产中运行的代码,并根据应用程序中使用的标记组件(例如,常见漏洞和暴露组件)的风险做出响应。
+ 2. 定期接收更新以保持代码的最新和无错误。
+ 3. 使用商业开源支持来获得编程语言版本和平台的帮助,这些版本和平台已经接近尾声,并且不受社区支持。
+ 4. 标准化整个企业中的特定编程语言构建,以实现跨团队的一致环境,并最大限度地减少依赖性。
+ 5. 根据相关性设置何时触发更新、警报或其他类型事件的阈值。
+ 6. 为您的包管理创建一个单一的可信来源;这可能需要知识渊博的技术提供商的帮助。
+ 7. 根据您的特定标准,只使用您需要的软件包获得较小的构建版本。
+
+使用这些最佳实践,开发人员可以最大限度地利用他们的时间为企业创造更多价值,而不是执行基本的工具或构建工程任务。这将在软件开发生命周期(SDLC)的所有环境中创建代码一致性。由于维护编程语言和软件包分发所需的资源更少,这也将提高效率和节约成本。这种新的操作方式将使技术人员和管理人员的生活更加轻松。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/11/multiple-programming-languages
+
+作者:[Bart Copeland][a]
+选题:[lujun9972][b]
+译者:[heguangzhi](https://github.com/heguangzhi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/bartcopeland
+[b]: https://github.com/lujun9972
diff --git a/scripts/check.sh b/scripts/check.sh
index ba5707fbf6..59fcfa31f8 100644
--- a/scripts/check.sh
+++ b/scripts/check.sh
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/bin/sh
# PR 检查脚本
set -e
diff --git a/scripts/check/analyze.sh b/scripts/check/analyze.sh
index 9aa47d5664..880bf1b488 100644
--- a/scripts/check/analyze.sh
+++ b/scripts/check/analyze.sh
@@ -22,7 +22,12 @@ do_analyze() {
# 统计每个类别的每个操作
REGEX="$(get_operation_regex "$STAT" "$TYPE")"
OTHER_REGEX="${OTHER_REGEX}|${REGEX}"
- eval "${TYPE}_${STAT}=\"\$(grep -Ec '$REGEX' /tmp/changes)\"" || true
+ CHANGES_FILE="/tmp/changes_${TYPE}_${STAT}"
+ eval "grep -E '$REGEX' /tmp/changes" \
+ | sed 's/^[^\/]*\///g' \
+ | sort > "$CHANGES_FILE" || true
+ sed 's/^.*\///g' "$CHANGES_FILE" > "${CHANGES_FILE}_basename"
+ eval "${TYPE}_${STAT}=$(wc -l < "$CHANGES_FILE")"
eval echo "${TYPE}_${STAT}=\$${TYPE}_${STAT}"
done
done
diff --git a/scripts/check/check.sh b/scripts/check/check.sh
index a527c225ab..42713e1db0 100644
--- a/scripts/check/check.sh
+++ b/scripts/check/check.sh
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/bin/sh
# 检查脚本状态
set -e
diff --git a/scripts/check/collect.sh b/scripts/check/collect.sh
index dc6293e280..3f8e0f0388 100644
--- a/scripts/check/collect.sh
+++ b/scripts/check/collect.sh
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/bin/sh
# PR 文件变更收集
set -e
@@ -31,7 +31,16 @@ git --no-pager show --summary "${MERGE_BASE}..HEAD"
echo "[收集] 写出文件变更列表……"
-git diff "$MERGE_BASE" HEAD --no-renames --name-status > /tmp/changes
+RAW_CHANGES="$(git diff "$MERGE_BASE" HEAD --no-renames --name-status -z \
+ | tr '\0' '\n')"
+[ -z "$RAW_CHANGES" ] && {
+ echo "[收集] 无变更,退出……"
+ exit 1
+}
+echo "$RAW_CHANGES" | while read -r STAT; do
+ read -r NAME
+ echo "${STAT} ${NAME}"
+done > /tmp/changes
echo "[收集] 已写出文件变更列表:"
cat /tmp/changes
{ [ -z "$(cat /tmp/changes)" ] && echo "(无变更)"; } || true
diff --git a/scripts/check/common.inc.sh b/scripts/check/common.inc.sh
index 6012bc2fe5..2bc0334930 100644
--- a/scripts/check/common.inc.sh
+++ b/scripts/check/common.inc.sh
@@ -10,9 +10,10 @@ export TSL_DIR='translated' # 已翻译
export PUB_DIR='published' # 已发布
# 定义匹配规则
-export CATE_PATTERN='(news|talk|tech)' # 类别
+export CATE_PATTERN='(talk|tech)' # 类别
export FILE_PATTERN='[0-9]{8} [a-zA-Z0-9_.,() -]*\.md' # 文件名
+# 获取用于匹配操作的正则表达式
# 用法:get_operation_regex 状态 类型
#
# 状态为:
@@ -26,5 +27,50 @@ export FILE_PATTERN='[0-9]{8} [a-zA-Z0-9_.,() -]*\.md' # 文件名
get_operation_regex() {
STAT="$1"
TYPE="$2"
+
echo "^${STAT}\\s+\"?$(eval echo "\$${TYPE}_DIR")/"
}
+
+# 确保两个变更文件一致
+# 用法:ensure_identical X类型 X状态 Y类型 Y状态 是否仅比较文件名
+#
+# 状态为:
+# - A:添加
+# - M:修改
+# - D:删除
+# 类型为:
+# - SRC:未翻译
+# - TSL:已翻译
+# - PUB:已发布
+ensure_identical() {
+ TYPE_X="$1"
+ STAT_X="$2"
+ TYPE_Y="$3"
+ STAT_Y="$4"
+ NAME_ONLY="$5"
+ SUFFIX=
+ [ -n "$NAME_ONLY" ] && SUFFIX="_basename"
+
+ X_FILE="/tmp/changes_${TYPE_X}_${STAT_X}${SUFFIX}"
+ Y_FILE="/tmp/changes_${TYPE_Y}_${STAT_Y}${SUFFIX}"
+
+ cmp "$X_FILE" "$Y_FILE" 2> /dev/null
+}
+
+# 检查文章分类
+# 用法:check_category 类型 状态
+#
+# 状态为:
+# - A:添加
+# - M:修改
+# - D:删除
+# 类型为:
+# - SRC:未翻译
+# - TSL:已翻译
+check_category() {
+ TYPE="$1"
+ STAT="$2"
+
+ CHANGES="/tmp/changes_${TYPE}_${STAT}"
+ ! grep -Eqv "^${CATE_PATTERN}/" "$CHANGES"
+}
diff --git a/scripts/check/identify.sh b/scripts/check/identify.sh
index f8e4c44160..51a501517f 100644
--- a/scripts/check/identify.sh
+++ b/scripts/check/identify.sh
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/bin/sh
# 匹配 PR 规则
set -e
@@ -27,31 +27,39 @@ rule_bypass_check() {
# 添加原文:添加至少一篇原文
rule_source_added() {
[ "$SRC_A" -ge 1 ] \
+ && check_category SRC A \
&& [ "$TOTAL" -eq "$SRC_A" ] && echo "匹配规则:添加原文 ${SRC_A} 篇"
}
# 申领翻译:只能申领一篇原文
rule_translation_requested() {
[ "$SRC_M" -eq 1 ] \
+ && check_category SRC M \
&& [ "$TOTAL" -eq 1 ] && echo "匹配规则:申领翻译"
}
# 提交译文:只能提交一篇译文
rule_translation_completed() {
[ "$SRC_D" -eq 1 ] && [ "$TSL_A" -eq 1 ] \
+ && ensure_identical SRC D TSL A \
+ && check_category SRC D \
+ && check_category TSL A \
&& [ "$TOTAL" -eq 2 ] && echo "匹配规则:提交译文"
}
# 校对译文:只能校对一篇
rule_translation_revised() {
[ "$TSL_M" -eq 1 ] \
+ && check_category TSL M \
&& [ "$TOTAL" -eq 1 ] && echo "匹配规则:校对译文"
}
# 发布译文:发布多篇译文
rule_translation_published() {
[ "$TSL_D" -ge 1 ] && [ "$PUB_A" -ge 1 ] && [ "$TSL_D" -eq "$PUB_A" ] \
- && [ "$TOTAL" -eq $(($TSL_D + $PUB_A)) ] \
+ && ensure_identical SRC D TSL A 1 \
+ && check_category TSL D \
+ && [ "$TOTAL" -eq $((TSL_D + PUB_A)) ] \
&& echo "匹配规则:发布译文 ${PUB_A} 篇"
}
diff --git a/scripts/status.sh b/scripts/status.sh
new file mode 100755
index 0000000000..5ca3e8684c
--- /dev/null
+++ b/scripts/status.sh
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+# 重新生成status data
+set -o errexit
+
+SCRIPTS_DIR=$(cd $(dirname "$0") && pwd)
+BUILD_DIR=$(cd $SCRIPTS_DIR/.. && pwd)/build
+mkdir -p ${BUILD_DIR}/status
+${SCRIPTS_DIR}/status/status.sh > ${BUILD_DIR}/status/status.json
diff --git a/scripts/status/status.sh b/scripts/status/status.sh
new file mode 100755
index 0000000000..9705c3cbc0
--- /dev/null
+++ b/scripts/status/status.sh
@@ -0,0 +1,32 @@
+#!/usr/bin/env bash
+set -e
+cd "$(dirname "$0")/../.." # 进入TP root
+
+function file-translating-p ()
+{
+ local file="$*"
+ if head -n 1 "${file}" |grep '\[^#\]:'>/dev/null 2>&1 ;then
+ # 新模板
+ head -n 12 "$file" |grep -v '\[^#\]:' |grep -E -i "translat|fanyi|翻译" >/dev/null 2>&1
+ else
+ # 旧模板
+ head -n 3 "$file" |grep -E -i "translat|fanyi|翻译" >/dev/null 2>&1
+ fi
+}
+function get_status_of()
+{
+ local file="$*"
+ git log --date=short --pretty=format:"{\"file\":\"${file}\",\"time\":\"%ad\",\"user\":\"%an\"}" -n 1 "${file}"
+}
+
+while read -r file;do
+ if file-translating-p "${file}";then
+ translating="${translating} $(get_status_of "${file}")"
+ else
+ unselected="${unselected} $(get_status_of "${file}")"
+ fi
+done< <(find sources -name "2*.md")
+(
+echo "${translating}"|jq -s "."
+echo "${unselected}"|jq -s "."
+)|jq -s '{"translating":.[0],"unselected":.[1]}'
diff --git a/sources/tech/20170908 Betting on the Web.md b/sources/talk/20170908 Betting on the Web.md
similarity index 100%
rename from sources/tech/20170908 Betting on the Web.md
rename to sources/talk/20170908 Betting on the Web.md
diff --git a/sources/tech/20170911 What every software engineer should know about search.md b/sources/talk/20170911 What every software engineer should know about search.md
similarity index 100%
rename from sources/tech/20170911 What every software engineer should know about search.md
rename to sources/talk/20170911 What every software engineer should know about search.md
diff --git a/sources/tech/20170928 The Lineage of Man.md b/sources/talk/20170928 The Lineage of Man.md
similarity index 100%
rename from sources/tech/20170928 The Lineage of Man.md
rename to sources/talk/20170928 The Lineage of Man.md
diff --git a/sources/talk/20171007 The Most Important Database You-ve Never Heard of.md b/sources/talk/20171007 The Most Important Database You-ve Never Heard of.md
index f429aba373..cebfa1a959 100644
--- a/sources/talk/20171007 The Most Important Database You-ve Never Heard of.md
+++ b/sources/talk/20171007 The Most Important Database You-ve Never Heard of.md
@@ -1,3 +1,5 @@
+zs19940317翻译中
+
The Most Important Database You've Never Heard of
======
In 1962, JFK challenged Americans to send a man to the moon by the end of the decade, inspiring a heroic engineering effort that culminated in Neil Armstrong’s first steps on the lunar surface. Many of the fruits of this engineering effort were highly visible and sexy—there were new spacecraft, new spacesuits, and moon buggies. But the Apollo Program was so staggeringly complex that new technologies had to be invented even to do the mundane things. One of these technologies was IBM’s Information Management System (IMS).
diff --git a/sources/tech/20171030 Why I love technical debt.md b/sources/talk/20171030 Why I love technical debt.md
similarity index 100%
rename from sources/tech/20171030 Why I love technical debt.md
rename to sources/talk/20171030 Why I love technical debt.md
diff --git a/sources/tech/20171107 How to Monetize an Open Source Project.md b/sources/talk/20171107 How to Monetize an Open Source Project.md
similarity index 100%
rename from sources/tech/20171107 How to Monetize an Open Source Project.md
rename to sources/talk/20171107 How to Monetize an Open Source Project.md
diff --git a/sources/tech/20171114 Why pair writing helps improve documentation.md b/sources/talk/20171114 Why pair writing helps improve documentation.md
similarity index 100%
rename from sources/tech/20171114 Why pair writing helps improve documentation.md
rename to sources/talk/20171114 Why pair writing helps improve documentation.md
diff --git a/sources/tech/20171115 Why and How to Set an Open Source Strategy.md b/sources/talk/20171115 Why and How to Set an Open Source Strategy.md
similarity index 100%
rename from sources/tech/20171115 Why and How to Set an Open Source Strategy.md
rename to sources/talk/20171115 Why and How to Set an Open Source Strategy.md
diff --git a/sources/tech/20171116 Why is collaboration so difficult.md b/sources/talk/20171116 Why is collaboration so difficult.md
similarity index 100%
rename from sources/tech/20171116 Why is collaboration so difficult.md
rename to sources/talk/20171116 Why is collaboration so difficult.md
diff --git a/sources/tech/20171128 The politics of the Linux desktop.md b/sources/talk/20171128 The politics of the Linux desktop.md
similarity index 100%
rename from sources/tech/20171128 The politics of the Linux desktop.md
rename to sources/talk/20171128 The politics of the Linux desktop.md
diff --git a/sources/tech/20171129 Inside AGL Familiar Open Source Components Ease Learning Curve.md b/sources/talk/20171129 Inside AGL Familiar Open Source Components Ease Learning Curve.md
similarity index 100%
rename from sources/tech/20171129 Inside AGL Familiar Open Source Components Ease Learning Curve.md
rename to sources/talk/20171129 Inside AGL Familiar Open Source Components Ease Learning Curve.md
diff --git a/sources/tech/20171221 Changing how we use Slack solved our transparency and silo problems.md b/sources/talk/20171221 Changing how we use Slack solved our transparency and silo problems.md
similarity index 100%
rename from sources/tech/20171221 Changing how we use Slack solved our transparency and silo problems.md
rename to sources/talk/20171221 Changing how we use Slack solved our transparency and silo problems.md
diff --git a/sources/tech/20171222 10 keys to quick game development.md b/sources/talk/20171222 10 keys to quick game development.md
similarity index 99%
rename from sources/tech/20171222 10 keys to quick game development.md
rename to sources/talk/20171222 10 keys to quick game development.md
index 4fe6f514a5..02f4388044 100644
--- a/sources/tech/20171222 10 keys to quick game development.md
+++ b/sources/talk/20171222 10 keys to quick game development.md
@@ -1,6 +1,3 @@
-**translating by [ivo-wang](https://github.com/ivo-wang)**
-
-
10 keys to quick game development
======

diff --git a/sources/tech/20171222 18 Cyber-Security Trends Organizations Need to Brace for in 2018.md b/sources/talk/20171222 18 Cyber-Security Trends Organizations Need to Brace for in 2018.md
similarity index 100%
rename from sources/tech/20171222 18 Cyber-Security Trends Organizations Need to Brace for in 2018.md
rename to sources/talk/20171222 18 Cyber-Security Trends Organizations Need to Brace for in 2018.md
diff --git a/sources/tech/20180104 How Creative Commons benefits artists and big business.md b/sources/talk/20180104 How Creative Commons benefits artists and big business.md
similarity index 99%
rename from sources/tech/20180104 How Creative Commons benefits artists and big business.md
rename to sources/talk/20180104 How Creative Commons benefits artists and big business.md
index cbcc346c28..b3bba7686e 100644
--- a/sources/tech/20180104 How Creative Commons benefits artists and big business.md
+++ b/sources/talk/20180104 How Creative Commons benefits artists and big business.md
@@ -1,3 +1,5 @@
+translating by valonia
+
How Creative Commons benefits artists and big business
======

diff --git a/sources/tech/20180104 How allowing myself to be vulnerable made me a better leader.md b/sources/talk/20180104 How allowing myself to be vulnerable made me a better leader.md
similarity index 100%
rename from sources/tech/20180104 How allowing myself to be vulnerable made me a better leader.md
rename to sources/talk/20180104 How allowing myself to be vulnerable made me a better leader.md
diff --git a/sources/tech/20180111 The open organization and inner sourcing movements can share knowledge.md b/sources/talk/20180111 The open organization and inner sourcing movements can share knowledge.md
similarity index 100%
rename from sources/tech/20180111 The open organization and inner sourcing movements can share knowledge.md
rename to sources/talk/20180111 The open organization and inner sourcing movements can share knowledge.md
diff --git a/sources/tech/20180112 in which the cost of structured data is reduced.md b/sources/talk/20180112 in which the cost of structured data is reduced.md
similarity index 100%
rename from sources/tech/20180112 in which the cost of structured data is reduced.md
rename to sources/talk/20180112 in which the cost of structured data is reduced.md
diff --git a/sources/talk/20180117 How technology changes the rules for doing agile.md b/sources/talk/20180117 How technology changes the rules for doing agile.md
index c212d5cf87..1b67935509 100644
--- a/sources/talk/20180117 How technology changes the rules for doing agile.md
+++ b/sources/talk/20180117 How technology changes the rules for doing agile.md
@@ -1,4 +1,3 @@
-Translating by ranchong
How technology changes the rules for doing agile
======
diff --git a/sources/talk/20180127 Write Dumb Code.md b/sources/talk/20180127 Write Dumb Code.md
deleted file mode 100644
index acc647b0e5..0000000000
--- a/sources/talk/20180127 Write Dumb Code.md
+++ /dev/null
@@ -1,54 +0,0 @@
-Write Dumb Code
-======
-The best way you can contribute to an open source project is to remove lines of code from it. We should endeavor to write code that a novice programmer can easily understand without explanation or that a maintainer can understand without significant time investment.
-
-As students we attempt increasingly challenging problems with increasingly sophisticated technologies. We first learn loops, then functions, then classes, etc.. We are praised as we ascend this hierarchy, writing longer programs with more advanced technology. We learn that experienced programmers use monads while new programmers use for loops.
-
-Then we graduate and find a job or open source project to work on with others. We search for something that we can add, and implement a solution pridefully, using the all the tricks that we learned in school.
-
-Ah ha! I can extend this project to do X! And I can use inheritance here! Excellent!
-
-We implement this feature and feel accomplished, and with good reason. Programming in real systems is no small accomplishment. This was certainly my experience. I was excited to write code and proud that I could show off all of the things that I knew how to do to the world. As evidence of my historical love of programming technology, here is a [linear algebra language][1] built with a another meta-programming language. Notice that no one has touched this code in several years.
-
-However after maintaining code a bit more I now think somewhat differently.
-
- 1. We should not seek to build software. Software is the currency that we pay to solve problems, which is our actual goal. We should endeavor to build as little software as possible to solve our problems.
- 2. We should use technologies that are as simple as possible, so that as many people as possible can use and extend them without needing to understand our advanced techniques. We should use advanced techniques only when we are not smart enough to figure out how to use more common techniques.
-
-
-
-Neither of these points are novel. Most people I meet agree with them to some extent, but somehow we forget them when we go to contribute to a new project. The instinct to contribute by building and to demonstrate sophistication often take over.
-
-### Software is a cost
-
-Every line that you write costs people time. It costs you time to write it of course, but you are willing to make this personal sacrifice. However this code also costs the reviewers their time to understand it. It costs future maintainers and developers their time as they fix and modify your code. They could be spending this time outside in the sunshine or with their family.
-
-So when you add code to a project you should feel meek. It should feel as though you are eating with your family and there isn't enough food on the table. You should take only what you need and no more. The people with you will respect you for your efforts to restrict yourself. Solving problems with less code is a hard, but it is a burden that you take on yourself to lighten the burdens of others.
-
-### Complex technologies are harder to maintain
-
-As students, we demonstrate merit by using increasingly advanced technologies. Our measure of worth depends on our ability to use functions, then classes, then higher order functions, then monads, etc. in public projects. We show off our solutions to our peers and feel pride or shame according to our sophistication.
-
-However when working with a team to solve problems in the world the situation is reversed. Now we strive to solve problems with code that is as simple as possible. When we solve a problem simply we enable junior programmers to extend our solution to solve other problems. Simple code enables others and boosts our impact. We demonstrate our value by solving hard problems with only basic techniques.
-
-Look! I replaced this recursive function with a for loop and it still does everything that we need it to. I know it's not as clever, but I noticed that the interns were having trouble with it and I thought that this change might help.
-
-If you are a good programmer then you don't need to demonstrate that you know cool tricks. Instead, you can demonstrate your value by solving a problem in a simple way that enables everyone on your team to contribute in the future.
-
-### But moderation, of course
-
-That being said, over-adherence to the "build things with simple tools" dogma can be counter productive. Often a recursive solution can be much simpler than a for-loop solution and often times using a Class or a Monad is the right approach. But we should be mindful when using these technologies that we are building for ourselves our own system; a system with which others have had no experience.
-
-
---------------------------------------------------------------------------------
-
-via: http://matthewrocklin.com/blog/work/2018/01/27/write-dumb-code
-
-作者:[Matthew Rocklin][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:http://matthewrocklin.com
-[1]:https://github.com/mrocklin/matrix-algebra
diff --git a/sources/tech/20180128 Getting Linux Jobs.md b/sources/talk/20180128 Getting Linux Jobs.md
similarity index 100%
rename from sources/tech/20180128 Getting Linux Jobs.md
rename to sources/talk/20180128 Getting Linux Jobs.md
diff --git a/sources/tech/20180131 How to write a really great resume that actually gets you hired.md b/sources/talk/20180131 How to write a really great resume that actually gets you hired.md
similarity index 100%
rename from sources/tech/20180131 How to write a really great resume that actually gets you hired.md
rename to sources/talk/20180131 How to write a really great resume that actually gets you hired.md
diff --git a/sources/talk/20180208 Gathering project requirements using the Open Decision Framework.md b/sources/talk/20180208 Gathering project requirements using the Open Decision Framework.md
index 5744062efa..9c41f0c78b 100644
--- a/sources/talk/20180208 Gathering project requirements using the Open Decision Framework.md
+++ b/sources/talk/20180208 Gathering project requirements using the Open Decision Framework.md
@@ -1,3 +1,5 @@
+translating---geekpi
+
Gathering project requirements using the Open Decision Framework
======
diff --git a/sources/tech/20180209 A review of Virtual Labs virtualization solutions for MOOCs - WebLog Pro Olivier Berger.md b/sources/talk/20180209 A review of Virtual Labs virtualization solutions for MOOCs - WebLog Pro Olivier Berger.md
similarity index 100%
rename from sources/tech/20180209 A review of Virtual Labs virtualization solutions for MOOCs - WebLog Pro Olivier Berger.md
rename to sources/talk/20180209 A review of Virtual Labs virtualization solutions for MOOCs - WebLog Pro Olivier Berger.md
diff --git a/sources/tech/20180216 Q4OS Makes Linux Easy for Everyone.md b/sources/talk/20180216 Q4OS Makes Linux Easy for Everyone.md
similarity index 100%
rename from sources/tech/20180216 Q4OS Makes Linux Easy for Everyone.md
rename to sources/talk/20180216 Q4OS Makes Linux Easy for Everyone.md
diff --git a/sources/tech/20180223 Plasma Mobile Could Give Life to a Mobile Linux Experience.md b/sources/talk/20180223 Plasma Mobile Could Give Life to a Mobile Linux Experience.md
similarity index 100%
rename from sources/tech/20180223 Plasma Mobile Could Give Life to a Mobile Linux Experience.md
rename to sources/talk/20180223 Plasma Mobile Could Give Life to a Mobile Linux Experience.md
diff --git a/sources/talk/20180227 Emacs -1- Ditching a bunch of stuff and moving to Emacs and org-mode.md b/sources/talk/20180227 Emacs -1- Ditching a bunch of stuff and moving to Emacs and org-mode.md
index 501ba538b6..4227a0db28 100644
--- a/sources/talk/20180227 Emacs -1- Ditching a bunch of stuff and moving to Emacs and org-mode.md
+++ b/sources/talk/20180227 Emacs -1- Ditching a bunch of stuff and moving to Emacs and org-mode.md
@@ -1,3 +1,5 @@
+[#]: translator: (oneforalone)
+
Emacs #1: Ditching a bunch of stuff and moving to Emacs and org-mode
======
I’ll admit it. After over a decade of vim, I’m hooked on [Emacs][1].
diff --git a/sources/talk/20180320 Easily Fund Open Source Projects With These Platforms.md b/sources/talk/20180320 Easily Fund Open Source Projects With These Platforms.md
new file mode 100644
index 0000000000..8c02ca228b
--- /dev/null
+++ b/sources/talk/20180320 Easily Fund Open Source Projects With These Platforms.md
@@ -0,0 +1,96 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: subject: (Easily Fund Open Source Projects With These Platforms)
+[#]: via: (https://itsfoss.com/open-source-funding-platforms/)
+[#]: author: ([Ambarish Kumar](https://itsfoss.com/author/ambarish/))
+[#]: url: ( )
+
+Easily Fund Open Source Projects With These Platforms
+======
+
+**Brief: We list out some funding platforms you can use to financially support open source projects. **
+
+Financial support is one of the many ways to [help Linux and Open Source community][1]. This is why you see “Donate” option on the websites of most open source projects.
+
+While the big corporations have the necessary funding and resources, most open source projects are developed by individuals in their spare time. However, it does require one’s efforts, time and probably includes some overhead costs too. Monetary supports surely help drive the project development.
+
+If you would like to support open source projects financially, let me show you some platforms dedicated to open source and/or Linux.
+
+### Funding platforms for Open Source projects
+
+![Open Source funding platforms][2]
+
+Just to clarify, we are not associated with any of the funding platforms mentioned here.
+
+#### 1\. Liberapay
+
+[Gratipay][3] was probably the biggest platform for funding open source projects and people associated with the project, which got shut down at the end of the year 2017. However, there’s a fork – Liberapay that works as a recurrent donation platform for the open source projects and the contributors.
+
+[Liberapay][4] is a non-profit, open source organization that helps in a periodic donation to a project. You can create an account as a contributor and ask the people who would really like to help (usually the consumer of your products) to donate.
+
+To receive a donation, you will have to create an account on Liberapay, brief what you do and about your project, reasons for asking for the donation and what will be done with the money you receive.
+
+For someone who would like to donate, they would have to add money to their accounts and set up a period for payment that can be weekly, monthly or yearly to someone. There’s a mail triggered when there is not much left to donate.
+
+The currency supported are dollars and Euro as of now and you can always put up a badge on Github, your Twitter profile or website for a donation.
+
+#### 2\. Bountysource
+
+[Bountysource][5] is a funding platform for open source software that has a unique way of paying a developer for his time and work int he name of Bounties.
+
+There are basically two campaigns, bounties and salt campaign.
+
+Under the Bounties, users declare bounties aka cash prizes on open issues that they believe should be fixed or any new features which they want to see in the software they are using. A developer can then go and fix it to receive the cash prize.
+
+Salt Campaign is like any other funding, anyone can pay a recurring amount to a project or an individual working for an open source project for as long as they want.
+
+Bountysource accepts any software that is approved by Free Software Foundation or Open Source Initiatives. The bounties can be placed using PayPal, Bitcoin or the bounty itself if owned previously. Bountysource supports a no. of issue tracker currently like GitHub, Bugzilla, Google Code, Jira, Launchpad etc.
+
+#### 3\. Open Collective
+
+[Open Collective][6] is another popular funding initiative where a person who is willing to receive the donation for the work he is doing in Open Source world can create a page. He can submit the expense reports for the project he is working on. A contributor can add money to his account and pay him for his expenses.
+
+The complete process is transparent and everyone can track whoever is associated with Open Collective. The contributions are visible along with the unpaid expenses. There is also the option to contribute on a recurring basis.
+
+Open Collective currently has more than 500 collectives being backed up by more than 5000 users.
+
+The fact that it is transparent and you know what you are contributing to, drives more accountability. Some common example of collective include hosting costs, community maintenance, travel expenses etc.
+
+Though Open Collective keeps 10% of all the transactions, it is still a nice way to get your expenses covered in the process of contributing towards an open source project.
+
+#### 4\. Open Source Grants
+
+[Open Source Grants][7] is still in its beta stage and has not matured yet. They are looking for projects that do not have any stable funding and adds value to open source community. Most open source projects are run by a small community in a free time and they are trying to fund them so that the developers can work full time on the projects.
+
+They are equally searching for companies that want to help open source enthusiasts. The process of submitting a project is still being worked upon, and hopefully, in coming days we will see a working way of funding.
+
+### Final Words
+
+In the end, I would also like to mention [Patreon][8]. This funding platform is not exclusive to open source but is focused on creators of all kinds. Some projects like [elementary OS have created their accounts on Patreon][9] so that you can support the project on a recurring basis.
+
+Think Free Speech, not Free Beer. Your small contribution to a project can help it sustain in the long run. For the developers, the above platform can provide a good way to cover up their expenses.
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/open-source-funding-platforms/
+
+作者:[Ambarish Kumar][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/ambarish/
+[b]: https://github.com/lujun9972
+[1]: https://itsfoss.com/help-linux-grow/
+[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2018/03/Fund-Open-Source-projects.png?resize=800%2C450&ssl=1
+[3]: https://itsfoss.com/gratipay-open-source/
+[4]: https://liberapay.com/
+[5]: https://www.bountysource.com/
+[6]: https://opencollective.com/
+[7]: https://foundation.travis-ci.org/grants/
+[8]: https://www.patreon.com/
+[9]: https://www.patreon.com/elementary
diff --git a/sources/tech/20180328 What NASA Has Been Doing About Open Science.md b/sources/talk/20180328 What NASA Has Been Doing About Open Science.md
similarity index 100%
rename from sources/tech/20180328 What NASA Has Been Doing About Open Science.md
rename to sources/talk/20180328 What NASA Has Been Doing About Open Science.md
diff --git a/sources/tech/20180403 3 pitfalls everyone should avoid with hybrid multicloud.md b/sources/talk/20180403 3 pitfalls everyone should avoid with hybrid multicloud.md
similarity index 100%
rename from sources/tech/20180403 3 pitfalls everyone should avoid with hybrid multicloud.md
rename to sources/talk/20180403 3 pitfalls everyone should avoid with hybrid multicloud.md
diff --git a/sources/talk/20180409 5 steps to building a cloud that meets your users- needs.md b/sources/talk/20180409 5 steps to building a cloud that meets your users- needs.md
deleted file mode 100644
index db17eca751..0000000000
--- a/sources/talk/20180409 5 steps to building a cloud that meets your users- needs.md
+++ /dev/null
@@ -1,107 +0,0 @@
-Translating by FelixYFZ
-5 steps to building a cloud that meets your users' needs
-======
-
-
-This article was co-written with [Ian Tewksbury][1].
-
-However you define it, a cloud is simply another tool for your users to perform their part of your organization's value stream. It can be easy when talking about any new paradigm or technology (the cloud is arguably both) to get distracted by the shiny newness of it. Conversations can quickly devolve into feature wish lists set off by a series of never-ending questions, all of which you probably have already considered:
-
- * Will it be public, private, or hybrid?
- * Will it use virtual machines or containers, or both?
- * Will it be self-service?
- * Will it be fully automated from development to production, or will it have manual gates?
- * How fast can we make it?
- * What about tool X, Y, or Z?
-
-
-
-The list goes on.
-
-The usual approach to beginning IT modernization, or digital transformation, or whatever you call it is to start answering high-level questions in the higher-level echelons of management. The outcome of this approach is predictable: failure. After extensively researching and spending months, if not years, deploying the fanciest new technology, the new cloud is never used and falls into disrepair until it is eventually scrapped or forgotten in the dustier corners of the datacenter and budget.
-
-That's because whatever was delivered was not the tool the users wanted or needed. Worse yet, it likely was a single tool when users really needed a collection of tools that could be swapped out over time as newer, shinier, upgraded tools come along that better meet their needs.
-
-### Focus on what matters
-
-The problem is focus, which has traditionally been on the tools. But the tools are not what add to your organization's value stream; end users making use of tools are what do that. You need to shift your focus from building your cloud—for example, the technology and the tools, to your people, your users.
-
-Beyond the fact that users using tools (not the tools themselves) are what drive value, there are other reasons to focus attention on the users. The tools are for the users to use to solve their problems and allow them to create value, so it follows that if those tools don't meet those users' needs, then those tools won't be used. If you deliver tools that your users don't like, they won't use them. This is natural human behavior.
-
-The IT industry got away with providing a single solution to users for decades because there were only one or two options, and the users had no power to change that. That is no longer the case. We now live in the world of technological choice. It is no longer acceptable to users to not be given a choice; they have choices in their personal technological lives, and they expect it in the workplace, too. Today's users are educated and know there are better options than the ones you've been providing.
-
-As a result, outside the most physically secure locations, there is no way to stop them from just doing what they want, which we call "shadow IT." If your organization has such strict security and compliance polices that shadow IT is impossible, many of your best people will grow frustrated and leave for other organizations that offer them choices.
-
-For all of these reasons, you must design your expensive and time-consuming cloud project with your end user foremost in mind.
-
-### Five-step process to build a cloud for users' needs
-
-Now that we know the why, let's talk about the how. How do you build a cloud for the end user? How do you start refocusing your attention from the technology to the people using that technology?
-
-Through experience, we've learned that the best approach involves two things: getting constant feedback from your users, and building things iteratively.
-
-Your cloud environment will continually evolve with your organization. The following five-step process will help you create a cloud that meets your users' needs.
-
-#### 1\. Identify who your users will be.
-
-Before you can start asking users questions, you first must identify who the users of your new cloud will be. They will likely include developers who build applications on the cloud; the operations team who will operate, maintain, and likely build the cloud; and the security team who protects your organization. For the first iteration, scope down your users to a smaller group so you're less overwhelmed by feedback. Ask each of your identified user groups to appoint two liaisons (a primary and a secondary) who will represent their team on this journey. This will also keep your first delivery small in both size and time.
-
-#### 2\. Talk to your users face-to-face to get valuable input.
-
-The best way to get users' feedback is through direct communication. Mass emails asking for input will self-select respondents—if you even get a response. Group discussions can be helpful, but people tend to be more candid when they have a private, attentive audience.
-
-Schedule in-person, individual meetings with your first set of users to ask them questions like the following:
-
- * What do you need in order to accomplish your tasks?
- * What do you want in order to accomplish your tasks?
- * What is your current, most annoying technological pain?
- * What is your current, most annoying policy or procedural pain?
- * What ideas do you have to address any of your needs, wants, or pains?
-
-
-
-These questions are guidelines and not ideal for every organization. They should not be the only questions you ask, and they should lead to further discussion. Be sure to tell people that anything said or asked is taken as feedback, and all feedback is helpful, whether positive or negative. The outcome of these conversations will help set your development priorities.
-
-Gathering this level of personalized feedback is another reason to keep your initial group of users small: It takes a lot of time to sit down with each user, but we have found it is absolutely worth the investment.
-
-#### 3\. Design and deliver your first iteration of the solution.
-
-Once you've collected feedback from your initial users, it is time to design and deliver a piece of functionality. We do not recommend trying to deliver the entire solution. The design and delivery phase should be short; this is to avoid making the huge mistake of spending a year building what you think is the correct solution, only to have your users reject it because it isn't beneficial to them. The specific tools you choose for building your cloud will depend on your organization and its specific needs. Just make sure that the solution you build is based on your users' feedback and that you deliver it in small chunks to solicit feedback from them as often as possible.
-
-#### 4\. Ask users for feedback on the first iteration.
-
-Great, now you've designed and delivered the first iteration of your fancy new cloud to your end users! You didn't spend a year doing it but instead tackled it in small pieces. Why is it important to do things in small chunks? It's because you're going back to your user groups and collecting feedback about your design and delivery. What do they like? What don't they like? Did you properly address their concerns? Is the technology great, but the process or policy side of the system still lacking?
-
-Again, the questions you'll ask depend on your organization; the key here is to continue the discussions from the earlier phases. You're building this cloud for users after all, so make sure it's useful for them and a productive use of everyone's time.
-
-#### 5\. Return to step 1.
-
-This is an iterative process. Your first delivery should have been quick and small, and all future iterations should be, too. Don't expect to be able to follow this process once, twice, or even three times and be done. As you iterate, you will introduce more users and get better at the process. You will get more buy-in from users. You will be able to iterate faster and more reliably. And, finally, you will change your process to meet your users' needs.
-
-Users are the most important part of this process, but the iteration is the second most important part because it allows you to keep going back to the users and getting more information. Throughout each phase, take note of what worked and what didn't. Be introspective and honest with yourself. Are we providing the most value possible for the time we spent? If not, try something different in the next phase. The great part about not spending too much time in each cycle is that, if something doesn't work this time, you can easily tweak it for next time, until you find an approach that works for your organization.
-
-### This is just the beginning
-
-Through many customer engagements, feedback gathered from users, and experiences from peers in the field, we've found time and time again that the most important thing you can do when building a cloud is to talk to your users. It seems obvious, but it is surprising how many organizations will go off and build something for months or years, then find out it isn't even useful to end users.
-
-Now you know why you should keep your focus on the end users and have a process for building a cloud with them at the center. The remaining piece is the part that we all enjoy, the part where you go out and do it.
-
-This article is based on "[Design your hybrid cloud for the end user—or fail][2]," a talk the authors will be giving at [Red Hat Summit 2018][3], which will be held May 8-10 in San Francisco.
-
-[Register by May 7][3] to save US$ 500 off of registration. Use discount code **OPEN18** on the payment page to apply the discount.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/4/5-steps-building-your-cloud-correctly
-
-作者:[Cameron Wyatt][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-选题:[lujun9972](https://github.com/lujun9972)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://opensource.com/users/cameronmwyatt
-[1]:https://opensource.com/users/itewk
-[2]:https://agenda.summit.redhat.com/SessionDetail.aspx?id=154225
-[3]:https://www.redhat.com/en/summit/2018
diff --git a/sources/tech/20180412 A new approach to security instrumentation.md b/sources/talk/20180412 A new approach to security instrumentation.md
similarity index 99%
rename from sources/tech/20180412 A new approach to security instrumentation.md
rename to sources/talk/20180412 A new approach to security instrumentation.md
index 5c7d9fe109..0a6a98c0f2 100644
--- a/sources/tech/20180412 A new approach to security instrumentation.md
+++ b/sources/talk/20180412 A new approach to security instrumentation.md
@@ -1,3 +1,5 @@
+Translating by hopefully2333
+
A new approach to security instrumentation
======
diff --git a/sources/tech/20180511 Looking at the Lispy side of Perl.md b/sources/talk/20180511 Looking at the Lispy side of Perl.md
similarity index 100%
rename from sources/tech/20180511 Looking at the Lispy side of Perl.md
rename to sources/talk/20180511 Looking at the Lispy side of Perl.md
diff --git a/sources/tech/20180620 Anatomy of a perfect pull request.md b/sources/talk/20180620 Anatomy of a perfect pull request.md
similarity index 100%
rename from sources/tech/20180620 Anatomy of a perfect pull request.md
rename to sources/talk/20180620 Anatomy of a perfect pull request.md
diff --git a/sources/tech/20180625 8 reasons to use the Xfce Linux desktop environment.md b/sources/talk/20180625 8 reasons to use the Xfce Linux desktop environment.md
similarity index 100%
rename from sources/tech/20180625 8 reasons to use the Xfce Linux desktop environment.md
rename to sources/talk/20180625 8 reasons to use the Xfce Linux desktop environment.md
diff --git a/sources/tech/20180629 Reflecting on the GPLv3 license for its 11th anniversary.md b/sources/talk/20180629 Reflecting on the GPLv3 license for its 11th anniversary.md
similarity index 100%
rename from sources/tech/20180629 Reflecting on the GPLv3 license for its 11th anniversary.md
rename to sources/talk/20180629 Reflecting on the GPLv3 license for its 11th anniversary.md
diff --git a/sources/tech/20180701 How to migrate to the world of Linux from Windows.md b/sources/talk/20180701 How to migrate to the world of Linux from Windows.md
similarity index 100%
rename from sources/tech/20180701 How to migrate to the world of Linux from Windows.md
rename to sources/talk/20180701 How to migrate to the world of Linux from Windows.md
diff --git a/sources/tech/20180705 5 Reasons Open Source Certification Matters More Than Ever.md b/sources/talk/20180705 5 Reasons Open Source Certification Matters More Than Ever.md
similarity index 100%
rename from sources/tech/20180705 5 Reasons Open Source Certification Matters More Than Ever.md
rename to sources/talk/20180705 5 Reasons Open Source Certification Matters More Than Ever.md
diff --git a/sources/tech/20180706 Robolinux Lets You Easily Run Linux and Windows Without Dual Booting.md b/sources/talk/20180706 Robolinux Lets You Easily Run Linux and Windows Without Dual Booting.md
similarity index 100%
rename from sources/tech/20180706 Robolinux Lets You Easily Run Linux and Windows Without Dual Booting.md
rename to sources/talk/20180706 Robolinux Lets You Easily Run Linux and Windows Without Dual Booting.md
diff --git a/sources/tech/20180711 Becoming a senior developer 9 experiences you ll encounter.md b/sources/talk/20180711 Becoming a senior developer 9 experiences you ll encounter.md
similarity index 100%
rename from sources/tech/20180711 Becoming a senior developer 9 experiences you ll encounter.md
rename to sources/talk/20180711 Becoming a senior developer 9 experiences you ll encounter.md
diff --git a/sources/tech/20180711 Open hardware meets open science in a multi-microphone hearing aid project.md b/sources/talk/20180711 Open hardware meets open science in a multi-microphone hearing aid project.md
similarity index 100%
rename from sources/tech/20180711 Open hardware meets open science in a multi-microphone hearing aid project.md
rename to sources/talk/20180711 Open hardware meets open science in a multi-microphone hearing aid project.md
diff --git a/sources/tech/20180716 Confessions of a recovering Perl hacker.md b/sources/talk/20180716 Confessions of a recovering Perl hacker.md
similarity index 100%
rename from sources/tech/20180716 Confessions of a recovering Perl hacker.md
rename to sources/talk/20180716 Confessions of a recovering Perl hacker.md
diff --git a/sources/talk/20180719 Finding Jobs in Software.md b/sources/talk/20180719 Finding Jobs in Software.md
index f1eff9caee..6d3aebaea0 100644
--- a/sources/talk/20180719 Finding Jobs in Software.md
+++ b/sources/talk/20180719 Finding Jobs in Software.md
@@ -1,4 +1,3 @@
-translating by lujun9972
Finding Jobs in Software
======
diff --git a/sources/tech/20180720 A brief history of text-based games and open source.md b/sources/talk/20180720 A brief history of text-based games and open source.md
similarity index 100%
rename from sources/tech/20180720 A brief history of text-based games and open source.md
rename to sources/talk/20180720 A brief history of text-based games and open source.md
diff --git a/sources/talk/20180811 Dropbox To End Sync Support For All Filesystems Except Ext4 on Linux.md b/sources/talk/20180811 Dropbox To End Sync Support For All Filesystems Except Ext4 on Linux.md
deleted file mode 100644
index 7d471f42bb..0000000000
--- a/sources/talk/20180811 Dropbox To End Sync Support For All Filesystems Except Ext4 on Linux.md
+++ /dev/null
@@ -1,71 +0,0 @@
-Dropbox To End Sync Support For All Filesystems Except Ext4 on Linux
-======
-Dropbox is thinking of limiting the synchronization support to only a handful of file system types: NTFS for Windows, HFS+/APFS for macOS and Ext4 for Linux.
-
-![Dropbox ends support for various file system types][1]
-
-[Dropbox][2] is one of the most popular [cloud services for Linux][3]. A lot of folks happen to utilize the Dropbox sync client for Linux. However, recently, some of the users received a warning on their Dropbox Linux desktop client that said:
-
-> “Move Dropbox location
-> Dropbox will stop syncing in November“
-
-### Dropbox will only support a handful of file systems
-
-A [Reddit thread][4] highlighted the announcement where one of the users inquired about it on [Dropbox forums][5], which was addressed by a community moderator with an unexpected news. Here’s what the[reply][6] was:
-
-> **“Hi everyone, on Nov. 7, 2018, we’re ending support for Dropbox syncing to drives with certain uncommon file systems. The supported file systems are NTFS for Windows, HFS+ or APFS for Mac, and Ext4 for Linux.**
->
-> [Official Dropbox Forum][6]
-
-![Dropbox official confirmation over limitation on supported file systems][7]
-Dropbox official confirmation over limitation on supported file systems
-
-The move is intended to provide a stable and consistent experience. Dropbox has also updated its [desktop requirements.][8]
-
-### So, what should you do?
-
-If you are using Dropbox on an unsupported filesystem to sync with, you should consider changing the location.
-
-Only Ext4 file system will be supported for Linux. And that’s not entirely a worrying news because chances are that you are already using Ext4 file system.
-
-On Ubuntu or other Ubuntu based distributions, open the Disks application and see the file system for the partition where you have installed your Linux system.
-
-![Check file system type on Ubuntu][9]
-Check file system type on Ubuntu
-
-If you don’t have this Disk utility installed on your system, you can always [use the command line to find out file system type][10].
-
-If you are using Ext4 file system and still getting the warning from Dropbox, check if you have an inactive computer/device linked for which you might be getting the notification. If yes, [unlink that system from your Dropbox account][11].
-
-### Dropbox won’t support encrypted Ext4 as well?
-
-Some users are also reporting that they received the warning while they have an encrypted Ext4 filesystem synced with. So, does this mean that the Dropbox client for Linux will only support unencrypted Ext4 filesystem? There is no official statement from Dropbox in this regard.
-
-What filesystem are you using? Did you receive the warning as well? If you’re still not sure what to do after receiving the warning, you should head to the [official help center page][12] which mentions the solution.
-
-Let us know your thoughts in the comments below.
-
---------------------------------------------------------------------------------
-
-via: https://itsfoss.com/dropbox-linux-ext4-only/
-
-作者:[Ankush Das][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://itsfoss.com/author/ankush/
-[1]: https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/08/dropbox-filesystem-support-featured.png
-[2]: https://www.dropbox.com/
-[3]: https://itsfoss.com/cloud-services-linux/
-[4]: https://www.reddit.com/r/linux/comments/966xt0/linux_dropbox_client_will_stop_syncing_on_any/
-[5]: https://www.dropboxforum.com/t5/Syncing-and-uploads/
-[6]: https://www.dropboxforum.com/t5/Syncing-and-uploads/Linux-Dropbox-client-warn-me-that-it-ll-stop-syncing-in-Nov-why/m-p/290065/highlight/true#M42255
-[7]: https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/08/dropbox-stopping-file-system-supports.jpeg
-[8]: https://www.dropbox.com/help/desktop-web/system-requirements#desktop
-[9]: https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/08/check-file-system-type-ubuntu.jpg
-[10]: https://www.thegeekstuff.com/2011/04/identify-file-system-type/
-[11]: https://www.dropbox.com/help/mobile/unlink-relink-computer-mobile
-[12]: https://www.dropbox.com/help/desktop-web/cant-establish-secure-connection#location
diff --git a/sources/talk/20180817 Mixing software development roles produces great results.md b/sources/talk/20180817 Mixing software development roles produces great results.md
deleted file mode 100644
index 20c2e76a3d..0000000000
--- a/sources/talk/20180817 Mixing software development roles produces great results.md
+++ /dev/null
@@ -1,71 +0,0 @@
-Mixing software development roles produces great results
-======
-
-
-
-Most open source communities don’t have a lot of formal roles. There are certainly people who help with sysadmin tasks, testing, writing documentation, and translating or developing code. But people in open source communities typically move among different roles, often fulfilling several at once.
-
-In contrast, team members at most traditional companies have defined roles, working on documentation, support, QA, and in other areas.
-
-Why do open source communities take a shared-role approach, and more importantly, how does this way of collaborating affect products and customers?
-
-[Nextcloud][1] has adopted this community-style practice of mixing roles, and we see large benefits for our customers and our users.
-
-### 1\. Better product testing
-
-Testing is a difficult job, as any tester can tell you. You need to understand the products engineers develop, and you need to devise test plans, execute them, and return the results to the developers. When that process is done, the developer makes changes, and you repeat the process, going back-and-forth as many times as necessary until the job is done.
-
-In a community, contributors typically feel responsible for the projects they develop, so they test and document them extensively before handing them to users. Users close to the project often help test, translate, and write documentation in collaboration with developers. This creates a much tighter, faster feedback loop, speeding up development and improving quality.
-
-When developers continuously confront the results of their work, it encourages them to write in a way that minimizes testing and debugging. Automated testing is an important element in development, and the feedback loop ensures that it is done right: Developers are organically motivated to automate what should be automated—no more and no less. Sure, they might _want_ others to do more testing or test automation, but when testing is the right thing to do, they do it. Moreover, they review each others' code because they know that issues tend to come back bite them later.
-
-So, while I won't argue that it's better to forgo dedicated testers, certainly in a project without community volunteers who test, testers should be developers and closely embedded in the development team. The result? Customers get a product that was tested and developed by people who are 100% motivated to ensure that it is stable and reliable.
-
-### 2\. Close alignment between development and customer needs
-
-It is extraordinarily difficult to align product development with customer needs. Every customer has their own unique needs, there are long- and short-term factors to consider—and of course, as a company, you have ideas on where you want to go. How do you integrate all these ideas and visions?
-
-Companies typically create roles like product management, support, QA, and others, which are separate from engineering and product development. The idea behind this is that people do best when they specialize, and engineers shouldn't be bothered with "simple" tasks like testing or support.
-
-In effect, this role separation is a cost-cutting measure. It enables management to micromanage and feel more in control as they can simply order product management, for example, to prioritize items on the roadmap. (It also creates more meetings!)
-
-In communities, on the other hand, "those who do the work decide." Developers are often also users (or are paid by users), so they align with users’ needs naturally. When users help with testing (as described above), developers work with them constantly, so both sides fully understand what is possible and what is needed.
-
-This open way of working closely aligns users and projects. Without management interference and overhead, users' most pressing needs can be quickly met because engineers already intimately understand them.
-
-At Nextcloud, customers never need to explain things twice or rely on a junior support team member to accurately communicate issues to an engineer. Our engineers continuously calibrate their priorities based on real customer needs. Meanwhile, long-term goals are set collaboratively, based on a deep knowledge of our customers.
-
-### 3\. The best support
-
-Unlike proprietary or [open core][2] vendors, open source vendors have a powerful incentive to offer the best possible support: It is a key differentiator from other companies in their ecosystem.
-
-Why is the driving force behind a project—think [Collabora][3] behind [LibreOffice][4], [The Qt Company][5] behind [Qt][6], or [Red Hat][7] behind [RHEL][8]—the best source of customer support?
-
-Direct access to engineers, of course. Rather than walling off support from engineering, many of these companies offer customers access to engineers' expertise. This helps ensure that customers always get the best answers as quickly as possible. While some engineers may spend more time than others on support, the entire engineering team plays a role in customer success. Proprietary vendors might provide customers a dedicated on-site engineer for a considerable cost, for example, but an open source company like [OpenNMS][9] offers that same level of service in your support contract—even if you’re not a Fortune 500 customer.
-
-There's another benefit, which relates back to testing and customer alignment: Sharing roles ensures that engineers deal with customer issues and wishes daily, which motivates them to fix the most common problems quickly. They also tend to build extra tools and features to save customers from asking.
-
-Put simply, folding QA, support, product management, and other engineering roles into one team ensures that the three famous virtues of great developers—[laziness, impatience, and hubris][10]—closely align with customers.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/8/mixing-roles-engineering
-
-作者:[Jos Poortvliet][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://opensource.com/users/jospoortvliet
-[1]:https://nextcloud.com/
-[2]:https://en.wikipedia.org/wiki/Open_core
-[3]:https://www.collaboraoffice.com/
-[4]:https://www.libreoffice.org/
-[5]:https://www.qt.io/
-[6]:https://www.qt.io/developers/
-[7]:https://www.redhat.com/en
-[8]:https://www.redhat.com/en/technologies/linux-platforms/enterprise-linux
-[9]:https://www.opennms.org/en
-[10]:http://threevirtues.com/
diff --git a/sources/tech/20180820 Keeping patient data safe with open source tools.md b/sources/talk/20180820 Keeping patient data safe with open source tools.md
similarity index 100%
rename from sources/tech/20180820 Keeping patient data safe with open source tools.md
rename to sources/talk/20180820 Keeping patient data safe with open source tools.md
diff --git a/sources/tech/20180831 3 innovative open source projects for the new school year.md b/sources/talk/20180831 3 innovative open source projects for the new school year.md
similarity index 100%
rename from sources/tech/20180831 3 innovative open source projects for the new school year.md
rename to sources/talk/20180831 3 innovative open source projects for the new school year.md
diff --git a/sources/talk/20180916 Linus, His Apology, And Why We Should Support Him.md b/sources/talk/20180916 Linus, His Apology, And Why We Should Support Him.md
deleted file mode 100644
index 5794aaa635..0000000000
--- a/sources/talk/20180916 Linus, His Apology, And Why We Should Support Him.md
+++ /dev/null
@@ -1,56 +0,0 @@
-heguangzhi translating
-
-Linus, His Apology, And Why We Should Support Him
-======
-
-
-
-Today, Linus Torvalds, the creator of Linux, which powers everything from smartwatches to electrical grids posted [a pretty remarkable note on the kernel mailing list][1].
-
-As a little bit of backstory, Linus has sometimes come under fire for the ways in which he has expressed feedback, provided criticism, and reacted to various scenarios on the kernel mailing list. This criticism has been fair in many cases: he has been overly aggressive at times, and while the kernel maintainers are a tight-knit group, the optics, particularly for those new to kernel development has often been pretty bad.
-
-Like many conflict scenarios, this feedback has been communicated back to him in both constructive and non-constructive ways. Historically he has been seemingly reluctant to really internalize this feedback, I suspect partially because (a) the Linux kernel is a very successful project, and (b) some of the critics have at times gone nuclear at him (which often doesn’t work as a strategy towards defensive people). Well, things changed today.
-
-In his post today he shared some self-reflection on this feedback:
-
-> This week people in our community confronted me about my lifetime of not understanding emotions. My flippant attacks in emails have been both unprofessional and uncalled for. Especially at times when I made it personal. In my quest for a better patch, this made sense to me. I know now this was not OK and I am truly sorry.
-
-He went on to not just share an admission that this has been a problem, but to also share a very personal acceptance that he struggles to understand and engage with people’s emotions:
-
-> The above is basically a long-winded way to get to the somewhat painful personal admission that hey, I need to change some of my behavior, and I want to apologize to the people that my personal behavior hurt and possibly drove away from kernel development entirely. I am going to take time off and get some assistance on how to understand people’s emotions and respond appropriately.
-
-His post is sure to light up the open source, Linux, and tech world for the next few weeks. For some it will be celebrated as a step in the right direction. For some it will be too little too late, and their animus will remain. For some they will be cautiously supportive, but defer judgement until they have seen his future behavior demonstrate substantive changes.
-
-### My Take
-
-I wouldn’t say I know Linus very closely; we have a casual relationship. I see him at conferences from time to time, and we often bump into each other and catch up. I interviewed him for my book and for the Global Learning XPRIZE. From my experience he is a funny, genuine, friendly guy. Interestingly, and not unusually at all for open source, his online persona is rather different to his in-person persona. I am not going to deny that when I would see these dust-ups on LKML, it didn’t reflect the Linus I know. I chalked it down to a mixture of his struggles with social skills, dogmatic pragmatism, and ego.
-
-His post today is a pretty remarkable change of posture for him, and I encourage that we as a community support him in making these changes.
-
-**Accepting these personal challenges is tough, particularly for someone in his position**. Linux is a global phenomenon. It has resulted in billions of dollars of technology creation, powering thousands of companies, and changing the norms around of how software is consumed and created. It is easy to forget that Linux was started by a quiet Finnish kid in his university dorm room. It is important to remember that **just because Linux has scaled elegantly, it doesn’t mean that Linus has been able to**. He isn’t a codebase, he is a human being, and bugs are harder to spot and fix in humans. You can’t just deploy a fix immediately. It takes time to identify the problem and foster and grow a change. The starting point for this is to support people in that desire for change, not re-litigate the ills of the past: that will get us nowhere quickly.
-
-[![Young Linus Torvalds][2]][3]
-
-I am also mindful of ego. None of us like to admit we have an ago, but we all do. You don’t get to build one of the most fundamental technologies in the last thirty years and not have an ego. He built it…they came…and a revolution was energized because of what he created. While Linus’s ego is more subtle, and thankfully doesn’t extend to faddish self-promotion, overly expensive suits, and forays into Hollywood (quite the opposite), his ego has naturally resulted in abrupt opinions on how his project should run, sometimes plugging fingers in his ears to particularly challenging viewpoints from others. **His post today is a clear example of him putting Linux as a project ahead of his own personal ego**.
-
-This is important for a few reasons. Firstly, being in such a public position and accepting your personal flaws isn’t a problem many people face, and isn’t a situation many people handle well. I work with a lot of CEOs, and they often say it is the loneliest job on the planet. I have heard American presidents say the same in interviews. This is because they are the top of the tree with all the responsibility and expectations on their shoulders. Put yourself in Linus’s position: his little project has blown up into a global phenomenon, and he didn’t necessarily have the social tools to be able to handle this change. Ego forces these internal struggles under the surface and to push them down and avoid them. So, to accept them as publicly and openly as he did today is a very firm step in the right direction. Now, the true test will be results, but we need to all provide the breathing space for him to accomplish them.
-
-So, I would encourage everyone to give Linus a shot. This doesn’t mean the frustrations of the past are erased, and he has acknowledged and apologized for these mistakes as a first step. He has accepted he struggles with understanding other’s emotions, and a desire to help improve this for the betterment of the project and himself. **He is a human, and the best tonic for humans to resolve their own internal struggles is the support and encouragement of other humans**. This is not unique to Linus, but to anyone who faces similar struggles.
-
-All the best, Linus.
-
---------------------------------------------------------------------------------
-
-via: https://www.jonobacon.com/2018/09/16/linus-his-apology-and-why-we-should-support-him/
-
-作者:[Jono Bacon][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://www.jonobacon.com/author/admin/
-[1]: https://lkml.org/lkml/2018/9/16/167
-[2]: https://i1.wp.com/www.jonobacon.com/wp-content/uploads/2018/09/linus.jpg?resize=499%2C342&ssl=1
-[3]: https://i1.wp.com/www.jonobacon.com/wp-content/uploads/2018/09/linus.jpg?ssl=1
diff --git a/sources/talk/20180921 IssueHunt- A New Bounty Hunting Platform for Open Source Software.md b/sources/talk/20180921 IssueHunt- A New Bounty Hunting Platform for Open Source Software.md
deleted file mode 100644
index 2deeb75547..0000000000
--- a/sources/talk/20180921 IssueHunt- A New Bounty Hunting Platform for Open Source Software.md
+++ /dev/null
@@ -1,66 +0,0 @@
-IssueHunt: A New Bounty Hunting Platform for Open Source Software
-======
-One of the issues that many open-source developers and companies struggle with is funding. There is an assumption, an expectation even, among the community that Free and Open Source Software must be provided free of cost. But even FOSS needs funding for continued development. How can we keep expecting better quality software if we don’t create systems that enable continued development?
-
-We already wrote an article about [open source funding platforms][1] out there that try to tackle this shortcoming, as of this July there is a new contender in the market that aims to help fill this gap: [IssueHunt][2].
-
-### IssueHunt: A Bounty Hunting platform for Open Source Software
-
-![IssueHunt website][3]
-
-IssueHunt offers a service that pays freelance developers for contributing to open-source code. It does so through what are called bounties: financial rewards granted to whoever solves a given problem. The funding for these bounties comes from anyone who is willing to donate to have any given bug fixed or feature added.
-
-If there is a problem with a piece of open-source software that you want fixed, you can offer up a reward amount of your choosing to whoever fixes it.
-
-Do you want your own product snapped? Offer a bounty on IssueHunt to whoever snaps it. It’s as simple as that.
-
-And if you are a programmer, you can browse through open issues. Fix the issue (if you could), submit a pull request on the GitHub repository and if your pull request is merged, you get the money.
-
-#### IssueHunt was originally an internal project for Boostnote
-
-![IssueHunt][4]
-
-The product came to be when the developers behind the note-taking app [Boostnote][5] reached out to the community for contributions to their own product.
-
-In the first two years of utilizing IssueHunt, Boostnote received over 8,400 Github stars through hundreds contributors and overwhelming donations.
-
-The product was so successful that the team decided to open it up to the rest of the community.
-
-Today, [a list of projects utilize this service][6], offering thousands of dollars in bounties among them.
-
-Boostnote boasts [$2,800 in total bounties][7], while Settings Sync, previously known as Visual Studio Code Settings Sync, offers [more than $1,600 in bounties.][8]
-
-There are other services that provide something similar to what IssueHunt is offering here. Perhaps the most notable is [Bountysource][9], which offers a similar bounty service to IssueHunt, while also offering subscription payment processing similar to [Librepay][10].
-
-#### What do you think of IssueHunt?
-
-At the time of writing this article, IssueHunt is in its infancy, but I am incredibly excited to see where this project ends up in the comings years.
-
-I don’t know about you, but I am more than happy paying for FOSS. If the product is high quality and adds value to my life, then I will happily pay the developer the product. Especially since FOSS developers are creating products that respect my freedom in the process.
-
-That being said, I will definitely keep my eye on IssueHunt moving forward for ways I can support the community either with my own money or by spreading the word where contribution is needed.
-
-But what do you think? Do you agree with me, or do you think software should be Gratis free, and that contributions should be made on a volunteer basis? Let us know what you think in the comments below.
-
---------------------------------------------------------------------------------
-
-via: https://itsfoss.com/issuehunt/
-
-作者:[Phillip Prado][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://itsfoss.com/author/phillip/
-[1]: https://itsfoss.com/open-source-funding-platforms/
-[2]: https://issuehunt.io
-[3]: https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/09/issuehunt-website.png
-[4]: https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/09/issuehunt.jpg
-[5]: https://itsfoss.com/boostnote-linux-review/
-[6]: https://issuehunt.io/repos
-[7]: https://issuehunt.io/repos/53266139
-[8]: https://issuehunt.io/repos/47984369
-[9]: https://www.bountysource.com/
-[10]: https://liberapay.com/
diff --git a/sources/tech/20180930 A Short History of Chaosnet.md b/sources/talk/20180930 A Short History of Chaosnet.md
similarity index 100%
rename from sources/tech/20180930 A Short History of Chaosnet.md
rename to sources/talk/20180930 A Short History of Chaosnet.md
diff --git a/sources/talk/20181014 How Lisp Became God-s Own Programming Language.md b/sources/talk/20181014 How Lisp Became God-s Own Programming Language.md
deleted file mode 100644
index a1dcf6c2eb..0000000000
--- a/sources/talk/20181014 How Lisp Became God-s Own Programming Language.md
+++ /dev/null
@@ -1,128 +0,0 @@
-Northurland Translating
-
-How Lisp Became God's Own Programming Language
-======
-When programmers discuss the relative merits of different programming languages, they often talk about them in prosaic terms as if they were so many tools in a tool belt—one might be more appropriate for systems programming, another might be more appropriate for gluing together other programs to accomplish some ad hoc task. This is as it should be. Languages have different strengths and claiming that a language is better than other languages without reference to a specific use case only invites an unproductive and vitriolic debate.
-
-But there is one language that seems to inspire a peculiar universal reverence: Lisp. Keyboard crusaders that would otherwise pounce on anyone daring to suggest that some language is better than any other will concede that Lisp is on another level. Lisp transcends the utilitarian criteria used to judge other languages, because the median programmer has never used Lisp to build anything practical and probably never will, yet the reverence for Lisp runs so deep that Lisp is often ascribed mystical properties. Everyone’s favorite webcomic, xkcd, has depicted Lisp this way at least twice: In [one comic][1], a character reaches some sort of Lisp enlightenment, which appears to allow him to comprehend the fundamental structure of the universe. In [another comic][2], a robed, senescent programmer hands a stack of parentheses to his padawan, saying that the parentheses are “elegant weapons for a more civilized age,” suggesting that Lisp has all the occult power of the Force.
-
-Another great example is Bob Kanefsky’s parody of a song called “God Lives on Terra.” His parody, written in the mid-1990s and called “Eternal Flame”, describes how God must have created the world using Lisp. The following is an excerpt, but the full set of lyrics can be found in the [GNU Humor Collection][3]:
-
-> For God wrote in Lisp code
-> When he filled the leaves with green.
-> The fractal flowers and recursive roots:
-> The most lovely hack I’ve seen.
-> And when I ponder snowflakes,
-> never finding two the same,
-> I know God likes a language
-> with its own four-letter name.
-
-I can only speak for myself, I suppose, but I think this “Lisp Is Arcane Magic” cultural meme is the most bizarre and fascinating thing ever. Lisp was concocted in the ivory tower as a tool for artificial intelligence research, so it was always going to be unfamiliar and maybe even a bit mysterious to the programming laity. But programmers now [urge each other to “try Lisp before you die”][4] as if it were some kind of mind-expanding psychedelic. They do this even though Lisp is now the second-oldest programming language in widespread use, younger only than Fortran, and even then by just one year. Imagine if your job were to promote some new programming language on behalf of the organization or team that created it. Wouldn’t it be great if you could convince everyone that your new language had divine powers? But how would you even do that? How does a programming language come to be known as a font of hidden knowledge?
-
-How did Lisp get to be this way?
-
-![Byte Magazine Cover, August, 1979.][5]
-The cover of Byte Magazine, August, 1979.
-
-### Theory A: The Axiomatic Language
-
-John McCarthy, Lisp’s creator, did not originally intend for Lisp to be an elegant distillation of the principles of computation. But, after one or two fortunate insights and a series of refinements, that’s what Lisp became. Paul Graham—we will talk about him some more later—has written that, with Lisp, McCarthy “did for programming something like what Euclid did for geometry.” People might see a deeper meaning in Lisp because McCarthy built Lisp out of parts so fundamental that it is hard to say whether he invented it or discovered it.
-
-McCarthy began thinking about creating a language during the 1956 Darthmouth Summer Research Project on Artificial Intelligence. The Summer Research Project was in effect an ongoing, multi-week academic conference, the very first in the field of artificial intelligence. McCarthy, then an assistant professor of Mathematics at Dartmouth, had actually coined the term “artificial intelligence” when he proposed the event. About ten or so people attended the conference for its entire duration. Among them were Allen Newell and Herbert Simon, two researchers affiliated with the RAND Corporation and Carnegie Mellon that had just designed a language called IPL.
-
-Newell and Simon had been trying to build a system capable of generating proofs in propositional calculus. They realized that it would be hard to do this while working at the level of the computer’s native instruction set, so they decided to create a language—or, as they called it, a “pseudo-code”—that would help them more naturally express the workings of their “Logic Theory Machine.” Their language, called IPL for “Information Processing Language”, was more of a high-level assembly dialect then a programming language in the sense we mean today. Newell and Simon, perhaps referring to Fortran, noted that other “pseudo-codes” then in development were “preoccupied” with representing equations in standard mathematical notation. Their language focused instead on representing sentences in propositional calculus as lists of symbolic expressions. Programs in IPL would basically leverage a series of assembly-language macros to manipulate and evaluate expressions within one or more of these lists.
-
-McCarthy thought that having algebraic expressions in a language, Fortran-style, would be useful. So he didn’t like IPL very much. But he thought that symbolic lists were a good way to model problems in artificial intelligence, particularly problems involving deduction. This was the germ of McCarthy’s desire to create an algebraic list processing language, a language that would resemble Fortran but also be able to process symbolic lists like IPL.
-
-Of course, Lisp today does not resemble Fortran. Over the next few years, McCarthy’s ideas about what an ideal list processing language should look like evolved. His ideas began to change in 1957, when he started writing routines for a chess-playing program in Fortran. The prolonged exposure to Fortran convinced McCarthy that there were several infelicities in its design, chief among them the awkward `IF` statement. McCarthy invented an alternative, the “true” conditional expression, which returns sub-expression A if the supplied test succeeds and sub-expression B if the supplied test fails and which also only evaluates the sub-expression that actually gets returned. During the summer of 1958, when McCarthy worked to design a program that could perform differentiation, he realized that his “true” conditional expression made writing recursive functions easier and more natural. The differentiation problem also prompted McCarthy to devise the maplist function, which takes another function as an argument and applies it to all the elements in a list. This was useful for differentiating sums of arbitrarily many terms.
-
-None of these things could be expressed in Fortran, so, in the fall of 1958, McCarthy set some students to work implementing Lisp. Since McCarthy was now an assistant professor at MIT, these were all MIT students. As McCarthy and his students translated his ideas into running code, they made changes that further simplified the language. The biggest change involved Lisp’s syntax. McCarthy had originally intended for the language to include something called “M-expressions,” which would be a layer of syntactic sugar that made Lisp’s syntax resemble Fortran’s. Though M-expressions could be translated to S-expressions—the basic lists enclosed by parentheses that Lisp is known for— S-expressions were really a low-level representation meant for the machine. The only problem was that McCarthy had been denoting M-expressions using square brackets, and the IBM 026 keypunch that McCarthy’s team used at MIT did not have any square bracket keys on its keyboard. So the Lisp team stuck with S-expressions, using them to represent not just lists of data but function applications too. McCarthy and his students also made a few other simplifications, including a switch to prefix notation and a memory model change that meant the language only had one real type.
-
-In 1960, McCarthy published his famous paper on Lisp called “Recursive Functions of Symbolic Expressions and Their Computation by Machine.” By that time, the language had been pared down to such a degree that McCarthy realized he had the makings of “an elegant mathematical system” and not just another programming language. He later wrote that the many simplifications that had been made to Lisp turned it “into a way of describing computable functions much neater than the Turing machines or the general recursive definitions used in recursive function theory.” In his paper, he therefore presented Lisp both as a working programming language and as a formalism for studying the behavior of recursive functions.
-
-McCarthy explained Lisp to his readers by building it up out of only a very small collection of rules. Paul Graham later retraced McCarthy’s steps, using more readable language, in his essay [“The Roots of Lisp”][6]. Graham is able to explain Lisp using only seven primitive operators, two different notations for functions, and a half-dozen higher-level functions defined in terms of the primitive operators. That Lisp can be specified by such a small sequence of basic rules no doubt contributes to its mystique. Graham has called McCarthy’s paper an attempt to “axiomatize computation.” I think that is a great way to think about Lisp’s appeal. Whereas other languages have clearly artificial constructs denoted by reserved words like `while` or `typedef` or `public static void`, Lisp’s design almost seems entailed by the very logic of computing. This quality and Lisp’s original connection to a field as esoteric as “recursive function theory” should make it no surprise that Lisp has so much prestige today.
-
-### Theory B: Machine of the Future
-
-Two decades after its creation, Lisp had become, according to the famous [Hacker’s Dictionary][7], the “mother tongue” of artificial intelligence research. Early on, Lisp spread quickly, probably because its regular syntax made implementing it on new machines relatively straightforward. Later, researchers would keep using it because of how well it handled symbolic expressions, important in an era when so much of artificial intelligence was symbolic. Lisp was used in seminal artificial intelligence projects like the [SHRDLU natural language program][8], the [Macsyma algebra system][9], and the [ACL2 logic system][10].
-
-By the mid-1970s, though, artificial intelligence researchers were running out of computer power. The PDP-10, in particular—everyone’s favorite machine for artificial intelligence work—had an 18-bit address space that increasingly was insufficient for Lisp AI programs. Many AI programs were also supposed to be interactive, and making a demanding interactive program perform well on a time-sharing system was challenging. The solution, originally proposed by Peter Deutsch at MIT, was to engineer a computer specifically designed to run Lisp programs. These Lisp machines, as I described in [my last post on Chaosnet][11], would give each user a dedicated processor optimized for Lisp. They would also eventually come with development environments written entirely in Lisp for hardcore Lisp programmers. Lisp machines, devised in an awkward moment at the tail of the minicomputer era but before the full flowering of the microcomputer revolution, were high-performance personal computers for the programming elite.
-
-For a while, it seemed as if Lisp machines would be the wave of the future. Several companies sprang into existence and raced to commercialize the technology. The most successful of these companies was called Symbolics, founded by veterans of the MIT AI Lab. Throughout the 1980s, Symbolics produced a line of computers known as the 3600 series, which were popular in the AI field and in industries requiring high-powered computing. The 3600 series computers featured large screens, bit-mapped graphics, a mouse interface, and [powerful graphics and animation software][12]. These were impressive machines that enabled impressive programs. For example, Bob Culley, who worked in robotics research and contacted me via Twitter, was able to implement and visualize a path-finding algorithm on a Symbolics 3650 in 1985. He explained to me that bit-mapped graphics and object-oriented programming (available on Lisp machines via [the Flavors extension][13]) were very new in the 1980s. Symbolics was the cutting edge.
-
-![Bob Culley's path-finding program.][14] Bob Culley’s path-finding program.
-
-As a result, Symbolics machines were outrageously expensive. The Symbolics 3600 cost $110,000 in 1983. So most people could only marvel at the power of Lisp machines and the wizardry of their Lisp-writing operators from afar. But marvel they did. Byte Magazine featured Lisp and Lisp machines several times from 1979 through to the end of the 1980s. In the August, 1979 issue, a special on Lisp, the magazine’s editor raved about the new machines being developed at MIT with “gobs of memory” and “an advanced operating system.” He thought they sounded so promising that they would make the two prior years—which saw the launch of the Apple II, the Commodore PET, and the TRS-80—look boring by comparison. A half decade later, in 1985, a Byte Magazine contributor described writing Lisp programs for the “sophisticated, superpowerful Symbolics 3670” and urged his audience to learn Lisp, claiming it was both “the language of choice for most people working in AI” and soon to be a general-purpose programming language as well.
-
-I asked Paul McJones, who has done lots of Lisp [preservation work][15] for the Computer History Museum in Mountain View, about when people first began talking about Lisp as if it were a gift from higher-dimensional beings. He said that the inherent properties of the language no doubt had a lot to do with it, but he also said that the close association between Lisp and the powerful artificial intelligence applications of the 1960s and 1970s probably contributed too. When Lisp machines became available for purchase in the 1980s, a few more people outside of places like MIT and Stanford were exposed to Lisp’s power and the legend grew. Today, Lisp machines and Symbolics are little remembered, but they helped keep the mystique of Lisp alive through to the late 1980s.
-
-### Theory C: Learn to Program
-
-In 1985, MIT professors Harold Abelson and Gerald Sussman, along with Sussman’s wife, Julie Sussman, published a textbook called Structure and Interpretation of Computer Programs. The textbook introduced readers to programming using the language Scheme, a dialect of Lisp. It was used to teach MIT’s introductory programming class for two decades. My hunch is that SICP (as the title is commonly abbreviated) about doubled Lisp’s “mystique factor.” SICP took Lisp and showed how it could be used to illustrate deep, almost philosophical concepts in the art of computer programming. Those concepts were general enough that any language could have been used, but SICP’s authors chose Lisp. As a result, Lisp’s reputation was augmented by the notoriety of this bizarre and brilliant book, which has intrigued generations of programmers (and also become [a very strange meme][16]). Lisp had always been “McCarthy’s elegant formalism”; now it was also “that language that teaches you the hidden secrets of programming.”
-
-It’s worth dwelling for a while on how weird SICP really is, because I think the book’s weirdness and Lisp’s weirdness get conflated today. The weirdness starts with the book’s cover. It depicts a wizard or alchemist approaching a table, prepared to perform some sort of sorcery. In one hand he holds a set of calipers or a compass, in the other he holds a globe inscribed with the words “eval” and “apply.” A woman opposite him gestures at the table; in the background, the Greek letter lambda floats in mid-air, radiating light.
-
-![The cover art for SICP.][17] The cover art for SICP.
-
-Honestly, what is going on here? Why does the table have animal feet? Why is the woman gesturing at the table? What is the significance of the inkwell? Are we supposed to conclude that the wizard has unlocked the hidden mysteries of the universe, and that those mysteries consist of the “eval/apply” loop and the Lambda Calculus? It would seem so. This image alone must have done an enormous amount to shape how people talk about Lisp today.
-
-But the text of the book itself is often just as weird. SICP is unlike most other computer science textbooks that you have ever read. Its authors explain in the foreword to the book that the book is not merely about how to program in Lisp—it is instead about “three foci of phenomena: the human mind, collections of computer programs, and the computer.” Later, they elaborate, describing their conviction that programming shouldn’t be considered a discipline of computer science but instead should be considered a new notation for “procedural epistemology.” Programs are a new way of structuring thought that only incidentally get fed into computers. The first chapter of the book gives a brief tour of Lisp, but most of the book after that point is about much more abstract concepts. There is a discussion of different programming paradigms, a discussion of the nature of “time” and “identity” in object-oriented systems, and at one point a discussion of how synchronization problems may arise because of fundamental constraints on communication that play a role akin to the fixed speed of light in the theory of relativity. It’s heady stuff.
-
-All this isn’t to say that the book is bad. It’s a wonderful book. It discusses important programming concepts at a higher level than anything else I have read, concepts that I had long wondered about but didn’t quite have the language to describe. It’s impressive that an introductory programming textbook can move so quickly to describing the fundamental shortfalls of object-oriented programming and the benefits of functional languages that minimize mutable state. It’s mind-blowing that this then turns into a discussion of how a stream paradigm, perhaps something like today’s [RxJS][18], can give you the best of both worlds. SICP distills the essence of high-level program design in a way reminiscent of McCarthy’s original Lisp paper. The first thing you want to do after reading it is get your programmer friends to read it; if they look it up, see the cover, but then don’t read it, all they take away is that some mysterious, fundamental “eval/apply” thing gives magicians special powers over tables with animal feet. I would be deeply impressed in their shoes too.
-
-But maybe SICP’s most important contribution was to elevate Lisp from curious oddity to pedagogical must-have. Well before SICP, people told each other to learn Lisp as a way of getting better at programming. The 1979 Lisp issue of Byte Magazine is testament to that fact. The same editor that raved about MIT’s new Lisp machines also explained that the language was worth learning because it “represents a different point of view from which to analyze problems.” But SICP presented Lisp as more than just a foil for other languages; SICP used Lisp as an introductory language, implicitly making the argument that Lisp is the best language in which to grasp the fundamentals of computer programming. When programmers today tell each other to try Lisp before they die, they arguably do so in large part because of SICP. After all, the language [Brainfuck][19] presumably offers “a different point of view from which to analyze problems.” But people learn Lisp instead because they know that, for twenty years or so, the Lisp point of view was thought to be so useful that MIT taught Lisp to undergraduates before anything else.
-
-### Lisp Comes Back
-
-The same year that SICP was released, Bjarne Stroustrup published the first edition of The C++ Programming Language, which brought object-oriented programming to the masses. A few years later, the market for Lisp machines collapsed and the AI winter began. For the next decade and change, C++ and then Java would be the languages of the future and Lisp would be left out in the cold.
-
-It is of course impossible to pinpoint when people started getting excited about Lisp again. But that may have happened after Paul Graham, Y-Combinator co-founder and Hacker News creator, published a series of influential essays pushing Lisp as the best language for startups. In his essay [“Beating the Averages,”][20] for example, Graham argued that Lisp macros simply made Lisp more powerful than other languages. He claimed that using Lisp at his own startup, Viaweb, helped him develop features faster than his competitors were able to. [Some programmers at least][21] were persuaded. But the vast majority of programmers did not switch to Lisp.
-
-What happened instead is that more and more Lisp-y features have been incorporated into everyone’s favorite programming languages. Python got list comprehensions. C# got Linq. Ruby got… well, Ruby [is a Lisp][22]. As Graham noted even back in 2001, “the default language, embodied in a succession of popular languages, has gradually evolved toward Lisp.” Though other languages are gradually becoming like Lisp, Lisp itself somehow manages to retain its special reputation as that mysterious language that few people understand but everybody should learn. In 1980, on the occasion of Lisp’s 20th anniversary, McCarthy wrote that Lisp had survived as long as it had because it occupied “some kind of approximate local optimum in the space of programming languages.” That understates Lisp’s real influence. Lisp hasn’t survived for over half a century because programmers have begrudgingly conceded that it is the best tool for the job decade after decade; in fact, it has survived even though most programmers do not use it at all. Thanks to its origins and use in artificial intelligence research and perhaps also the legacy of SICP, Lisp continues to fascinate people. Until we can imagine God creating the world with some newer language, Lisp isn’t going anywhere.
-
-If you enjoyed this post, more like it come out every two weeks! Follow [@TwoBitHistory][23] on Twitter or subscribe to the [RSS feed][24] to make sure you know when a new post is out.
-
-Previously on TwoBitHistory…
-
-> This week's post: A look at Chaosnet, the network that gave us the "CH" DNS class.
->
-> — TwoBitHistory (@TwoBitHistory) [September 30, 2018][25]
-
---------------------------------------------------------------------------------
-
-via: https://twobithistory.org/2018/10/14/lisp.html
-
-作者:[Two-Bit History][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://twobithistory.org
-[b]: https://github.com/lujun9972
-[1]: https://xkcd.com/224/
-[2]: https://xkcd.com/297/
-[3]: https://www.gnu.org/fun/jokes/eternal-flame.en.html
-[4]: https://www.reddit.com/r/ProgrammerHumor/comments/5c14o6/xkcd_lisp/d9szjnc/
-[5]: https://twobithistory.org/images/byte_lisp.jpg
-[6]: http://languagelog.ldc.upenn.edu/myl/llog/jmc.pdf
-[7]: https://en.wikipedia.org/wiki/Jargon_File
-[8]: https://hci.stanford.edu/winograd/shrdlu/
-[9]: https://en.wikipedia.org/wiki/Macsyma
-[10]: https://en.wikipedia.org/wiki/ACL2
-[11]: https://twobithistory.org/2018/09/30/chaosnet.html
-[12]: https://youtu.be/gV5obrYaogU?t=201
-[13]: https://en.wikipedia.org/wiki/Flavors_(programming_language)
-[14]: https://twobithistory.org/images/symbolics.jpg
-[15]: http://www.softwarepreservation.org/projects/LISP/
-[16]: https://knowyourmeme.com/forums/meme-research/topics/47038-structure-and-interpretation-of-computer-programs-hugeass-image-dump-for-evidence
-[17]: https://twobithistory.org/images/sicp.jpg
-[18]: https://rxjs-dev.firebaseapp.com/
-[19]: https://en.wikipedia.org/wiki/Brainfuck
-[20]: http://www.paulgraham.com/avg.html
-[21]: https://web.archive.org/web/20061004035628/http://wiki.alu.org/Chris-Perkins
-[22]: http://www.randomhacks.net/2005/12/03/why-ruby-is-an-acceptable-lisp/
-[23]: https://twitter.com/TwoBitHistory
-[24]: https://twobithistory.org/feed.xml
-[25]: https://twitter.com/TwoBitHistory/status/1046437600658169856?ref_src=twsrc%5Etfw
diff --git a/sources/tech/20181018 The case for open source classifiers in AI algorithms.md b/sources/talk/20181018 The case for open source classifiers in AI algorithms.md
similarity index 100%
rename from sources/tech/20181018 The case for open source classifiers in AI algorithms.md
rename to sources/talk/20181018 The case for open source classifiers in AI algorithms.md
diff --git a/sources/tech/20181019 To BeOS or not to BeOS, that is the Haiku.md b/sources/talk/20181019 To BeOS or not to BeOS, that is the Haiku.md
similarity index 100%
rename from sources/tech/20181019 To BeOS or not to BeOS, that is the Haiku.md
rename to sources/talk/20181019 To BeOS or not to BeOS, that is the Haiku.md
diff --git a/sources/talk/20181025 What breaks our systems- A taxonomy of black swans.md b/sources/talk/20181025 What breaks our systems- A taxonomy of black swans.md
deleted file mode 100644
index 376809b08b..0000000000
--- a/sources/talk/20181025 What breaks our systems- A taxonomy of black swans.md
+++ /dev/null
@@ -1,134 +0,0 @@
-translating by belitex
-
-What breaks our systems: A taxonomy of black swans
-======
-
-Find and fix outlier events that create issues before they trigger severe production problems.
-
-
-
-Black swans are a metaphor for outlier events that are severe in impact (like the 2008 financial crash). In production systems, these are the incidents that trigger problems that you didn't know you had, cause major visible impact, and can't be fixed quickly and easily by a rollback or some other standard response from your on-call playbook. They are the events you tell new engineers about years after the fact.
-
-Black swans, by definition, can't be predicted, but sometimes there are patterns we can find and use to create defenses against categories of related problems.
-
-For example, a large proportion of failures are a direct result of changes (code, environment, or configuration). Each bug triggered in this way is distinctive and unpredictable, but the common practice of canarying all changes is somewhat effective against this class of problems, and automated rollbacks have become a standard mitigation.
-
-As our profession continues to mature, other kinds of problems are becoming well-understood classes of hazards with generalized prevention strategies.
-
-### Black swans observed in the wild
-
-All technology organizations have production problems, but not all of them share their analyses. The organizations that publicly discuss incidents are doing us all a service. The following incidents describe one class of a problem and are by no means isolated instances. We all have black swans lurking in our systems; it's just some of us don't know it yet.
-
-#### Hitting limits
-
-Running headlong into any sort of limit can produce very severe incidents. A canonical example of this was [Instapaper's outage in February 2017][1] . I challenge any engineer who has carried a pager to read the outage report without a chill running up their spine. Instapaper's production database was on a filesystem that, unknown to the team running the service, had a 2TB limit. With no warning, it stopped accepting writes. Full recovery took days and required migrating its database.
-
-Limits can strike in various ways. Sentry hit [limits on maximum transaction IDs in Postgres][2] . Platform.sh hit [size limits on a pipe buffer][3] . SparkPost [triggered AWS's DDoS protection][4] . Foursquare hit a performance cliff when one of its [datastores ran out of RAM][5]
-
-One way to get advance knowledge of system limits is to test periodically. Good load testing (on a production replica) ought to involve write transactions and should involve growing each datastore beyond its current production size. It's easy to forget to test things that aren't your main datastores (such as Zookeeper). If you hit limits during testing, you have time to fix the problems. Given that resolution of limits-related issues can involve major changes (like splitting a datastore), time is invaluable.
-
-When it comes to cloud services, if your service generates unusual loads or uses less widely used products or features (such as older or newer ones), you may be more at risk of hitting limits. It's worth load testing these, too. But warn your cloud provider first.
-
-Finally, where limits are known, add monitoring (with associated documentation) so you will know when your systems are approaching those ceilings. Don't rely on people still being around to remember.
-
-#### Spreading slowness
-
-> "The world is much more correlated than we give credit to. And so we see more of what Nassim Taleb calls 'black swan events'—rare events happen more often than they should because the world is more correlated."
-> —[Richard Thaler][6]
-
-HostedGraphite's postmortem on how an [AWS outage took down its load balancers][7] (which are not hosted on AWS) is a good example of just how much correlation exists in distributed computing systems. In this case, the load-balancer connection pools were saturated by slow connections from customers that were hosted in AWS. The same kinds of saturation can happen with application threads, locks, and database connections—any kind of resource monopolized by slow operations.
-
-HostedGraphite's incident is an example of externally imposed slowness, but often slowness can result from saturation somewhere in your own system creating a cascade and causing other parts of your system to slow down. An [incident at Spotify][8] demonstrates such spread—the streaming service's frontends became unhealthy due to saturation in a different microservice. Enforcing deadlines for all requests, as well as limiting the length of request queues, can prevent such spread. Your service will serve at least some traffic, and recovery will be easier because fewer parts of your system will be broken.
-
-Retries should be limited with exponential backoff and some jitter. An outage at Square, in which its [Redis datastore became overloaded][9] due to a piece of code that retried failed transactions up to 500 times with no backoff, demonstrates the potential severity of excessive retries. The [Circuit Breaker][10] design pattern can be helpful here, too.
-
-Dashboards should be designed to clearly show [utilization, saturation, and errors][11] for all resources so problems can be found quickly.
-
-#### Thundering herds
-
-Often, failure scenarios arise when a system is under unusually heavy load. This can arise organically from users, but often it arises from systems. A surge of cron jobs that starts at midnight is a venerable example. Mobile clients can also be a source of coordinated demand if they are programmed to fetch updates at the same time (of course, it is much better to jitter such requests).
-
-Events occurring at pre-configured times aren't the only source of thundering herds. Slack experienced [multiple outages][12] over a short time due to large numbers of clients being disconnected and immediately reconnecting, causing large spikes of load. CircleCI saw a [severe outage][13] when a GitLab outage ended, leading to a surge of builds queued in its database, which became saturated and very slow.
-
-Almost any service can be the target of a thundering herd. Planning for such eventualities—and testing that your plan works as intended—is therefore a must. Client backoff and [load shedding][14] are often core to such approaches.
-
-If your systems must constantly ingest data that can't be dropped, it's key to have a scalable way to buffer this data in a queue for later processing.
-
-#### Automation systems are complex systems
-
-> "Complex systems are intrinsically hazardous systems."
-> —[Richard Cook, MD][15]
-
-If your systems must constantly ingest data that can't be dropped, it's key to have a scalable way to buffer this data in a queue for later processing.
-
-The trend for the past several years has been strongly towards more automation of software operations. Automation of anything that can reduce your system's capacity (e.g., erasing disks, decommissioning devices, taking down serving jobs) needs to be done with care. Accidents (due to bugs or incorrect invocations) with this kind of automation can take down your system very efficiently, potentially in ways that are hard to recover from.
-
-The trend for the past several years has been strongly towards more automation of software operations. Automation of anything that can reduce your system's capacity (e.g., erasing disks, decommissioning devices, taking down serving jobs) needs to be done with care. Accidents (due to bugs or incorrect invocations) with this kind of automation can take down your system very efficiently, potentially in ways that are hard to recover from.
-
-Christina Schulman and Etienne Perot of Google describe some examples in their talk [Help Protect Your Data Centers with Safety Constraints][16]. One incident sent Google's entire in-house content delivery network (CDN) to disk-erase.
-
-Schulman and Perot suggest using a central service to manage constraints, which limits the pace at which destructive automation can operate, and being aware of system conditions (for example, avoiding destructive operations if the service has recently had an alert).
-
-Automation systems can also cause havoc when they interact with operators (or with other automated systems). [Reddit][17] experienced a major outage when its automation restarted a system that operators had stopped for maintenance. Once you have multiple automation systems, their potential interactions become extremely complex and impossible to predict.
-
-It will help to deal with the inevitable surprises if all this automation writes logs to an easily searchable, central place. Automation systems should always have a mechanism to allow them to be quickly turned off (fully or only for a subset of operations or targets).
-
-### Defense against the dark swans
-
-These are not the only black swans that might be waiting to strike your systems. There are many other kinds of severe problem that can be avoided using techniques such as canarying, load testing, chaos engineering, disaster testing, and fuzz testing—and of course designing for redundancy and resiliency. Even with all that, at some point your system will fail.
-
-To ensure your organization can respond effectively, make sure your key technical staff and your leadership have a way to coordinate during an outage. For example, one unpleasant issue you might have to deal with is a complete outage of your network. It's important to have a fail-safe communications channel completely independent of your own infrastructure and its dependencies. For instance, if you run on AWS, using a service that also runs on AWS as your fail-safe communication method is not a good idea. A phone bridge or an IRC server that runs somewhere separate from your main systems is good. Make sure everyone knows what the communications platform is and practices using it.
-
-Another principle is to ensure that your monitoring and your operational tools rely on your production systems as little as possible. Separate your control and your data planes so you can make changes even when systems are not healthy. Don't use a single message queue for both data processing and config changes or monitoring, for example—use separate instances. In [SparkPost: The Day the DNS Died][4], Jeremy Blosser presents an example where critical tools relied on the production DNS setup, which failed.
-
-### The psychology of battling the black swan
-
-To ensure your organization can respond effectively, make sure your key technical staff and your leadership have a way to coordinate during an outage.
-
-Dealing with major incidents in production can be stressful. It really helps to have a structured incident-management process in place for these situations. Many technology organizations (
-
-Dealing with major incidents in production can be stressful. It really helps to have a structured incident-management process in place for these situations. Many technology organizations ( [including Google][18] ) successfully use a version of FEMA's Incident Command System. There should be a clear way for any on-call individual to call for assistance in the event of a major problem they can't resolve alone.
-
-For long-running incidents, it's important to make sure people don't work for unreasonable lengths of time and get breaks to eat and sleep (uninterrupted by a pager). It's easy for exhausted engineers to make a mistake or overlook something that might resolve the incident faster.
-
-### Learn more
-
-There are many other things that could be said about black (or formerly black) swans and strategies for dealing with them. If you'd like to learn more, I highly recommend these two books dealing with resilience and stability in production: Susan Fowler's [Production-Ready Microservices][19] and Michael T. Nygard's [Release It!][20].
-
-Laura Nolan will present [What Breaks Our Systems: A Taxonomy of Black Swans][21] at [LISA18][22], October 29-31 in Nashville, Tennessee, USA.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/10/taxonomy-black-swans
-
-作者:[Laura Nolan][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://opensource.com/users/lauranolan
-[b]: https://github.com/lujun9972
-[1]: https://medium.com/making-instapaper/instapaper-outage-cause-recovery-3c32a7e9cc5f
-[2]: https://blog.sentry.io/2015/07/23/transaction-id-wraparound-in-postgres.html
-[3]: https://medium.com/@florian_7764/technical-post-mortem-of-the-august-incident-82ab4c3d6547
-[4]: https://www.usenix.org/conference/srecon18americas/presentation/blosser
-[5]: https://groups.google.com/forum/#!topic/mongodb-user/UoqU8ofp134
-[6]: https://en.wikipedia.org/wiki/Richard_Thaler
-[7]: https://blog.hostedgraphite.com/2018/03/01/spooky-action-at-a-distance-how-an-aws-outage-ate-our-load-balancer/
-[8]: https://labs.spotify.com/2013/06/04/incident-management-at-spotify/
-[9]: https://medium.com/square-corner-blog/incident-summary-2017-03-16-2f65be39297
-[10]: https://en.wikipedia.org/wiki/Circuit_breaker_design_pattern
-[11]: http://www.brendangregg.com/usemethod.html
-[12]: https://slackhq.com/this-was-not-normal-really
-[13]: https://circleci.statuspage.io/incidents/hr0mm9xmm3x6
-[14]: https://www.youtube.com/watch?v=XNEIkivvaV4
-[15]: https://web.mit.edu/2.75/resources/random/How%20Complex%20Systems%20Fail.pdf
-[16]: https://www.usenix.org/conference/srecon18americas/presentation/schulman
-[17]: https://www.reddit.com/r/announcements/comments/4y0m56/why_reddit_was_down_on_aug_11/
-[18]: https://landing.google.com/sre/book/chapters/managing-incidents.html
-[19]: http://shop.oreilly.com/product/0636920053675.do
-[20]: https://www.oreilly.com/library/view/release-it/9781680500264/
-[21]: https://www.usenix.org/conference/lisa18/presentation/nolan
-[22]: https://www.usenix.org/conference/lisa18
diff --git a/sources/talk/20181026 Directing traffic- Demystifying internet-scale load balancing.md b/sources/talk/20181026 Directing traffic- Demystifying internet-scale load balancing.md
deleted file mode 100644
index 6ebcba69e3..0000000000
--- a/sources/talk/20181026 Directing traffic- Demystifying internet-scale load balancing.md
+++ /dev/null
@@ -1,108 +0,0 @@
-Directing traffic: Demystifying internet-scale load balancing
-======
-Common techniques used to balance network traffic come with advantages and trade-offs.
-
-Large, multi-site, internet-facing systems, including content-delivery networks (CDNs) and cloud providers, have several options for balancing traffic coming onto their networks. In this article, we'll describe common traffic-balancing designs, including techniques and trade-offs.
-
-If you were an early cloud computing provider, you could take a single customer web server, assign it an IP address, configure a domain name system (DNS) record to associate it with a human-readable name, and advertise the IP address via the border gateway protocol (BGP), the standard way of exchanging routing information between networks.
-
-It wasn't load balancing per se, but there probably was load distribution across redundant network paths and networking technologies to increase availability by routing around unavailable infrastructure (giving rise to phenomena like [asymmetric routing][1]).
-
-### Doing simple DNS load balancing
-
-As traffic to your customer's service grows, the business' owners want higher availability. You add a second web server with its own publicly accessible IP address and update the DNS record to direct users to both web servers (hopefully somewhat evenly). This is OK for a while until one web server unexpectedly goes offline. Assuming you detect the failure quickly, you can update the DNS configuration (either manually or with software) to stop referencing the broken server.
-
-Unfortunately, because DNS records are cached, around 50% of requests to the service will likely fail until the record expires from the client caches and those of other nameservers in the DNS hierarchy. DNS records generally have a time to live (TTL) of several minutes or more, so this can create a significant impact on your system's availability.
-
-Worse, some proportion of clients ignore TTL entirely, so some requests will be directed to your offline web server for some time. Setting very short DNS TTLs is not a great idea either; it means higher load on DNS services plus increased latency because clients will have to perform DNS lookups more often. If your DNS service is unavailable for any reason, access to your service will degrade more quickly with a shorter TTL because fewer clients will have your service's IP address cached.
-
-### Adding network load balancing
-
-To work around this problem, you can add a redundant pair of [Layer 4][2] (L4) network load balancers that serve the same virtual IP (VIP) address. They could be hardware appliances or software balancers like [HAProxy][3]. This means the DNS record points only at the VIP and no longer does load balancing.
-
-![Layer 4 load balancers balance connections across webservers.][5]
-
-Layer 4 load balancers balance connections from users across two webservers.
-
-The L4 balancers load-balance traffic from the internet to the backend servers. This is generally done based on a hash (a mathematical function) of each IP packet's 5-tuple: the source and destination IP address and port plus the protocol (such as TCP or UDP). This is fast and efficient (and still maintains essential properties of TCP) and doesn't require the balancers to maintain state per connection. (For more information, [Google's paper on Maglev][6] discusses implementation of a software L4 balancer in significant detail.)
-
-The L4 balancers can do health-checking and send traffic only to web servers that pass checks. Unlike in DNS balancing, there is minimal delay in redirecting traffic to another web server if one crashes, although existing connections will be reset.
-
-L4 balancers can do weighted balancing, dealing with backends with varying capacity. L4 balancing gives significant power and flexibility to operators while being relatively inexpensive in terms of computing power.
-
-### Going multi-site
-
-The system continues to grow. Your customers want to stay up even if your data center goes down. You build a new data center with its own set of service backends and another cluster of L4 balancers, which serve the same VIP as before. The DNS setup doesn't change.
-
-The edge routers in both sites advertise address space, including the service VIP. Requests sent to that VIP can reach either site, depending on how each network between the end user and the system is connected and how their routing policies are configured. This is known as anycast. Most of the time, this works fine. If one site isn't operating, you can stop advertising the VIP for the service via BGP, and traffic will quickly move to the alternative site.
-
-![Serving from multiple sites using anycast][8]
-
-Serving from multiple sites using anycast.
-
-This setup has several problems. Its worst failing is that you can't control where traffic flows or limit how much traffic is sent to a given site. You also don't have an explicit way to route users to the nearest site (in terms of network latency), but the network protocols and configurations that determine the routes should, in most cases, route requests to the nearest site.
-
-### Controlling inbound requests in a multi-site system
-
-To maintain stability, you need to be able to control how much traffic is served to each site. You can get that control by assigning a different VIP to each site and use DNS to balance them using simple or weighted [round-robin][9].
-
-![Serving from multiple sites using a primary VIP][11]
-
-Serving from multiple sites using a primary VIP per site, backed up by secondary sites, with geo-aware DNS.
-
-You now have two new problems.
-
-First, using DNS balancing means you have cached records, which is not good if you need to redirect traffic quickly.
-
-Second, whenever users do a fresh DNS lookup, a VIP connects them to the service at an arbitrary site, which may not be the closest site to them. If your service runs on widely separated sites, individual users will experience wide variations in your system's responsiveness, depending upon the network latency between them and the instance of your service they are using.
-
-You can solve the first problem by having each site constantly advertise and serve the VIPs for all the other sites (and consequently the VIP for any faulty site). Networking tricks (such as advertising less-specific routes from the backups) can ensure that VIP's primary site is preferred, as long as it is available. This is done via BGP, so we should see traffic move within a minute or two of updating BGP.
-
-There isn't an elegant solution to the problem of serving users from sites other than the nearest healthy site with capacity. Many large internet-facing services use DNS services that attempt to return different results to users in different locations, with some degree of success. This approach is always somewhat [complex and error-prone][12], given that internet-addressing schemes are not organized geographically, blocks of addresses can change locations (e.g., when a company reorganizes its network), and many end users can be served from a single caching nameserver.
-
-### Adding Layer 7 load balancing
-
-Over time, your customers begin to ask for more advanced features.
-
-While L4 load balancers can efficiently distribute load among multiple web servers, they operate only on source and destination IP addresses, protocol, and ports. They don't know anything about the content of a request, so you can't implement many advanced features in an L4 balancer. Layer 7 (L7) load balancers are aware of the structure and contents of requests and can do far more.
-
-Some things that can be implemented in L7 load balancers are caching, rate limiting, fault injection, and cost-aware load balancing (some requests require much more server time to process).
-
-They can also balance based on a request's attributes (e.g., HTTP cookies), terminate SSL connections, and help defend against application layer denial-of-service (DoS) attacks. The downside of L7 balancers at scale is cost—they do more computation to process requests, and each active request consumes some system resources. Running L4 balancers in front of one or more pools of L7 balancers can help with scaling.
-
-### Conclusion
-
-Load balancing is a difficult and complex problem. In addition to the strategies described in this article, there are different [load-balancing algorithms][13], high-availability techniques used to implement load balancers, client load-balancing techniques, and the recent rise of service meshes.
-
-Core load-balancing patterns have evolved alongside the growth of cloud computing, and they will continue to improve as large web services work to improve the control and flexibility that load-balancing techniques offer./p>
-
-Laura Nolan and Murali Suriar will present [Keeping the Balance: Load Balancing Demystified][14] at [LISA18][15], October 29-31 in Nashville, Tennessee, USA.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/10/internet-scale-load-balancing
-
-作者:[Laura Nolan][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://opensource.com/users/lauranolan
-[b]: https://github.com/lujun9972
-[1]: https://www.noction.com/blog/bgp-and-asymmetric-routing
-[2]: https://en.wikipedia.org/wiki/Transport_layer
-[3]: https://www.haproxy.com/blog/failover-and-worst-case-management-with-haproxy/
-[4]: /file/412596
-[5]: https://opensource.com/sites/default/files/uploads/loadbalancing1_l4-network-loadbalancing.png (Layer 4 load balancers balance connections across webservers.)
-[6]: https://ai.google/research/pubs/pub44824
-[7]: /file/412601
-[8]: https://opensource.com/sites/default/files/uploads/loadbalancing2_going-multisite.png (Serving from multiple sites using anycast)
-[9]: https://en.wikipedia.org/wiki/Round-robin_scheduling
-[10]: /file/412606
-[11]: https://opensource.com/sites/default/files/uploads/loadbalancing3_controlling-inbound-requests.png (Serving from multiple sites using a primary VIP)
-[12]: https://landing.google.com/sre/book/chapters/load-balancing-frontend.html
-[13]: https://medium.com/netflix-techblog/netflix-edge-load-balancing-695308b5548c
-[14]: https://www.usenix.org/conference/lisa18/presentation/suriar
-[15]: https://www.usenix.org/conference/lisa18
diff --git a/sources/talk/20181029 How I organize my knowledge as a Software Engineer.md b/sources/talk/20181029 How I organize my knowledge as a Software Engineer.md
new file mode 100644
index 0000000000..c11e1c9c38
--- /dev/null
+++ b/sources/talk/20181029 How I organize my knowledge as a Software Engineer.md
@@ -0,0 +1,119 @@
+@flowsnow is translating
+
+
+How I organize my knowledge as a Software Engineer
+============================================================
+
+
+Software Development and Technology in general are areas that evolve at a very fast pace and continuous learning is essential.
+Some minutes navigating in the internet, in places like Twitter, Medium, RSS feeds, Hacker News and other specialized sites and communities, are enough to find lots of great pieces of information from articles, case studies, tutorials, code snippets, new applications and much more.
+
+Saving and organizing all that information can be a daunting task. In this post I will present some tools tools that I use to do it.
+
+One of the points I consider very important regarding knowledge management is to avoid lock-in in a particular platform. All the tools I use, allow to export your data in standard formats like Markdown and HTML.
+
+Note that, My workflow is not perfect and I am constantly searching for new tools and ways to optimize it. Also everyone is different, so what works for me might not working well for you.
+
+### Knowledge base with NotionHQ
+
+For me, the fundamental piece of Knowledge management is to have some kind of personal Knowledge base / wiki. A place where you can save links, bookmarks, notes etc in an organized manner.
+
+I use [NotionHQ][7] for that matter. I use it to keep notes on various topics, having lists of resources like great libraries or tutorials grouped by programming language, bookmarking interesting blog posts and tutorials, and much more, not only related to software development but also my personal life.
+
+What I really like about Notion, is how simple it is to create new content. You write it using Markdown and it is organized as tree.
+
+Here is my top level pages of my "Development" workspace:
+
+ [][8]
+
+Notion has some nice other features like integrated spreadsheets / databases and Task boards.
+
+You will need to subscribe to paid Personal Plan, if you want to use Notion seriously as the free plan is somewhat limited. I think its worth the price. Notion allows to export your entire workspace to Markdown files. The export has some important problems, like loosing the page hierarchy, but hope Notion Team can improve that.
+
+As a free alternative I would probably use [VuePress][9] or [GitBook][10] to host my own.
+
+### Save interesting articles with Pocket
+
+[Pocket][11] is one of my favorite applications ever! With Pocket you can create a reading list of articles from the Internet.
+Every time I see an article that looks interesting, I save it to Pocket using its Chrome Extension. Later on, I will read it and If I found it useful enough, I will use the "Archive" function of Pocket to permanently save that article and clean up my Pocket inbox.
+
+I try to keep the Reading list small enough and keep archiving information that I have dealt with. Pocket allows you to tag articles which will make it simpler to search articles for a particular topic later in time.
+
+You can also save a copy of the article in Pocket servers in case of the original site disappears, but you will need Pocket Premium for that.
+
+Pocket also have a "Discover" feature which suggests similar articles based on the articles you have saved. This is a great way to find new content to read.
+
+### Snippet Management with SnippetStore
+
+From GitHub, to Stack Overflow answers, to blog posts, its common to find some nice code snippets that you want to save for later. It could be some nice algorithm implementation, an useful script or an example of how to do X in Y language.
+
+I tried many apps from simple GitHub Gists to [Boostnote][12] until I discovered [SnippetStore][13].
+
+SnippetStore is an open source snippet management app. What distinguish SnippetStore from others is its simplicity. You can organize snippets by Language or Tags and you can have multi file snippets. Its not perfect but it gets the job done. Boostnote, for example has more features, but I prefer the simpler way of organizing content of SnippetStore.
+
+For abbreviations and snippets that I use on a daily basis, I prefer to use my Editor / IDE snippets feature as it is more convenient to use. I use SnippetStore more like a reference of coding examples.
+
+[Cacher][14] is also an interesting alternative, since it has integrations with many editors, have a cli tool and uses GitHub Gists as backend, but 6$/month for its pro plan, its too much IMO.
+
+### Managing cheat sheets with DevHints
+
+[Devhints][15] is a collection of cheat sheets created by Rico Sta. Cruz. Its open source and powered by Jekyll, one of the most popular static site generator.
+
+The cheat sheets are written in Markdown with some extra formatting goodies like support for columns.
+
+I really like the looks of the interface and being Markdown makes in incredibly easy to add new content and keep it updated and in version control, unlike cheat sheets in PDF or Image format, that you can find on sites like [Cheatography][16].
+
+As it is open source I have created my own fork, removed some cheat sheets that I dont need and add some more.
+
+I use cheat sheets as reference of how to use some library or programming language or to remember some commands. Its very handy to have a single page, with all the basic syntax of a specific programming language for example.
+
+I am still experimenting with this but its working great so far.
+
+### Diigo
+
+[Diigo][17] allows you to Annotate and Highlight parts of websites. I use it to annotate important information when studying new topics or to save particular paragraphs from articles, Stack Overflow answers or inspirational quotes from Twitter! ;)
+
+* * *
+
+And thats it. There might be some overlap in terms of functionality in some of the tools, but like I said in the beginning, this is an always evolving workflow, as I am always experimenting and searching for ways to improve and be more productive.
+
+What about you? How to you organize your Knowledge?. Please feel free to comment below.
+
+Thank you for reading.
+
+------------------------------------------------------------------------
+
+作者简介:
+
+Bruno Paz
+Web Engineer. Expert in #PHP and @Symfony Framework. Enthusiast about new technologies. Sports and @FCPorto fan!
+
+--------------------------------------------------------------------------------
+
+via: https://dev.to/brpaz/how-do-i-organize-my-knowledge-as-a-software-engineer-4387
+
+作者:[ Bruno Paz][a]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+选题:[oska874](https://github.com/oska874)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:http://brunopaz.net/
+[1]:https://dev.to/brpaz
+[2]:http://twitter.com/brunopaz88
+[3]:http://github.com/brpaz
+[4]:https://dev.to/t/knowledge
+[5]:https://dev.to/t/learning
+[6]:https://dev.to/t/development
+[7]:https://www.notion.so/
+[8]:https://res.cloudinary.com/practicaldev/image/fetch/s--uMbaRUtu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://i.imgur.com/kRnuvMV.png
+[9]:https://vuepress.vuejs.org/
+[10]:https://www.gitbook.com/?t=1
+[11]:https://getpocket.com/
+[12]:https://boostnote.io/
+[13]:https://github.com/ZeroX-DG/SnippetStore
+[14]:https://www.cacher.io/
+[15]:https://devhints.io/
+[16]:https://cheatography.com/
+[17]:https://www.diigo.com/index
diff --git a/sources/talk/20181107 5 signs you are doing continuous testing wrong - Opensource.com.md b/sources/talk/20181107 5 signs you are doing continuous testing wrong - Opensource.com.md
new file mode 100644
index 0000000000..03793b78ba
--- /dev/null
+++ b/sources/talk/20181107 5 signs you are doing continuous testing wrong - Opensource.com.md
@@ -0,0 +1,184 @@
+5 signs you are doing continuous testing wrong | Opensource.com
+======
+Avoid these common test automation mistakes in the era of DevOps and Agile.
+
+
+In the last few years, many companies have made large investments to automate every step of deploying features in production. Test automation has been recognized as a key enabler:
+
+> “We found that Test Automation is the biggest contributor to continuous delivery.” – [2017 State of DevOps report][1]
+
+Suppose you started adopting agile and DevOps practices to speed up your time to market and put new features in the hands of customers as soon as possible. You implemented continuous testing practices, but you’re facing the challenge of scalability: Implementing test automation at all system levels for code bases that contain tens of millions of lines of code involves many teams of developers and testers. And to add even more complexity, you need to support numerous browsers, mobile devices, and operating systems.
+
+Despite your commitment and resources expenditure, the result is likely an automated test suite with high maintenance costs and long execution times. Worse, your teams don't trust it.
+
+Here are five common test automation mistakes, and how to mitigate them using (in some cases) open source tools.
+
+### 1\. Siloed automation teams
+
+In medium and large IT projects with hundreds or even thousands of engineers, the most common cause of unmaintainable and expensive automated tests is keeping test teams separate from the development teams that deliver features.
+
+This also happens in organizations that follow agile practices where analysts, developers, and testers work together on feature acceptance criteria and test cases. In these agile organizations, automated tests are often partially or fully managed by engineers outside the scrum teams. Inefficient communication can quickly become a bottleneck, especially when teams are geographically distributed, if you want to evolve the automated test suite over time.
+
+Furthermore, when automated acceptance tests are written without developer involvement, they tend to be tightly coupled to the UI and thus brittle and badly factored, because the most testers don’t have insight into the UI’s underlying design and lack the skills to create abstraction layers or run acceptance tests against a public API.
+
+A simple suggestion is to split your siloed automation teams and include test engineers directly in scrum teams where feature discussion and implementation happen, and the impacts on test scripts can be immediately discovered and fixed. This is certainly a good idea, but it is not the real point. Better yet is to make the entire scrum team responsible for automated tests. Product owners, developers, and testers must then work together to refine feature acceptance criteria, create test cases, and prioritize them for automation.
+
+When different actors, inside or outside the development team, are involved in running automated test suites, one practice that levels up the overall collaborative process is [BDD][2], or behavior-driven development. It helps create business requirements that can be understood by the whole team and contributes to having a single source of truth for automated tests. Open source tools like [Cucumber][3], [JBehave][4], and [Gauge][5] can help you implement BDD and keep test case specifications and test scripts automatically synchronized. Such tools let you create concrete examples that illustrate business rules and acceptance criteria through the use of a simple text file containing Given-When-Then scenarios. They are used as executable software specifications to automatically verify that the software behaves as intended.
+
+### 2\. Most of your automated suite is made by user interface tests
+
+You should already know that user interface automated tests are brittle and even small changes will immediately break all the tests referring to a particular changed GUI element. This is one of the main reasons technical/business stakeholders perceive automated tests as expensive to maintain. Record-and-playback tools such as [SeleniumRecorder][6], used to generate GUI automatic tests, are tightly coupled to the GUI and therefore brittle. These tools can be used in the first stage of creating an automatic test, but a second optimization stage is required to provide a layer of abstraction that reduces the coupling between the acceptance tests and the GUI of the system under test. Design patterns such as [PageObject][7] can be used for this purpose.
+
+However, if your automated test strategy is focused only on user interfaces, it will quickly become a bottleneck as it is resource-intensive, takes a long time to execute, and it is generally hard to fix. Indeed, resolving UI test failure may require you to go through all system levels to discover the root cause.
+
+A better approach is to prioritize development of automated tests at the right level to balance the costs of maintaining them while trying to discover bugs in the early stages of the software [deployment pipeline][8] (a key pattern introduced in continuous delivery).
+
+
+
+As suggested by the [agile test pyramid][9] shown above, the vast majority of automated tests should be comprised of unit tests (both back- and front-end level). The most important property of unit tests is that they should be very fast to execute (e.g., 5 to 10 minutes).
+
+The service layer (or component tests) allows for testing business logic at the API or service level, where you're not encumbered by the user interface (UI). The higher the level, the slower and more brittle testing becomes.
+
+Typically unit tests are run at every developer commit, and the build process is stopped in the case of a test failure or if the test coverage is under a predefined threshold (e.g., when less than 80% of code lines are covered by unit tests). Once the build passes, it is deployed in a stage environment, and acceptance tests are executed. Any build that passes acceptance tests is then typically made available for manual and integration testing.
+
+Unit tests are an essential part of any automated test strategy, but they usually do not provide a high enough level of confidence that the application can be released. The objective of acceptance tests at service and UI level is to prove that your application does what the customer wants it to, not that it works the way its programmers think it should. Unit tests can sometimes share this focus, but not always.
+
+To ensure that the application provides value to end users while balancing test suite costs and value, you must automate both the service/component and UI acceptance tests with the agile test pyramid in mind.
+
+Read more about test types, levels, and tools in this comprehensive [article][10] from ThoughtWorks.
+
+### 3\. External systems are integrated too early in your deployment pipeline
+
+Integration with external systems is a common source of problems, and it can be difficult to get right. This implies that it is important to test such integration points carefully and effectively. The problem is that if you include the external systems themselves within the scope of your automated acceptance testing, you have less control over the system. It is difficult to set an external system starting state, and this, in turn, will end up in an unpredictable test run that fails most of the time. The rest of your time will be probably spent discussing how to fix testing failures with external providers. However, our objective with continuous testing is to find problems as early as possible, and to achieve this, we aim to integrate our system continuously. Clearly, there is a tension here and a “one-size-fits-all” answer doesn’t exist.
+
+Having suites of tests around each integration point, intended to run in an environment that has real connections to external systems, is valuable, but the tests should be very small, focus on business risks, and cover core customer journeys. Instead, consider creating [test doubles][11] that represent the connection to all external systems and use them in development and/or early-stage environments so that your test suites are faster and test results are deterministic. If you are new to the concept of test doubles but have heard about mocks and stubs, you can learn about the differences in this [Martin Fowler blog post][11].
+
+In their book, [Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation][12], Jez Humble and David Farley advise: “Test doubles must almost always be used to stub out part of an external system when:
+
+ * The external system is under development but the interface has been defined ahead of time (in these situations, be prepared for the interface to change).
+
+ * The external system is developed already but you don’t have a test instance of that system available for your testing, or the test system is too slow or buggy to act as a service for regular automated test runs.
+
+ * The test system exists, but responses are not deterministic and so make validation of tests results impossible for automated tests (for example, a stock market feed).
+
+ * The external system takes the form of another application that is difficult to install or requires manual intervention via a UI.
+
+ * The load that your automated continuous integration system imposes, and the service level that it requires, overwhelms the lightweight test environment that is set up to cope with only a few manual exploratory interactions.”
+
+
+
+
+Suppose you need to integrate one or more external systems that are under active development. In turn, there will likely be changes in the schemas, contracts, and so on. Such a scenario needs careful and regular testing to identify points at which different teams diverge. This is the case of microservice-based architectures, which involve several independent systems deployed to test a single functionality. In this context, review the overall automated testing strategies in favor of a more scalable and maintainable approach like the one used on [consumer-driven contracts][13].
+
+If you are not in such a situation, I found the following open source tools useful to implement test doubles starting from an API contract specification:
+
+ * [SoapUI mocking services][14]: Despite its name, it can mock both SOAP and rest services.
+
+ * [WireMock][15]: It can mock rest services only.
+
+ * For rest services, look at [OpenAPI tools][16] for “mock servers,” which are able to generate test stubs starting from [OpenAPI][17] contract specification.
+
+
+
+
+### 4\. Test and development tools mismatch
+
+One of the consequences of offloading test automation work to teams other than the development team is that it creates a divergence between development and test tools. This makes collaboration and communication harder between dev and test engineers, increases the overall cost for test automation, and fosters bad practices such as having the version of test scripts and feature code not aligned or not versioned at all.
+
+I’ve seen a lot of teams struggle with expensive UI/API automated test tools that had poor integration with standard versioning systems like Git. Other tools, especially GUI-based commercial ones with visual workflow capabilities, create a false expectation—primarily between test managers—that you can easily expect testers to develop maintainable and reusable automated tests. Even if this is possible, they can’t scale your automated test suite over time; the tests must be curated as much as feature code, which requires developer-level programming skills and best practices.
+
+There are several open source tools that help you write automated acceptance tests and reuse your development teams' skills. If your primary development language is Java or JavaScript, you may find the following options useful:
+
+ * Java
+
+ * [Cucumber-jvm][18] for implementing executable specifications in Java for both UI and API automated testing
+
+ * [REST Assured][19] for API testing
+
+ * [SeleniumHQ][20] for web testing
+
+ * [ngWebDriver][21] locators for Selenium WebDriver. It is optimized for web applications built with Angular.js 1.x or Angular 2+
+
+ * [Appium Java][22] for mobile testing using Selenium WebDriver
+
+ * JavaScript
+
+ * [Cucumber.js][23] same as Cucumber.jvm but runs on Node.js platform
+
+ * [Chakram][24] for API testing
+
+ * [Protractor][25] for web testing optimized for web applications built with AngularJS 1.x or Angular 2+
+
+ * [Appium][26] for mobile testing on the Node.js platform
+
+
+
+
+### 5\. Your test data management is not fully automated
+
+To build maintainable test suites, it’s essential to have an effective strategy for creating and maintaining test data. It requires both automatic migration of data schema and test data initialization.
+
+It's tempting to use large database dumps for automated tests, but this makes it difficult to version and automate them and will increase the overall time of test execution. A better approach is to capture all data changes in DDL and DML scripts, which can be easily versioned and executed by the data management system. These scripts should first create the structure of the database and then populate the tables with any reference data required for the application to start. Furthermore, you need to design your scripts incrementally so that you can migrate your database without creating it from scratch each time and, most importantly, without losing any valuable data.
+
+Open source tools like [Flyway][27] can help you orchestrate your DDL and DML scripts' execution based on a table in your database that contains its current version number. At deployment time, Flyway checks the version of the database currently deployed and the version of the database required by the version of the application that is being deployed. It then works out which scripts to run to migrate the database from its current version to the required version, and runs them on the database in order.
+
+One important characteristic of your automated acceptance test suite, which makes it scalable over time, is the level of isolation of the test data: Test data should be visible only to that test. In other words, a test should not depend on the outcome of the other tests to establish its state, and other tests should not affect its success or failure in any way. Isolating tests from one another makes them capable of being run in parallel to optimize test suite performance, and more maintainable as you don’t have to run tests in any specific order.
+
+When considering how to set up the state of the application for an acceptance test, Jez Humble and David Farley note [in their book][12] that it is helpful to distinguish between three kinds of data:
+
+ * **Test reference data:** This is the data that is relevant for a test but that has little bearing upon the behavior under test. Such data is typically read by test scripts and remains unaffected by the operation of the tests. It can be managed by using pre-populated seed data that is reused in a variety of tests to establish the general environment in which the tests run.
+
+ * **Test-specific data:** This is the data that drives the behavior under test. It also includes transactional data that is created and/or updated during test execution. It should be unique and use test isolation strategies to ensure that the test starts in a well-defined environment that is unaffected by other tests. Examples of test isolation practices are deleting test-specific data and transactional data at the end of the test execution, or using a functional partitioning strategy.
+
+ * **Application reference data:** This data is irrelevant to the test but is required by the application for startup.
+
+
+
+
+Application reference data and test reference data can be kept in the form of database scripts, which are versioned and migrated as part of the application's initial setup. For test-specific data, you should use application APIs so the system is always put in a consistent state as a consequence of executing business logic (which otherwise would be bypassed if you directly load test data into the database using scripts).
+
+### Conclusion
+
+Agile and DevOps teams continue to fall short on continuous testing—a crucial element of the CI/CD pipeline. Even as a single process, continuous testing is made up of various components that must work in unison. Team structure, testing prioritization, test data, and tools all play a critical role in the success of continuous testing. Agile and DevOps teams must get every piece right to see the benefits.
+
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/11/continuous-testing-wrong
+
+作者:[Davide Antelmo][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/dantelmo
+[b]: https://github.com/lujun9972
+[1]: https://puppet.com/blog/2017-state-devops-report-here
+[2]: https://www.agilealliance.org/glossary/bdd/
+[3]: https://docs.cucumber.io/
+[4]: https://jbehave.org/
+[5]: https://www.gauge.org/
+[6]: https://www.seleniumhq.org/projects/ide/
+[7]: https://martinfowler.com/bliki/PageObject.html
+[8]: https://continuousdelivery.com/implementing/patterns/
+[9]: https://martinfowler.com/bliki/TestPyramid.html
+[10]: https://martinfowler.com/articles/practical-test-pyramid.html
+[11]: https://martinfowler.com/bliki/TestDouble.html
+[12]: https://martinfowler.com/books/continuousDelivery.html
+[13]: https://martinfowler.com/articles/consumerDrivenContracts.html
+[14]: https://www.soapui.org/soap-mocking/service-mocking-overview.html
+[15]: http://wiremock.org/
+[16]: https://openapi.tools/
+[17]: https://www.openapis.org/
+[18]: https://github.com/cucumber/cucumber-jvm
+[19]: http://rest-assured.io/
+[20]: https://www.seleniumhq.org/
+[21]: https://github.com/paul-hammant/ngWebDriver
+[22]: https://github.com/appium/java-client
+[23]: https://github.com/cucumber/cucumber-js
+[24]: http://dareid.github.io/chakram/
+[25]: https://www.protractortest.org/#/
+[26]: https://github.com/appium/appium
+[27]: https://flywaydb.org/
diff --git a/sources/talk/20181107 How open source in education creates new developers.md b/sources/talk/20181107 How open source in education creates new developers.md
new file mode 100644
index 0000000000..7f79ce8b44
--- /dev/null
+++ b/sources/talk/20181107 How open source in education creates new developers.md
@@ -0,0 +1,65 @@
+How open source in education creates new developers
+======
+Self-taught developer and new Gibbon maintainer explains why open source is integral to creating the next generation of coders.
+
+
+Like many programmers, I got my start solving problems with code. When I was a young programmer, I was content to code anything I could imagine—mostly games—and do it all myself. I didn't need help; I just needed less sleep. It's a common pitfall, and one that I'm happy to have climbed out of with the help of two important realizations:
+
+First, the software that impacts our daily lives the most isn't made by an amazingly talented solo developer. On a large scale, it's made by global teams of hundreds or thousands of developers. On smaller scales, it's still made by a team of dedicated professionals, often working remotely. Far beyond the value of churning out code is the value of communicating ideas, collaborating, sharing feedback, and making collective decisions.
+
+Second, sustainable code isn't programmed in a vacuum. It's not just a matter of time or scale; it's a diversity of thinking. Designing software is about understanding an issue and the people it affects and setting out to find a solution. No one person can see an issue from every point of view. As a developer, learning to connect with other developers, empathize with users, and think of a project as a community rather than a codebase are invaluable.
+
+### Open source and education: natural partners
+
+Education is not a zero-sum game. Worldwide, members of the education community work together to share ideas, build professional learning networks, and create new learning models.
+
+This collaboration is where there's an amazing synergy between open source software and education. It's already evident in the many open source projects used in schools worldwide; in classrooms, running blogs, sharing resources, hosting servers, and empowering collaboration.
+
+Working in a school has sparked my passion to advocate for open source in education. My position as web developer and digital media specialist at [The International School of Macao][1] has become what I call a developer-in-residence. Working alongside educators has given me the incredible opportunity to learn their needs and workflows, then go back and write code to help solve those problems. There's a lot of power in this model: not just programming for hypothetical "users" but getting to know the people who use a piece of software on a day-to-day basis, watching them use it, learning their pain points, and aiming to build [something that meets their needs][2].
+
+This is a model that I believe we can build on and share. Educators and developers working together have the ability to create the quality, open, affordable software they need, built on the values that matter most to them. These tools can be made available to those who cannot afford commercial systems but do want to educate the next generation.
+
+Not every school may have the capacity to contribute code or hire developers, but with a larger community of people working together, extraordinary things are happening.
+
+### What schools need from software
+
+There are a lot of amazing educators out there re-thinking the learning models used in schools. They're looking for ways to provide students with agency, spark their curiosity, connect their learning to the real world, and foster mindsets that will help them navigate our rapidly changing world.
+
+The software used in schools needs to be able to adapt and change at the same pace. No one knows for certain what education will look like in the future, but there are some great ideas for what directions it's going in. To keep moving forward, educators need to be able to experiment at the same level that learning is happening; to try, to fail, and to iterate on different approaches right in their classrooms.
+
+This is where I believe open source tools for learning can be quite powerful. There are a lot of challenging projects that can arise in a school. My position started as a web design job but soon grew into developing staff portals, digital signage, school blogs, and automated newsletters. For each new project, open source was a natural jumping-off point: it was affordable, got me up to speed faster, and I was able to adapt each system to my school's ever-evolving needs.
+
+One such project was transitioning our school's student information system, along with 10 years of data, to an open source platform called [Gibbon][3]. The system did a lot of [things that my school needed][4], which was awesome. Still, there were some things we needed to adapt and other things we needed to add, including tools to import large amounts of data. Since it's an open source school platform, I was able to dive in and make these changes, and then share them back with the community.
+
+This is the point where open source started to change from something I used to something I contributed to. I've done a lot of solo development work in the past, so the opportunity to collaborate on new features and contribute bug fixes really hooked me.
+
+As my work on Gibbon evolved from small fixes to whole features, I also started collaborating on ideas to refactor and modernize the codebase. This was an open source lightbulb for me, and over the past couple of years, I've become more and more involved in our growing community, recently stepping into the role of maintainer on the project.
+
+### Creating a new generation of developers
+
+As a software developer, I'm entirely self-taught, and much of what I know wouldn't have been possible if these tools were locked down and inaccessible. Learning in the information age is about having access to the ideas that inspire and motivate us.
+
+The ability to explore, break, fix and tinker with the source code I've used is largely the driving force of my motivation to learn. Like many coders, early on I'd peek into a codebase and change a few variables here and there to see what happened. Then I started stringing spaghetti code together to see what I could build with it. Bit by bit, I'd wonder "what is it doing?" and "why does this work, but that doesn't?" Eventually, my haphazard jungles of code became carefully architected codebases; all of this learned through playing with source code written by other developers and seeking to understand the bigger concepts of what the software was accomplishing.
+
+Beyond the possibilities open source offers to schools as a whole, it also can also offer individual students a profound opportunity to explore the technology that's part of our everyday lives. Schools embracing an open source mindset would do so not just to cut costs or create new tools for learning, but also to give their students the same freedoms to be a part of this evolving landscape of education and technology.
+
+With this level of access, open source in the hands of a student transforms from a piece of software to a source of potential learning experiences, and possibly even a launching point for students who wish to dive deeper into computer science concepts. This is a powerful way that students can discover their intrinsic motivation: when they can see their learning as a path to unravel and understand the complexities of the world around them.
+
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/11/next-gen-coders-education
+
+作者:[Sandra Kuipers][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/skuipers
+[b]: https://github.com/lujun9972
+[1]: https://www.tis.edu.mo
+[2]: https://skuipers.com/portfolio/
+[3]: https://gibbonedu.org/
+[4]: https://opensource.com/education/14/2/gibbon-project-story
diff --git a/sources/talk/20181112 A Free Guide for Setting Your Open Source Strategy.md b/sources/talk/20181112 A Free Guide for Setting Your Open Source Strategy.md
new file mode 100644
index 0000000000..c0767c73ab
--- /dev/null
+++ b/sources/talk/20181112 A Free Guide for Setting Your Open Source Strategy.md
@@ -0,0 +1,59 @@
+translating---geekpi
+
+A Free Guide for Setting Your Open Source Strategy
+======
+
+
+
+The majority of companies using open source understand its business value, but they may lack the tools to strategically implement an open source program and reap the full rewards. According to a recent survey from [The New Stack][1], “the top three benefits of open source programs are 1) increased awareness of open source, 2) more speed and agility in the development cycle, and 3) better license compliance.”
+
+Running an open source program office involves creating a strategy to help you define and implement your approach as well as measure your progress. The [Open Source Guides to the Enterprise][2], developed by The Linux Foundation in partnership with the TODO Group, offer open source expertise based on years of experience and practice.
+
+The most recent guide, [Setting an Open Source Strategy][3], details the essential steps in creating a strategy and setting you on the path to success. According to the guide, “your open source strategy connects the plans for managing, participating in, and creating open source software with the business objectives that the plans serve. This can open up many opportunities and catalyze innovation.” The guide covers the following topics:
+
+ 1. Why create a strategy?
+ 2. Your strategy document
+ 3. Approaches to strategy
+ 4. Key considerations
+ 5. Other components
+ 6. Determine ROI
+ 7. Where to invest
+
+
+
+The critical first step here is creating and documenting your open source strategy, which will “help you maximize the benefits your organization gets from open source.” At the same time, your detailed strategy can help you avoid difficulties that may arise from mistakes such as choosing the wrong license or improperly maintaining code. According to the guide, this document can also:
+
+ * Get leaders excited and involved
+ * Help obtain buy-in within the company
+ * Facilitate decision-making in diffuse, multi-departmental organizations
+ * Help build a healthy community
+ * Explain your company’s approach to open source and support of its use
+ * Clarify where your company invests in community-driven, external R&D and where your company will focus on its value added differentiation
+
+
+
+“At Salesforce, we have internal documents that we circulate to our engineering team, providing strategic guidance and encouragement around open source. These encourage the creation and use of open source, letting them know in no uncertain terms that the strategic leaders at the company are fully behind it. Additionally, if there are certain kinds of licenses we don’t want engineers using, or other open source guidelines for them, our internal documents need to be explicit,” said Ian Varley, Software Architect at Salesforce and contributor to the guide.
+
+Open source programs help promote an enterprise culture that can make companies more productive, and, according to the guide, a strong strategy document can “help your team understand the business objectives behind your open source program, ensure better decision-making, and minimize risks.”
+
+Learn how to align your goals for managing and creating open source software with your organization’s business objectives using the tips and proven practices in the new guide to [Setting an Open Source Strategy][3]. And, check out all 12 [Open Source Guides for the Enterprise][2] for more information on achieving success with open source.
+
+This article originally appeared on [The Linux Foundation][4]
+
+--------------------------------------------------------------------------------
+
+via: https://www.linux.com/blog/2018/11/free-guide-setting-your-open-source-strategy
+
+作者:[Amber Ankerholz][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.linux.com/users/aankerholz
+[b]: https://github.com/lujun9972
+[1]: https://thenewstack.io/open-source-culture-starts-with-programs-and-policies/
+[2]: https://www.linuxfoundation.org/resources/open-source-guides/
+[3]: https://www.linuxfoundation.org/resources/open-source-guides/setting-an-open-source-strategy/
+[4]: https://www.linuxfoundation.org/blog/2018/11/a-free-guide-for-setting-your-open-source-strategy/
diff --git a/sources/talk/20181112 The Source History of Cat.md b/sources/talk/20181112 The Source History of Cat.md
new file mode 100644
index 0000000000..1cb1139033
--- /dev/null
+++ b/sources/talk/20181112 The Source History of Cat.md
@@ -0,0 +1,94 @@
+The Source History of Cat
+======
+I once had a debate with members of my extended family about whether a computer science degree is a degree worth pursuing. I was in college at the time and trying to decide whether I should major in computer science. My aunt and a cousin of mine believed that I shouldn’t. They conceded that knowing how to program is of course a useful and lucrative thing, but they argued that the field of computer science advances so quickly that everything I learned would almost immediately be outdated. Better to pick up programming on the side and instead major in a field like economics or physics where the basic principles would be applicable throughout my lifetime.
+
+I knew that my aunt and cousin were wrong and decided to major in computer science. (Sorry, aunt and cousin!) It is easy to see why the average person might believe that a field like computer science, or a profession like software engineering, completely reinvents itself every few years. We had personal computers, then the web, then phones, then machine learning… technology is always changing, so surely all the underlying principles and techniques change too. Of course, the amazing thing is how little actually changes. Most people, I’m sure, would be stunned to know just how old some of the important software on their computer really is. I’m not talking about flashy application software, admittedly—my copy of Firefox, the program I probably use the most on my computer, is not even two weeks old. But, if you pull up the manual page for something like `grep`, you will see that it has not been updated since 2010 (at least on MacOS). And the original version of `grep` was written in 1974, which in the computing world was back when dinosaurs roamed Silicon Valley. People (and programs) still depend on `grep` every day.
+
+My aunt and cousin thought of computer technology as a series of increasingly elaborate sand castles supplanting one another after each high tide clears the beach. The reality, at least in many areas, is that we steadily accumulate programs that have solved problems. We might have to occasionally modify these programs to avoid software rot, but otherwise they can be left alone. `grep` is a simple program that solves a still-relevant problem, so it survives. Most application programming is done at a very high level, atop a pyramid of much older code solving much older problems. The ideas and concepts of 30 or 40 years ago, far from being obsolete today, have in many cases been embodied in software that you can still find installed on your laptop.
+
+I thought it would be interesting to take a look at one such old program and see how much it had changed since it was first written. `cat` is maybe the simplest of all the Unix utilities, so I’m going to use it as my example. Ken Thompson wrote the original implementation of `cat` in 1969. If I were to tell somebody that I have a program on my computer from 1969, would that be accurate? How much has `cat` really evolved over the decades? How old is the software on our computers?
+
+Thanks to repositories like [this one][1], we can see exactly how `cat` has evolved since 1969. I’m going to focus on implementations of `cat` that are ancestors of the implementation I have on my Macbook. You will see, as we trace `cat` from the first versions of Unix down to the `cat` in MacOS today, that the program has been rewritten more times than you might expect—but it ultimately works more or less the same way it did fifty years ago.
+
+### Research Unix
+
+Ken Thompson and Dennis Ritchie began writing Unix on a PDP 7. This was in 1969, before C, so all of the early Unix software was written in PDP 7 assembly. The exact flavor of assembly they used was unique to Unix, since Ken Thompson wrote his own assembler that added some features on top of the assembler provided by DEC, the PDP 7’s manufacturer. Thompson’s changes are all documented in [the original Unix Programmer’s Manual][2] under the entry for `as`, the assembler.
+
+[The first implementation][3] of `cat` is thus in PDP 7 assembly. I’ve added comments that try to explain what each instruction is doing, but the program is still difficult to follow unless you understand some of the extensions Thompson made while writing his assembler. There are two important ones. First, the `;` character can be used to separate multiple statements on the same line. It appears that this was used most often to put system call arguments on the same line as the `sys` instruction. Second, Thompson added support for “temporary labels” using the digits 0 through 9. These are labels that can be reused throughout a program, thus being, according to the Unix Programmer’s Manual, “less taxing both on the imagination of the programmer and on the symbol space of the assembler.” From any given instruction, you can refer to the next or most recent temporary label `n` using `nf` and `nb` respectively. For example, if you have some code in a block labeled `1:`, you can jump back to that block from further down by using the instruction `jmp 1b`. (But you cannot jump forward to that block from above without using `jmp 1f` instead.)
+
+The most interesting thing about this first version of `cat` is that it contains two names we should recognize. There is a block of instructions labeled `getc` and a block of instructions labeled `putc`, demonstrating that these names are older than the C standard library. The first version of `cat` actually contained implementations of both functions. The implementations buffered input so that reads and writes were not done a character at a time.
+
+The first version of `cat` did not last long. Ken Thompson and Dennis Ritchie were able to persuade Bell Labs to buy them a PDP 11 so that they could continue to expand and improve Unix. The PDP 11 had a different instruction set, so `cat` had to be rewritten. I’ve marked up [this second version][4] of `cat` with comments as well. It uses new assembler mnemonics for the new instruction set and takes advantage of the PDP 11’s various [addressing modes][5]. (If you are confused by the parentheses and dollar signs in the source code, those are used to indicate different addressing modes.) But it also leverages the `;` character and temporary labels just like the first version of `cat`, meaning that these features must have been retained when `as` was adapted for the PDP 11.
+
+The second version of `cat` is significantly simpler than the first. It is also more “Unix-y” in that it doesn’t just expect a list of filename arguments—it will, when given no arguments, read from `stdin`, which is what `cat` still does today. You can also give this version of `cat` an argument of `-` to indicate that it should read from `stdin`.
+
+In 1973, in preparation for the release of the Fourth Edition of Unix, much of Unix was rewritten in C. But `cat` does not seem to have been rewritten in C until a while after that. [The first C implementation][6] of `cat` only shows up in the Seventh Edition of Unix. This implementation is really fun to look through because it is so simple. Of all the implementations to follow, this one most resembles the idealized `cat` used as a pedagogic demonstration in K&R C. The heart of the program is the classic two-liner:
+
+```
+while ((c = getc(fi)) != EOF)
+ putchar(c);
+```
+
+There is of course quite a bit more code than that, but the extra code is mostly there to ensure that you aren’t reading and writing to the same file. The other interesting thing to note is that this implementation of `cat` only recognized one flag, `-u`. The `-u` flag could be used to avoid buffering input and output, which `cat` would otherwise do in blocks of 512 bytes.
+
+### BSD
+
+After the Seventh Edition, Unix spawned all sorts of derivatives and offshoots. MacOS is built on top of Darwin, which in turn is derived from the Berkeley Software Distribution (BSD), so BSD is the Unix offshoot we are most interested in. BSD was originally just a collection of useful programs and add-ons for Unix, but it eventually became a complete operating system. BSD seems to have relied on the original `cat` implementation up until the fourth BSD release, known as 4BSD, when support was added for a whole slew of new flags. [The 4BSD implementation][7] of `cat` is clearly derived from the original implementation, though it adds a new function to implement the behavior triggered by the new flags. The naming conventions already used in the file were adhered to—the `fflg` variable, used to mark whether input was being read from `stdin` or a file, was joined by `nflg`, `bflg`, `vflg`, `sflg`, `eflg`, and `tflg`, all there to record whether or not each new flag was supplied in the invocation of the program. These were the last command-line flags added to `cat`; the man page for `cat` today lists these flags and no others, at least on Mac OS. 4BSD was released in 1980, so this set of flags is 38 years old.
+
+`cat` would be entirely rewritten a final time for BSD Net/2, which was, among other things, an attempt to avoid licensing issues by replacing all AT&T Unix-derived code with new code. BSD Net/2 was released in 1991. This final rewrite of `cat` was done by Kevin Fall, who graduated from Berkeley in 1988 and spent the next year working as a staff member at the Computer Systems Research Group (CSRG). Fall told me that a list of Unix utilities still implemented using AT&T code was put up on a wall at CSRG and staff were told to pick the utilities they wanted to reimplement. Fall picked `cat` and `mknod`. The `cat` implementation bundled with MacOS today is built from a source file that still bears his name at the very top. His version of `cat`, even though it is a relatively trivial program, is today used by millions.
+
+[Fall’s original implementation][8] of `cat` is much longer than anything we have seen so far. Other than support for a `-?` help flag, it adds nothing in the way of new functionality. Conceptually, it is very similar to the 4BSD implementation. It is only longer because Fall separates the implementation into a “raw” mode and a “cooked” mode. The “raw” mode is `cat` classic; it prints a file character for character. The “cooked” mode is `cat` with all the 4BSD command-line options. The distinction makes sense but it also pads out the implementation so that it seems more complex at first glance than it actually is. There is also a fancy error handling function at the end of the file that further adds to its length.
+
+### MacOS
+
+In 2001, Apple launched Mac OS X. The launch was an important one for Apple, because Apple had spent many years trying and failing to replace its existing operating system (classic Mac OS), which had long been showing its age. There were two previous attempts to create a new operating system internally, but both went nowhere; in the end, Apple bought NeXT, Steve Jobs’ company, which had developed an operating system and object-oriented programming framework called NeXTSTEP. Apple took NeXTSTEP and used it as a basis for Mac OS X. NeXTSTEP was in part built on BSD, so using NeXTSTEP as a starting point for Mac OS X brought BSD-derived code right into the center of the Apple universe.
+
+The very first release of Mac OS X thus includes [an implementation][9] of `cat` pulled from the NetBSD project. NetBSD, which remains in development today, began as a fork of 386BSD, which in turn was based directly on BSD Net/2. So the first Mac OS X implementation of `cat` is Kevin Fall’s `cat`. The only thing that had changed over the intervening decade was that Fall’s error-handling function `err()` was removed and the `err()` function made available by `err.h` was used in its place. `err.h` is a BSD extension to the C standard library.
+
+The NetBSD implementation of `cat` was later swapped out for FreeBSD’s implementation of `cat`. [According to Wikipedia][10], Apple began using FreeBSD instead of NetBSD in Mac OS X 10.3 (Panther). But the Mac OS X implementation of `cat`, according to Apple’s own open source releases, was not replaced until Mac OS X 10.5 (Leopard) was released in 2007. The [FreeBSD implementation][11] that Apple swapped in for the Leopard release is the same implementation on Apple computers today. As of 2018, the implementation has not been updated or changed at all since 2007.
+
+So the Mac OS `cat` is old. As it happens, it is actually two years older than its 2007 appearance in MacOS X would suggest. [This 2005 change][12], which is visible in FreeBSD’s Github mirror, was the last change made to FreeBSD’s `cat` before Apple pulled it into Mac OS X. So the Mac OS X `cat` implementation, which has not been kept in sync with FreeBSD’s `cat` implementation, is officially 13 years old. There’s a larger debate to be had about how much software can change before it really counts as the same software; in this case, the source file has not changed at all since 2005.
+
+The `cat` implementation used by Mac OS today is not that different from the implementation that Fall wrote for the 1991 BSD Net/2 release. The biggest difference is that a whole new function was added to provide Unix domain socket support. At some point, a FreeBSD developer also seems to have decided that Fall’s `raw_args()` function and `cook_args()` should be combined into a single function called `scanfiles()`. Otherwise, the heart of the program is still Fall’s code.
+
+I asked Fall how he felt about having written the `cat` implementation now used by millions of Apple users, either directly or indirectly through some program that relies on `cat` being present. Fall, who is now a consultant and a co-author of the most recent editions of TCP/IP Illustrated, says that he is surprised when people get such a thrill out of learning about his work on `cat`. Fall has had a long career in computing and has worked on many high-profile projects, but it seems that many people still get most excited about the six months of work he put into rewriting `cat` in 1989.
+
+### The Hundred-Year-Old Program
+
+In the grand scheme of things, computers are not an old invention. We’re used to hundred-year-old photographs or even hundred-year-old camera footage. But computer programs are in a different category—they’re high-tech and new. At least, they are now. As the computing industry matures, will we someday find ourselves using programs that approach the hundred-year-old mark?
+
+Computer hardware will presumably change enough that we won’t be able to take an executable compiled today and run it on hardware a century from now. Perhaps advances in programming language design will also mean that nobody will understand C in the future and `cat` will have long since been rewritten in another language. (Though C has already been around for fifty years, and it doesn’t look like it is about to be replaced any time soon.) But barring all that, why not just keep using the `cat` we have forever?
+
+I think the history of `cat` shows that some ideas in computer science are very durable indeed. Indeed, with `cat`, both the idea and the program itself are old. It may not be accurate to say that the `cat` on my computer is from 1969. But I could make a case for saying that the `cat` on my computer is from 1989, when Fall wrote his implementation of `cat`. Lots of other software is just as ancient. So maybe we shouldn’t think of computer science and software development primarily as fields that disrupt the status quo and invent new things. Our computer systems are built out of historical artifacts. At some point, we may all spend more time trying to understand and maintain those historical artifacts than we spend writing new code.
+
+If you enjoyed this post, more like it come out every two weeks! Follow [@TwoBitHistory][13] on Twitter or subscribe to the [RSS feed][14] to make sure you know when a new post is out.
+
+
+--------------------------------------------------------------------------------
+
+via: https://twobithistory.org/2018/11/12/cat.html
+
+作者:[Two-Bit History][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://twobithistory.org
+[b]: https://github.com/lujun9972
+[1]: https://github.com/dspinellis/unix-history-repo
+[2]: https://www.bell-labs.com/usr/dmr/www/man11.pdf
+[3]: https://gist.github.com/sinclairtarget/47143ba52b9d9e360d8db3762ee0cbf5#file-1-cat-pdp7-s
+[4]: https://gist.github.com/sinclairtarget/47143ba52b9d9e360d8db3762ee0cbf5#file-2-cat-pdp11-s
+[5]: https://en.wikipedia.org/wiki/PDP-11_architecture#Addressing_modes
+[6]: https://gist.github.com/sinclairtarget/47143ba52b9d9e360d8db3762ee0cbf5#file-3-cat-v7-c
+[7]: https://gist.github.com/sinclairtarget/47143ba52b9d9e360d8db3762ee0cbf5#file-4-cat-bsd4-c
+[8]: https://gist.github.com/sinclairtarget/47143ba52b9d9e360d8db3762ee0cbf5#file-5-cat-net2-c
+[9]: https://gist.github.com/sinclairtarget/47143ba52b9d9e360d8db3762ee0cbf5#file-6-cat-macosx-c
+[10]: https://en.wikipedia.org/wiki/Darwin_(operating_system)
+[11]: https://gist.github.com/sinclairtarget/47143ba52b9d9e360d8db3762ee0cbf5#file-7-cat-macos-10-13-c
+[12]: https://github.com/freebsd/freebsd/commit/a76898b84970888a6fd015e15721f65815ea119a#diff-6e405d5ab5b47ca2a131ac7955e5a16b
+[13]: https://twitter.com/TwoBitHistory
+[14]: https://twobithistory.org/feed.xml
+[15]: https://twitter.com/TwoBitHistory/status/1051826516844322821?ref_src=twsrc%5Etfw
diff --git a/sources/talk/20181113 Have you seen these personalities in open source.md b/sources/talk/20181113 Have you seen these personalities in open source.md
new file mode 100644
index 0000000000..20c2243121
--- /dev/null
+++ b/sources/talk/20181113 Have you seen these personalities in open source.md
@@ -0,0 +1,93 @@
+Have you seen these personalities in open source?
+======
+An inclusive community is a more creative and effective community. But how can you make sure you're accommodating the various personalities that call your community "home"?
+
+
+When I worked with the Mozilla Foundation, long before the organization boasted more than a hundred and fifty staff members, we conducted a foundation-wide Myers-Briggs indicator. The [Myers-Briggs][1] is a popular personality assessment, one used widely in [career planning and the business world][2]. Created in the early twentieth century, it's the product of two women: Katharine Cook Briggs and her daughter Isabel Briggs Myers, who built the tool on Carl Jung's Theory of Psychological Types (which was itself based on clinical observations, as opposed to "controlled" scientific studies). Each of my co-workers (53 at the time) answered the questions. We were curious about what kind of insights we would gain into our individual personalities, and, by extension, about how we'd best work together.
+
+Our team's report showed that the people working for the Mozilla Foundation, one of the biggest and oldest open source projects on the web, were people with the least common personality types. Where about 77% of the general population fit into the top 8 most common Myers-Briggs types, only 23% of the Mozilla Foundation team did. Our team was mostly composed of the rarer Myers-Briggs types. For example, 23% of the team shared my own individual personality type ("ENTP"), which is interesting to me, since people with that personality type only make up 3.2% of the general population. And 9% of the team were ENTJ, the second rarest personality type, at just 1.8% of the population.
+
+I began to wonder: Do open source projects attract a certain type of personality? Or is this one assessment of full-time open sourcers just a fluke?
+
+And if it's true, which aspects of personality can we tug on when encouraging community participation? How can we use our knowledge of personality and psychology to push our open source projects towards success?
+
+### The personalities of open source
+
+Thinking about personality types and open source communities is tricky. In short, when we're talking about personality, we see lots speculation.
+
+Personality assessments and, indeed, the entire field of psychology are often considered "soft science." Academics in the field have long struggled to be seen as scientifically relevant. Other subjects, like physics and mathematics, can prove hard truths—this is the way it is, and if it's not like this, then it's not true.
+
+Thinking about personality types and open source communities is tricky. In short, when we're talking about personality, we see lots speculation.
+
+But people and their brains are fascinatingly complicated, and definitively proving a theory is impossible. Conducting controlled studies with human beings is difficult; there are ethical implications, physical needs, and no two people are alike—so there is no way to have a truly stable control group. Plus, there's always an outlier of some sort, because our backgrounds and experiences structure our personalities and the way we think. In psychology, the closest we can get to a "hard truth" is something like "This is mostly the way it is, except when it's not." Only in recent years (and with recent advancements in technology) have links between psychology and neurology provided us with some psychological "hard truths." For example, we know, definitively, which parts of the brain are responsible for certain functions.
+
+Emotion and personality, however, are more elusive subjects; generalizations remain difficult and face relevant intellectual criticism. But when we're thinking about designing communities around personality types, we can work with some useful archetypes.
+
+After all, anyone can find a place in open source. Millions of people participate in various projects and communities. Open source isn't just for engineers anymore; we've gone global. And while open source might not be as mainstream as, say, eggs, I'm confident that every personality type, gender identity, sexual orientation, age, and background is represented in the global open source community.
+
+When designing open source projects, you want to ensure that you build [architectures of participation][3] for everyone. Successful projects have communities, and community-building happens intentionally. Community management takes time and effort, so if you're hoping to lead a successful open source project, don't spend all your resources on the product. Care for your people, and your people will help you with the rest of it.
+
+Here's what to consider as you begin architecting an inclusive community.
+
+#### Introverted versus extraverted
+
+An introvert is someone who gains energy from solitude, while an extravert gains energy from being around other people. We all have a little of both. For example, an introvert teaching might be using his extravert mode of operation all day. To recharge after a day at work, he'd likely need to go into quiet mode, thinking internally. An extravert teacher would be just as tired from the same day, but to recharge he'd want to talk about the day. An extravert might happily have a dinner party and use that as a mode of recharging.
+
+Another important difference is that those with an extravert preference tend to do a lot of their thinking out loud, whereas introverts think carefully before speaking. Thinking out loud can be difficult for an introvert to understand, as she might expect the things being said to have already been thought about. But for an extravert, verbalizing is a way of figuring stuff out. They don't mind saying things that are incorrect, because doing so helps them process information.
+
+Introverts and extraverts have different comfort levels with regard to participation; they may need different pathways for getting involved in your project or community.
+
+Some communities are accustomed to being marginalized, so being welcoming and encouraging becomes even more important if you want to have a diverse and inclusive project. Remember, diversity is also intentional, and inclusivity is one of [the principles of an open organization][4].
+
+Not everyone feels comfortable speaking in a community call or posting to a public forum. Not everyone will respond to a public list. Personal outreach and communication strategies that are more private are important for ensuring inclusivity. In addition to transparent and public communication mechanisms, a well-designed open source project will point contributors to specific people they can reach directly.
+
+#### Strict versus flexible
+
+Did you know that some people need highly structured environments or workflows to be productive, while others would become incapacitated by such structures? For many creative types, an adaptive and flexible environment or workflow is essential. For a truly inclusive project, you'll need to provide for both. I recommend that you always document and detail your processes. Write up your approaches, make an overview, and share the process with your community. [I've done this][5] while working on Greenpeace's open source project, [Planet 4][6].
+
+As a leader or community manager, you need to be flexible and kind when people don't follow your carefully planned processes. The approach might make sense to you and your team—it might make sense to a lot of people in the community—but it might be too strict for others. You should gently remind people of your processes, but you'll find that some people just won't follow it. Instead of creating a secondary process for those who need less structure, just be responsive to whatever the request might be. People will tell you what they need; they will ask the question they need answered. And then you can generate even greater participation by demonstrating your own adaptability.
+
+#### Certainty versus ambiguity
+
+Openly documenting everything, including meeting notes, is a common practice for open source projects and communities. I am, indeed, in the habit of making charts and slides to pair with written documentation. Different brains process information differently: For some, a drawing is more easily digestible than a document, and vice versa! A leader in this space needs to understand that when people read the notes, some will read the lines and others will read between them.
+
+The preference for taking things at face value is not more correct than a preference for exploring the murky possibilities of differing kinds of information. People remember meetings and events in different ways, and their varying perspectives can cause uncertainty around decisions that have been made. In short, just because something is a "fact" doesn't mean that there aren't multiple perspectives of it.
+
+Documenting decisions is an important practice in open source, but so is [helping people understand the context around those decisions][7]. Having to go back to something that's already finished can be frustrating, but being a leader in open source means being flexible and understanding the neurodiversity at work in your community.
+
+#### Objective versus subjective
+
+Nothing in the universe is certain—indeed, even gravity didn't always exist. Humans define the world around them; it's part of our nature. We're wonderful at rationalizing occurrences so things make sense to us.
+
+And when it comes to personality, this means some people might see an objective reality (the facts defined and unshakeable, "gravity exists") while others might see a subjective world (facts are merely stories we tell ourselves to make sense of our reality, "we wanted a reason that we stick to the Earth"). One common personality conflict stems from how we view the concept of truth. While some people rely on objective fact to guide their perceptions of the ways they should be interacting with the world, others prefer to let their subjective feelings guide how they judge the facts. In any industry, conflicts between varying ways of thinking can be difficult to reconcile.
+
+Open leaders need to ensure a healthy and sustainable environment for all community members. When conflict arises, be ready to "believe" everyone—because from each of their perspectives, they're most likely right. Note that "believing" everyone doesn't mean putting up with destructive behavior (there should never be room in your community for racism, sexism, ageism or outright trolling, no matter how people might frame these behaviors). It means creating a place that allows people to respectfully discuss and debate their perspectives. Be sure you put a code of conduct in place to help with this.
+
+### Inclusivity at the fore
+
+In open source, practicing inclusivity means seeking to bend your mind towards ways of thinking that might not come naturally to you. We can all become more empathetic towards other people, helping our communities grow to be more diverse. Learn to recognize your own preferences and understand how your brain works—but also remember that everyone's neural networks work a bit differently. Then, as a leader, make sure you're creating space for everyone by championing inclusivity, fairness, open-mindedness, and neurodiversity.
+
+(Special thanks to [Adam Procter][8].)
+
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/open-organization/18/11/design-communities-personality-types
+
+作者:[Laura Hilliger][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/laurahilliger
+[b]: https://github.com/lujun9972
+[1]: https://en.wikipedia.org/wiki/Myers%E2%80%93Briggs_Type_Indicator
+[2]: https://opensource.com/open-organization/16/7/personality-test-for-teams
+[3]: https://opensource.com/business/12/6/architecture-participation
+[4]: https://opensource.com/open-organization/resources/open-org-definition
+[5]: https://medium.com/planet4/improving-p4-in-tandem-774a0d306fbc
+[6]: https://medium.com/planet4
+[7]: https://opensource.com/open-organization/16/3/what-it-means-be-open-source-leader
+[8]: http://adamprocter.co.uk
diff --git a/sources/talk/20181114 Analyzing the DNA of DevOps.md b/sources/talk/20181114 Analyzing the DNA of DevOps.md
new file mode 100644
index 0000000000..0542d572e6
--- /dev/null
+++ b/sources/talk/20181114 Analyzing the DNA of DevOps.md
@@ -0,0 +1,158 @@
+Analyzing the DNA of DevOps
+======
+How have waterfall, agile, and other development frameworks shaped the evolution of DevOps? Here's what we discovered.
+
+
+If you were to analyze the DNA of DevOps, what would you find in its ancestry report?
+
+This article is not a methodology bake-off, so if you are looking for advice or a debate on the best approach to software engineering, you can stop reading here. Rather, we are going to explore the genetic sequences that have brought DevOps to the forefront of today's digital transformations.
+
+Much of DevOps has evolved through trial and error, as companies have struggled to be responsive to customers’ demands while improving quality and standing out in an increasingly competitive marketplace. Adding to the challenge is the transition from a product-driven to a service-driven global economy that connects people in new ways. The software development lifecycle is becoming an increasingly complex system of services and microservices, both interconnected and instrumented. As DevOps is pushed further and faster than ever, the speed of change is wiping out slower traditional methodologies like waterfall.
+
+We are not slamming the waterfall approach—many organizations have valid reasons to continue using it. However, mature organizations should aim to move away from wasteful processes, and indeed, many startups have a competitive edge over companies that use more traditional approaches in their day-to-day operations.
+
+Ironically, lean, [Kanban][1], continuous, and agile principles and processes trace back to the early 1940's, so DevOps cannot claim to be a completely new idea.
+
+Let's start by stepping back a few years and looking at the waterfall, lean, and agile software development approaches. The figure below shows a “haplogroup” of the software development lifecycle. (Remember, we are not looking for the best approach but trying to understand which approach has positively influenced our combined 67 years of software engineering and the evolution to a DevOps mindset.)
+
+
+
+> “A fool with a tool is still a fool.” -Mathew Mathai
+
+### The traditional waterfall method
+
+From our perspective, the oldest genetic material comes from the [waterfall][2] model, first introduced by Dr. Winston W. Royce in a paper published in the 1970's.
+
+
+
+Like a waterfall, this approach emphasizes a logical and sequential progression through requirements, analysis, coding, testing, and operations in a single pass. You must complete each sequence, meet criteria, and obtain a signoff before you can begin the next one. The waterfall approach benefits projects that need stringent sequences and that have a detailed and predictable scope and milestone-based development. Contrary to popular belief, it also allows teams to experiment and make early design changes during the requirements, analysis, and design stages.
+
+
+
+### Lean thinking
+
+Although lean thinking dates to the Venetian Arsenal in the 1450s, we start the clock when Toyota created the [Toyota Production System][3], developed by Japanese engineers between 1948 and 1972. Toyota published an official description of the system in 1992.
+
+
+
+Lean thinking is based on [five principles][4]: value, value stream, flow, pull, and perfection. The core of this approach is to understand and support an effective value stream, eliminate waste, and deliver continuous value to the user. It is about delighting your users without interruption.
+
+
+
+### Kaizen
+
+Kaizen is based on incremental improvements; the **Plan- >Do->Check->Act** lifecycle moved companies toward a continuous improvement mindset. Originally developed to improve the flow and processes of the assembly line, the Kaizen concept also adds value across the supply chain. The Toyota Production system was one of the early implementors of Kaizen and continuous improvement. Kaizen and DevOps work well together in environments where workflow goes from design to production. Kaizen focuses on two areas:
+
+ * Flow
+ * Process
+
+
+
+### Continuous delivery
+
+Kaizen inspired the development of processes and tools to automate production. Companies were able to speed up production and improve the quality, design, build, test, and delivery phases by removing waste (including culture and mindset) and automating as much as possible using machines, software, and robotics. Much of the Kaizen philosophy also applies to lean business and software practices and continuous delivery deployment for DevOps principles and goals.
+
+### Agile
+
+The [Manifesto for Agile Software Development][5] appeared in 2001, authored by Alistair Cockburn, Bob Martin, Jeff Sutherland, Jim Highsmith, Ken Schwaber, Kent Beck, Ward Cunningham, and others.
+
+
+
+[Agile][6] is not about throwing caution to the wind, ditching design, or building software in the Wild West. It is about being able to create and respond to change. Agile development is [based on twelve principles][7] and a manifesto that values individuals and collaboration, working software, customer collaboration, and responding to change.
+
+
+
+### Disciplined agile
+
+Since the Agile Manifesto has remained static for 20 years, many agile practitioners have looked for ways to add choice and subjectivity to the approach. Additionally, the Agile Manifesto focuses heavily on development, so a tweak toward solutions rather than code or software is especially needed in today's fast-paced development environment. Scott Ambler and Mark Lines co-authored [Disciplined Agile Delivery][8] and [The Disciplined Agile Framework][9], based on their experiences at Rational, IBM, and organizations in which teams needed more choice or were not mature enough to implement lean practices, or where context didn't fit the lifecycle.
+
+The significance of DAD and DA is that it is a [process-decision framework][10] that enables simplified process decisions around incremental and iterative solution delivery. DAD builds on the many practices of agile software development, including scrum, agile modeling, lean software development, and others. The extensive use of agile modeling and refactoring, including encouraging automation through test-driven development (TDD), lean thinking such as Kanban, [XP][11], [scrum][12], and [RUP][13] through a choice of five agile lifecycles, and the introduction of the architect owner, gives agile practitioners added mindsets, processes, and tools to successfully implement DevOps.
+
+### DevOps
+
+As far as we can gather, DevOps emerged during a series of DevOpsDays in Belgium in 2009, going on to become the foundation for numerous digital transformations. Microsoft principal DevOps manager [Donovan Brown][14] defines DevOps as “the union of people, process, and products to enable continuous delivery of value to our end users.”
+
+
+
+Let's go back to our original question: What would you find in the ancestry report of DevOps if you analyzed its DNA?
+
+
+
+We are looking at history dating back 80, 48, 26, and 17 years—an eternity in today’s fast-paced and often turbulent environment. By nature, we humans continuously experiment, learn, and adapt, inheriting strengths and resolving weaknesses from our genetic strands.
+
+Under the microscope, we will find traces of waterfall, lean thinking, agile, scrum, Kanban, and other genetic material. For example, there are traces of waterfall for detailed and predictable scope, traces of lean for cutting waste, and traces of agile for promoting increments of shippable code. The genetic strands that define when and how to ship the code are where DevOps lights up in our DNA exploration.
+
+
+
+You use the telemetry you collect from watching your solution in production to drive experiments, confirm hypotheses, and prioritize your product backlog. In other words, DevOps inherits from a variety of proven and evolving frameworks and enables you to transform your culture, use products as enablers, and most importantly, delight your customers.
+
+If you are comfortable with lean thinking and agile, you will enjoy the full benefits of DevOps. If you come from a waterfall environment, you will receive help from a DevOps mindset, but your lean and agile counterparts will outperform you.
+
+### eDevOps
+
+
+
+In 2016, Brent Reed coined the term eDevOps (no Google or Wikipedia references exist to date), defining it as “a way of working (WoW) that brings continuous improvement across the enterprise seamlessly, through people, processes and tools.”
+
+Brent found that agile was failing in IT: Businesses that had adopted lean thinking were not achieving the value, focus, and velocity they expected from their trusted IT experts. Frustrated at seeing an "ivory tower" in which siloed IT services were disconnected from architecture, development, operations, and help desk support teams, he applied his practical knowledge of disciplined agile delivery and added some goals and practical applications to the DAD toolset, including:
+
+ * Focus and drive of culture through a continuous improvement (Kaizen) mindset, bringing people together even when they are across the cubicle
+ * Velocity through automation (TDD + refactoring everything possible), removing waste and adopting a [TOGAF][15], JBGE (just barely good enough) approach to documentation
+ * Value through modeling (architecture modeling) and shifting left to enable right through exposing anti-patterns while sharing through collaboration patterns in a more versatile and strategic modern digital repository
+
+
+
+Using his experience with AI at IBM, Brent designed a maturity model for eDevOps that incrementally automates dashboards for measuring and decision-making purposes so that continuous improvement through a continuous deployment (automating from development to production) is a real possibility for any organization. eDevOps in an effective transformation program based on disciplined DevOps that enables:
+
+ * Business to DevOps (BizDevOps),
+ * Security to DevOps (SecDevOps)
+ * Information to DevOps (DataDevOps)
+ * Loosely coupled technical services while bringing together and delighting all stakeholders
+ * Building potentially consumable solutions every two weeks or faster
+ * Collecting, measuring, analyzing, displaying, and automating actionable insight through the DevOps processes from concept through live production use
+ * Continuous improvement following a Kaizen and disciplined agile approach
+
+
+
+### The next stage in the development of DevOps
+
+
+
+Will DevOps ultimately be considered hype—a collection of more tech thrown at corporations and added to the already extensive list of buzzwords? Time, of course, will tell how DevOps will progress. However, DevOps' DNA must continue to mature and be refined, and developers must understand that it is neither a silver bullet nor a remedy to cure all ailments and solve all problems.
+
+```
+DevOps != Agile != Lean Thinking != Waterfall
+
+DevOps != Tools !=Technology
+
+DevOps Ì Agile Ì Lean Thinking Ì Waterfall
+```
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/11/analyzing-devops
+
+作者:[Willy-Peter Schaub][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/wpschaub
+[b]: https://github.com/lujun9972
+[1]: https://en.wikipedia.org/wiki/Kanban
+[2]: https://airbrake.io/blog/sdlc/waterfall-model
+[3]: https://en.wikipedia.org/wiki/Toyota_Production_System
+[4]: https://www.lean.org/WhatsLean/Principles.cfm
+[5]: http://agilemanifesto.org/
+[6]: https://www.agilealliance.org/agile101
+[7]: http://agilemanifesto.org/principles.html
+[8]: https://books.google.com/books?id=CwvBEKsCY2gC
+[9]: http://www.disciplinedagiledelivery.com/books/
+[10]: https://en.wikipedia.org/wiki/Disciplined_agile_delivery
+[11]: https://en.wikipedia.org/wiki/Extreme_programming
+[12]: https://www.scrum.org/resources/what-is-scrum
+[13]: https://en.wikipedia.org/wiki/Rational_Unified_Process
+[14]: http://donovanbrown.com/
+[15]: http://www.opengroup.org/togaf
diff --git a/sources/talk/20181114 Is your startup built on open source- 9 tips for getting started.md b/sources/talk/20181114 Is your startup built on open source- 9 tips for getting started.md
new file mode 100644
index 0000000000..678eb96a59
--- /dev/null
+++ b/sources/talk/20181114 Is your startup built on open source- 9 tips for getting started.md
@@ -0,0 +1,76 @@
+Is your startup built on open source? 9 tips for getting started
+======
+Are open source businesses all that different from normal businesses?
+
+
+When I started [Gluu][1] in 2009, I had no idea how difficult it would be to start an open source software company. Using the open source development methodology seemed like a good idea, especially for infrastructure software based on protocols defined by open standards. By nature, entrepreneurs are optimistic—we underestimate the difficulty of starting a business. However, Gluu was my fourth business, so I thought I knew what I was in for. But I was in for a surprise!
+
+Every business is unique. One of the challenges of serial entrepreneurship is that a truth that was core to the success of a previous business may be incorrect in your next business. Building a business around open source forced me to change my plan. How to find the right team members, how to price our offering, how to market our product—all of these aspects of starting a business (and more) were impacted by the open source mission and required an adjustment from my previous experience.
+
+A few years ago, we started to question whether Gluu was pursuing the right business model. The business was growing, but not as fast as we would have liked.
+
+One of the things we did at Gluu was to prepare a "business model canvas," an approach detailed in the book [Business Model Generation: A Handbook for Visionaries, Game Changers, and Challengers][2] by Yves Pigneur and Alexander Osterwalder. This is a thought-provoking exercise for any business at any stage. It helped us consider our business more holistically. A business is more than a stream of revenue. You need to think about how you segment the market, how to interact with customers, what are your sales channels, what are your key activities, what is your value proposition, what are your expenses, partnerships, and key resources. We've done this a few times over the years because a business model naturally evolves over time.
+
+In 2016, I started to wonder how other open source businesses were structuring their business models. Business Model Generation talks about three types of companies: product innovation, customer relationship, and infrastructure.
+
+ * Product innovation companies are first to market with new products and can get a lot of market share because they are first.
+ * Customer relationship companies have a wider offering and need to get "wallet share" not market share.
+ * Infrastructure companies are very scalable but need established operating procedures and lots of capital.
+
+
+
+![Open Source Underdogs podcast][4]
+
+Mike Swartz, CC BY
+
+It's hard to figure out what models and types of business other open source software companies are pursuing by just looking at their website. And most open source companies are private—so there are no SEC filings to examine.
+
+To find out more, I went to the web. I found a [great talk][5] from Mike Olson, Founder and Chief Strategy Officer at Cloudera, about open source business models. It was recorded as part of a Stanford business lecture series. I wanted more of these kinds of talks! But I couldn't find any. That's when I got the idea to start a podcast where I interview founders of open source companies and ask them to describe what business model they are pursuing.
+
+In 2018, this idea became a reality when we started a podcast called [Open Source Underdogs][6]. So far, we have recorded nine episodes. There is a lot of great content in all the episodes, but I thought it would be fun to share one piece of advice from each.
+
+### Advice from 9 open source businesses
+
+**Peter Wang, CTO of Anaconda: **"Investors coming in to help put more gas in your gas tank want to understand what road you're on and how far you want to go. If you can't communicate to investors on a basis that they understand about your business model and revenue model, then you have no business asking them for their money. Don't get mad at them!"
+
+**Jim Thompson, Founder of Netgate: **"Businesses survive at the whim of their customers. Solving customer problems and providing value to the business is literally why you have a business!"
+
+**Michael Howard, CEO of MariaDB: **"My advice to open source software startups? It depends what part of the stack you're in. If you're infrastructure, you have no choice but to be open source."
+
+**Ian Tien, CEO of** **Mattermost: ** "You want to build something that people love. So start with roles that open source can play in your vision for the product, the distribution model, the community you want to build, and the business you want to build."
+
+**Mike Olson, Founder and Chief Strategy Officer at Cloudera: **"A business model is a complex construct. Open source is a really important component of strategic thinking. It's a great distributed development model. It's a genius, low-cost distribution model—and those have a bunch of advantages. But you need to think about how you're going to get paid."
+
+**Elliot Horowitz, Founder of MongoDB: **"The most important thing, whether it's open source or not open source, is to get incredibly close to your users."
+
+**Tom Hatch, CEO of SaltStack: **"Being able to build an internal culture and a management mindset that deals with open source, and profits from open source, and functions in a stable and responsible way with regard to open source is one of the big challenges you're going to face. It's one thing to make a piece of open source software and get people to use it. It's another to build a company on top of that open source."
+
+**Matt Mullenweg, CEO of Automattic: **"Open source businesses aren't that different from normal businesses. A mistake that we made, that others can avoid, is not incorporating the best leaders and team members in functions like marketing and sales."
+
+**Gabriel Engel, CEO of RocketChat: **"Moving from a five-person company, where you are the center of the company, and it's easy to know what everyone is doing, and everyone relies on you for decisions, to a 40-person company—that transition is harder than expected."
+
+### What we've learned
+
+After recording these podcasts, we've tweaked Gluu's business model a little. It's become clearer that we need to embrace open core—we've been over-reliant on support revenue. It's a direction we had been going, but listening to our podcast's guests supported our decision.
+
+We have many new episodes lined up for 2018 and 2019, including conversations with the founders of Liferay, Couchbase, TimescaleDB, Canonical, Redis, and more, who are sure to offer even more great insights about the open source software business. You can find all the podcast episodes by searching for "Open Source Underdogs" on iTunes and Google podcasts or by visiting our [website][6]. We want to hear your opinions and ideas you have to help us improve the podcast, so after you listen, please leave us a review.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/11/tips-open-source-entrepreneurs
+
+作者:[Mike Schwartz][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/gluufederation
+[b]: https://github.com/lujun9972
+[1]: https://www.gluu.org/
+[2]: https://www.wiley.com/en-us/Business+Model+Generation%3A+A+Handbook+for+Visionaries%2C+Game+Changers%2C+and+Challengers-p-9780470876411
+[3]: /file/414706
+[4]: https://opensource.com/sites/default/files/uploads/underdogs_logo.jpg (Open Source Underdogs podcast)
+[5]: https://youtu.be/T_UM5PYk9NA
+[6]: https://opensourceunderdogs.com/
diff --git a/sources/talk/20181121 10 ways to give thanks to open source and free software maintainers.md b/sources/talk/20181121 10 ways to give thanks to open source and free software maintainers.md
new file mode 100644
index 0000000000..67951fce7c
--- /dev/null
+++ b/sources/talk/20181121 10 ways to give thanks to open source and free software maintainers.md
@@ -0,0 +1,58 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: subject: (10 ways to give thanks to open source and free software maintainers)
+[#]: via: (https://opensource.com/article/18/11/ways-give-thanks-open-source)
+[#]: author: (Moshe Zadka https://opensource.com/users/moshez)
+[#]: url: ( )
+
+10 ways to give thanks to open source and free software maintainers
+======
+How to express your gratitude.
+
+
+Every day, I use high-quality software that is developed and maintained by people who do not ask for payment, who respect my freedoms, and who are generous with their time and energy.
+
+In this season of giving thanks, I encourage those of you who also use and appreciate the work of open source and free software maintainers to express your gratitude. Here are ten ways to do that:
+
+### Easy to do
+
+ 1. Send an e-mail thanking the developers. Be specific—tell them what you are using their software for and how it has benefited you.
+ 2. Use your favorite social media platform to spread the word.
+ 3. Write a blog post about your favorite software.
+
+
+
+### Give money
+
+ 4. If your favorite open source projects accept donations, send money.
+ 5. If you are employed by a company that uses open source software, see if you can convince management to sponsor some of the projects.
+ 6. Offer to match donations up to a set amount. It is amazing what social motivation can do!
+
+
+
+### Give time
+
+ 7. Help review patches.
+ 8. Help triage bugs.
+ 9. Answer questions on IRC, mailing lists, or [Stack Overflow][1].
+
+
+
+**10. Bonus:** If you are like me, you have at some point said harsh words to other people in the open source community. Commit to do better: Communicate with kindness and openness. The best way to give thanks is to make the open source community a place where people feel comfortable communicating.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/11/ways-give-thanks-open-source
+
+作者:[Moshe Zadka][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/moshez
+[b]: https://github.com/lujun9972
+[1]: https://meta.stackoverflow.com/
diff --git a/sources/talk/20181121 A Closer Look at Voice-Assisted Speakers.md b/sources/talk/20181121 A Closer Look at Voice-Assisted Speakers.md
new file mode 100644
index 0000000000..c3f477c0c3
--- /dev/null
+++ b/sources/talk/20181121 A Closer Look at Voice-Assisted Speakers.md
@@ -0,0 +1,125 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: subject: (A Closer Look at Voice-Assisted Speakers)
+[#]: via: (https://www.linux.com/blog/2018/11/closer-look-voice-assisted-speakers)
+[#]: author: (Eric Brown https://www.linux.com/users/ericstephenbrown)
+[#]: url: ( )
+
+A Closer Look at Voice-Assisted Speakers
+======
+
+
+
+U.S. consumers are expected to drop a bundle this Black Friday on smart speakers and home hubs. A Nov. 15 [Canalys report][1] estimates that shipments of voice-assisted speakers grew 137 percent in Q3 2018 year-to-year and are on the way to 75 million-unit sales in 2018. At the recent [Embedded Linux Conference and Open IoT Summit][2] in Edinburgh, embedded Linux developer and [Raspberry Pi HAT][3] creator Leon Anavi of the Konsulko Group reported on the latest smart speaker trends.
+
+As Anavi noted in his “Comparison of Voice Assistant SDKs for Embedded Linux Devices” talk, conversing with computers became a staple of science fiction over half a century ago. Voice technology is interesting “because it combines AI, big data, IoT, and application development,” said Anavi.
+
+In Q3 2017, Amazon and Google owned the industry with 74.7 percent and 24.6 percent, respectively, said Canalys. A year later, the percentages were down to 31.9 and 29.8. China-based Alibaba and Xiaomi almost equally split another 21.8 percent share, followed by 17.4 percent for “others,” which mostly use Amazon Alexis, and increasingly, Google Assistant.
+
+Despite the success of the mostly Linux-driven smart speaker market, Linux application developers have not jumped into voice app development in the numbers one might expect. In part, this is due to reservations about Google and [Amazon privacy safeguards][4], as well as the proprietary nature of the hardware and cloud software.
+
+“Privacy is a concern with smart speakers,” said Anavi. “You can’t fully trust a corporation if the product is not open source.”
+
+Anavi summarized the Google and Amazon SDKs but spent more time on the fully open source Mycroft Mark. Although Anavi clearly prefers Mycroft, he encouraged developers to investigate all the platforms. “There is a huge demand in the market for these devices and a lot of opportunity for IoT integration, from writing new skills to integrating voice assistants in consumer electronics devices,” said Anavi.
+
+### Alexa/Echo
+
+Amazon’s Alexa debuted in the Echo smart speaker four years ago. Amazon has since expanded to the Echo branded Dot, Spot, Tap, and Plus speakers, as well as the Echo Show and new [Echo Show 2][5] display hubs.
+
+The market leading Echo devices run on Amazon’s Linux- and Android-based Fire OS. The original Echo and Dot ran on the Cortex-A8-based TI DM3725 SoC while more recent devices have moved to an Armv8 MediaTek MT8163V SoC with 256MB RAM and 4GB flash.
+
+Thanks to Amazon’s wise decision to release an Apache 2.0 licensed Alexa Voice Services (AVS) SDK, Alexa also runs on most third-party hubs. The SDK includes an Alexa Skills Kit for creating custom Skills. The cloud platform required to make Alexa devices work is not open source, however, and commercial vendors must sign an agreement and undergo a certification process.
+
+Alexa runs on a variety of hardware [including the Raspberry Pi][6], as well as smart devices ranging from the Ecobee4 Smart Thermostat to the LG Hub Robot. Microsoft recently began [selling Echo devices][7], and earlier this year partnered with Amazon to integrate Alexa with its own Cortana voice agent in devices. This week, Microsoft announced that users can [voice-activate Skype calls][8] via Alexa on Echo devices.
+
+### Google Assistant/Home
+
+The Google Assistant voice agent debuted on the Google Home smart speaker in 2016. It has since expanded to the Echo Dot-like Home Mini, which like the Home runs on a 1.2GHz dual-core Cortex-A7 Marvell Armada 1500 Mini Plus with 512MB RAM and 4GB flash. This year’s [Home Max][9] offered improved speakers and advanced to a 1.5GHz, quad-core Cortex-A53 processor. More recently, Google launched the touchscreen enabled [Google Home Hub][10].
+
+The Google Home devices run on a version of the Linux-based Google Cast OS. Like Alexa, the Python driven [Google Assistant SDK][11] lets you add the voice agent to third-party devices. However, it’s still in preview stage and lacks an open source license. Developers can create applications with [Google Actions][12].
+
+Last year, Google [launched][13] a version of its Google Assistant SDK for the Raspberry Pi 3 and began selling an [AIY Voice Kit][14] that runs on the Pi. There’s also a kit that runs on the Orange Pi, said Anavi.
+
+This year, Google has aggressively [courted hardware partners][15] to produce home hub devices that combine Assistant with Google’s proprietary [Android Things][16]. The devices run on a variety of Arm-based SoCs led by the Qualcomm SD212 Home Hub Platform.
+
+The SDK expansion has resulted in a variety of third-party devices running Assistant, including the Lenovo Smart Display and the just released [LG XBOOM AI ThinQ WK9][17] touchscreen hubs. Sales of Google Home devices outpaced Echo earlier this year, although Amazon regained the lead in Q3, says Canalys.
+
+Like Alexa, but unlike Mycroft, Google Assistant offers multilingual support. The latest version supports follow-up questions without having to repeat the activation word, and there’s a voice match feature that can recognize up to six users. A new Google Duplex feature accomplishes real-world tasks through natural phone conversations.
+
+### Mycroft/Mark
+
+Anavi’s favorite smart speaker is the Linux-driven, open source (Apache 2.0 and CERN) [Mycroft][18]. The Raspberry Pi based [Mycroft Mark 1][19] speaker was certified by the Open Source Hardware Association (OSHA).
+
+The [Mycroft Mark II][20] launched on Kickstarter in January and has received $450,000 in funding. This Xilinx [Zynq UltraScale+ MPSoC][21] driven home hub integrates Aaware’s far-field [Sound Capture][22] technology. A [Nov. 15 update post][23] revealed that the Mark II will miss its December ship date.
+
+Kansas City-based Mycroft has raised $2.5 million from institutional investors and is now seeking funding on [StartEngine][24]. Mycroft sees itself as a software company and is encouraging other companies to build the Mycroft Core platform and Mycroft AI voice agent into products. The company offers an enterprise server license to corporate customers for $1,500 a month, and there’s a free, Raspbian based [Picroft][25] application for the Raspberry Pi. A Picroft hardware kit is under consideration.
+
+Mycroft promises that user data will never be saved without an opt-in (to improve machine learning algorithms), and that it will never be used for marketing purposes. Like Alexa and Assistant, however, it’s not available offline without a cloud service, a feature that would better ensure privacy. Anavi says the company is working on an offline option.
+
+The Mycroft AI agent is enabled via a Python based Mycroft Pulse SDK, and a Mycroft Skills Manager is available for Skills development. Like Alexa and Assistant, Mycroft supports custom wake words. The new version uses its homegrown [Precise][26] wake-word listener technology in place of the earlier PocketSphinx. There’s also an optional device and account management stack called Mycroft Home.
+
+For text-to-speech (TTS), Mycroft defaults to the open source [Mimic][27], which is co-developed with VocaliD. It also supports eSpeak, MaryTTS, Google TTS, and FATTS.
+
+Mycroft lacks its own speech to-text (STT) engine, which Anavi calls “the biggest challenge for an open source voice assistant.” Instead, it defaults to Google STT and supports [IBM Watson STT][28] and [wit.ai][29].
+
+Mycroft is collaborating with Mozilla on its open source [DeepSpeech][30] STT, an open source TensorFlow implementation of [Baidu’s DeepSpeech][31] platform. Baidu trails Alibaba and Xiaomi in the [Chinese voice assistant][32] market but is one of the fastest growing voice AI companies. Just as Alibaba uses its homegrown, Alexa-like AliGenie agent on its Tmall Genie speaker, Baidu loads its [speakers][33] with its DeepSpeech-driven [DuerOS][34] voice platform. Xiaomi has used Alexa and Cortana.
+
+Mycroft is the most mature of several alternative voice AI projects that promise improved privacy safeguards. A recent [VentureBeat][35] article reported on emerging privacy-oriented technologies including [Snips][36] and [SoundHound][37].
+
+Anavi concluded with some demo videos showing off his soothing, Bulgarian AI whisperer vocal style. “I try to be polite with these things,” said Anavi. “Someday they may rule the world and I want to survive.”
+
+Anavi’s video presentation can be seen here:
+
+
+--------------------------------------------------------------------------------
+
+via: https://www.linux.com/blog/2018/11/closer-look-voice-assisted-speakers
+
+作者:[Eric Brown][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.linux.com/users/ericstephenbrown
+[b]: https://github.com/lujun9972
+[1]: https://www.canalys.com/newsroom/amazon-reclaims-top-spot-in-smart-speaker-market-in-q3-2018
+[2]: https://events.linuxfoundation.org/events/elc-openiot-europe-2018/
+[3]: http://linuxgizmos.com/phat-adds-ir-to-the-raspberry-pi/
+[4]: https://qz.com/1288743/amazon-alexa-echo-spying-on-users-raises-a-data-privacy-problem/
+[5]: https://www.techadvisor.co.uk/review/digital-home/amazon-echo-show-2-3685964/
+[6]: https://www.linux.com/news/event/open-source-summit-na/2017/3/add-skills-your-raspberry-pi-alexa
+[7]: https://www.theverge.com/2018/11/17/18099978/microsoft-store-amazon-echo-devices
+[8]: https://www.engadget.com/2018/11/19/alexa-can-now-make-skype-calls/
+[9]: https://store.google.com/us/product/google_home_max?hl=en-US
+[10]: https://arstechnica.com/gadgets/2018/10/google-home-hub-under-the-hood-its-nothing-like-other-google-smart-displays/
+[11]: https://developers.google.com/assistant/sdk/overview
+[12]: https://developers.google.com/actions/
+[13]: http://linuxgizmos.com/google-assistant-sdk-dev-preview-brings-voice-agent-to-the-raspberry-pi/
+[14]: http://linuxgizmos.com/googles-updated-aiy-vision-and-voice-kits-ship-with-raspberry-pi-zero-wh/
+[15]: http://linuxgizmos.com/android-things-and-google-assistant-appear-in-new-smart-speakers-smart-displays-and-coms/
+[16]: https://www.linux.com/blog/2018/5/android-things-10-offers-free-ota-updates-restrictions
+[17]: https://www.engadget.com/2018/11/20/lg-wk9-google-assistant-smart-speaker/
+[18]: https://mycroft.ai/
+[19]: http://linuxgizmos.com/open-source-echo-like-gizmo-is-halfway-to-kickstarter-gold/
+[20]: http://linuxgizmos.com/open-source-voice-assistant-promises-user-privacy/
+[21]: http://linuxgizmos.com/16nm-zynq-soc-mixes-cortex-a53-fpga-cortex-r5/
+[22]: https://aaware.com/technology/
+[23]: https://www.kickstarter.com/projects/aiforeveryone/mycroft-mark-ii-the-open-voice-assistant/posts/2344940
+[24]: https://www.startengine.com/mycroft-ai
+[25]: https://mycroft.ai/documentation/picroft/#hardware-prerequisites
+[26]: https://mycroft.ai/documentation/precise/
+[27]: https://mycroft.ai/documentation/mimic/
+[28]: http://linuxgizmos.com/whipping-up-ibm-watson-voice-services-with-openwhisk/
+[29]: https://wit.ai/
+[30]: https://github.com/mozilla/DeepSpeech
+[31]: http://research.baidu.com/Blog/index-view?id=90
+[32]: https://www.cbinsights.com/research/china-voice-assistants-smart-speakers-ai/
+[33]: https://www.theverge.com/ces/2018/1/8/16866068/baidu-smart-speakers-dueros-ces-2018
+[34]: https://dueros.baidu.com/en/index.html
+[35]: https://venturebeat.com/2018/07/14/alexa-alternatives-have-a-secret-weapon-privacy/
+[36]: https://snips.ai/
+[37]: https://soundhound.com/
diff --git a/sources/talk/20181121 DevOps is for everyone.md b/sources/talk/20181121 DevOps is for everyone.md
new file mode 100644
index 0000000000..075046f615
--- /dev/null
+++ b/sources/talk/20181121 DevOps is for everyone.md
@@ -0,0 +1,75 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: subject: (DevOps is for everyone)
+[#]: via: (https://opensource.com/article/18/11/how-non-engineer-got-devops)
+[#]: author: (Dawn Parych https://opensource.com/users/dawnparzych)
+[#]: url: ( )
+
+DevOps is for everyone
+======
+
+A non-engineer explains why you don't need to be a developer or an operations person to fall for DevOps.
+
+
+
+I've never held a job as a developer nor in operations—so what am I doing writing an article about [DevOps][1]? I've always been interested in computers and technology. I also have a passion for people, psychology, and helping others. When I first heard about DevOps, the concept piqued my interest, as it seemed to merge many of the things I was interested in, even if I don't write code.
+
+My first computer was a TRS-80, and I loved writing BASIC programs on it. I took the only two computer programming classes my high school offered. A few years later, I started a computer company. I made custom mailing labels, stationery, and built a database to store addresses.
+
+The problem was I didn't enjoy writing code. I wanted to teach and to help people, and I didn't see writing code as an opportunity to do this. Yes, technology can help people and change lives, but writing code didn't spark my passion. I need to feel excited about my work and do something I love.
+
+ * The culture, not the code
+ * The journey, not the result
+ * Building an environment where everybody can continuously improve
+ * Communicating and collaborating, not working independently
+
+
+
+I found that I love DevOps. To me, DevOps is about:
+
+Ultimately, DevOps is about being part of a community working towards the same goal. DevOps merges psychology, people, and technology. DevOps isn't a job title; it is a philosophy for life and work.
+
+### Finding my people
+
+Almost four years ago, I attended my first [DevOpsDays][2] conference in Seattle. I felt like I had found my people. I felt welcomed and accepted, even though I work in marketing and don't have a computer science degree. I could geek out over psychology and technology.
+
+At DevOpsDays, I learned about the ["Three Ways" of DevOps][3]—flow, feedback, and continuous experimentation and learning—and new (to me) concepts such as Kaizen and Kaikaku. As I learned, I found myself saying things like, "I do this! I didn't know there was a name for this!"
+
+[Kaizen][4] is the practice of continuous improvement and learning. Small, incremental changes over time can yield significant results. I found parallels between this and Carol Dweck's idea of a [growth mindset][5]. People aren't born experts. Becoming skilled at something takes time, practice, and often failure. Recognizing incremental improvement is necessary to make sure we don't give up.
+
+[Kaikaku][6], on the other hand, is the notion that small changes over time sometimes won't work, and you need to make a radical or disruptive change. Quitting a job without having a new one lined up or moving to a new city can be pretty disruptive—yes, I've done both. But these radical changes can reap great rewards. I might not have learned about DevOps if I hadn't quit my job and taken some time off. Once I decided to return to work, I kept hearing about DevOps and started researching it. This led me to attend my first DevOpsDays, where I began to see all my passions come together. Since then, I have presented at five DevOpsDays and regularly write about DevOps topics.
+
+### Putting the Three Ways to work
+
+Change is hard and learning something new can be scary. The Three Ways of DevOps provide a framework for managing change. For example: How is information flowing? What is driving you to make a change? Once you know a change is needed, how do you get feedback about whether the changes you are making are the right changes? How do you know if you're making progress? Feedback is essential and should include both positive and constructive elements. The hard part is making sure the constructive elements don't outweigh the positive.
+
+For me, the third Way—continuous experimentation and learning—is the most important part of DevOps. Having an environment where people are free to experiment and take risks can lead to unexpected outcomes. Sometimes those outcomes are good, sometimes not so good—and that's OK. Creating an environment where it is acceptable if things don't work out encourages people to take risks. We should all strive to continuously experiment and learn something new on a regular basis.
+
+The Three Ways of DevOps provides a method of trying something, getting feedback, and learning from our mistakes. A few years ago, my son told me, "I don't ever want to be the best at something, because then I can't learn from my mistakes." We all make mistakes, and learning from them helps us grow and improve. We aren't willing to make mistakes if our culture doesn't support experimentation and learning.
+
+### Being part of the community
+
+I've worked in technology for over 20 years and often felt like an outsider until I found the DevOps community. If you're like me—passionate about technology but not the engineering or operations side of things—you can still be a part of DevOps, even if you work in sales, marketing, product marketing, technical writing, support, and more. DevOps is for everyone.
+
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/11/how-non-engineer-got-devops
+
+作者:[Dawn Parych][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/dawnparzych
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/resources/devops
+[2]: https://www.devopsdays.org/
+[3]: https://itrevolution.com/the-three-ways-principles-underpinning-devops/
+[4]: https://en.wikipedia.org/wiki/Kaizen
+[5]: https://en.wikipedia.org/wiki/Mindset#Fixed_and_growth
+[6]: https://en.wikipedia.org/wiki/Kaikaku
diff --git a/sources/talk/20181127 What the open source community means to me.md b/sources/talk/20181127 What the open source community means to me.md
new file mode 100644
index 0000000000..bdb43bf20c
--- /dev/null
+++ b/sources/talk/20181127 What the open source community means to me.md
@@ -0,0 +1,94 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: subject: (What the open source community means to me)
+[#]: via: (https://opensource.com/article/18/11/what-open-source-community-means-me)
+[#]: author: ([Florian Effenberger](https://opensource.com/users/floeff))
+[#]: url: ( )
+
+What the open source community means to me
+======
+Contributing to open source is more than a way to make better software; it can enrich your entire life.
+
+
+Every time I tell my friends about my hobby—which became my career as the executive director at [The Document Foundation][1]—I face lots of questions. A worldwide community? Contributors around the globe? An open source community? Can you eat that?!
+
+Well, actually [sometimes you can][2] eat it. But seriously, today, I'd like to share my very personal view about what the open source community means to me and why being active is not only fun but also benefits your whole life.
+
+### A long, long time ago…
+
+Back in the good old days (around 2003 or 2004) when I was in my early twenties, I was a casual open source user. Flat-rate broadband connections had just become common, which suddenly made communication around the globe possible for everyone. More and more free software (not just Linux) made its way onto people's computers. Long before we had open source operating systems for smartphones and the Internet of Things, we could download open source email clients, browsers, and other software. Like many other people, my primary motivation was price, simply because the programs were free of charge. I saw hints that these applications were driven by a community, but I didn't fully understand what that meant. Since I wasn't a developer, having access to the source code was not a compelling reason for me to use open source—neither the software nor I would have gotten any advantage if I'd started coding.
+
+### From user to community member
+
+In those early days, the idea of a free office suite was tempting, so I installed OpenOffice on my computer. More out of coincidence than a plan, I subscribed to the project's mailing list. My curiosity was much larger than my understanding, but luckily that didn't keep me from doing things.
+
+Time went by, autumn arrived, and the inevitable trade show season started again. Without really knowing what the heck I was doing, I offered to help OpenOffice.org at a Munich trade show, even though I had neither any clue about trade shows nor about the software itself—conditions couldn't have been worse, actually. I have always been quite skeptical and a bit shy, but that probably contributed to the fact that this was the best-documented trade show we'd ever had and quite a success for us.
+
+I also met a colleague, whom I still work closely with, who took me under his wing. He never gave me the feeling that I was a useless rookie; on the contrary, from the very beginning, I was treated as a full and respected member of the community whose opinion mattered. Soon I became responsible for things that I had never done on a professional basis. To my surprise, it was a lot of fun and ultimately started something that shaped my life very much.
+
+### Credit of trust
+
+Unlike large corporations with their hierarchies and complex structures, in open source, I could start doing the things that interested me almost immediately. I could work in a very relaxed and easy way, which made it a whole lot of fun.
+
+This credit of trust I received from the community is something that still touches me. After contributing in some areas—opportunities I owe to people who believed in me from the very beginning—I had the honor of meeting a wonderful human being, my mentor and good friend [John McCreesh][3], who sadly passed away in 2016. I had the joy of working with him to shape our project's international marketing. Even today, it is hard to believe this credit of trust, and I deeply value it as a gift that is anything but usual.
+
+Over time, I was introduced to more and more areas—along with marketing, I was also responsible for distributing files on our mirror network, co-organizing several events, and co-founding what is most likely the first German foundation [tailored specifically for the open source community][4].
+
+### Friends around the world
+
+Over the years I've met lots of wonderful human beings through my open source activities. Not just colleagues or contacts, but true friends who live around the globe. We not only share an interest in our community but also lots of private moments and wonderful discussions.
+
+We don't often meet in person due to distance, but that lack of proximity doesn't affect the mutual trust we share. One of my favorite memories is of meeting a friend from Rio de Janeiro, whom I've known since early 2000 when I helped him with a problem on his Linux server. We didn't meet in person until 2013; even though we'd never been in the same room throughout our friendship and the language barriers were high, we had an amazing evening among two good friends, 10,000km from home. We are in regular contact to this day.
+
+### Broaden your mind
+
+Having friends around the globe also gives you amazing insight and widens your scope, helping you redefine your point of view. Heading to the Vatican after a conference in Italy, my friend John once commented how fascinating it is seeing all the places free software can bring you.
+
+During trips to foreign countries to attend conferences, my local colleagues help me learn a lot about life in other countries. I've met contributors from high-poverty countries, people with very touching personal stories, and colleagues who took long trips to English-speaking conferences despite large language barriers. I admire these people for taking these chances.
+
+My colleagues' lives and credentials are often truly inspiring, as open source projects are open to everyone, independent of age, profession, and education. It's clear that the supposed barriers of culture, language, and time exist only in our heads—and they can be crossed in harmony. This is an important model for everyone, especially in these complicated times.
+
+Meeting people from other cultures and learning about their lives helps me think about the world in new ways. When I read news reports about violence and war in countries where I have friends and colleagues, I worry about their well-being. Suddenly all the anonymous pain and suffering has a name and a face, and looking away is no longer an option.
+
+### A life's philosophy
+
+To me, open source is not just a license or a development model—it's an open mentality of mutual respect for everyone, trust in newbies, appreciation and value for other people's opinions, joint goals, and shared ideals. Open source involves data privacy, civil rights, free knowledge, open standards, and much more. I often say it's a philosophy of life by its own.
+
+Like in any social group, open source projects are full of discussions, arguments, and discrepancies—very often you'll meet strong characters and learn that email communication can lead to a lot of confusion and misunderstanding. Still, none of this disention changes the very open, motivated, and motivating attitude of contributors. This creates an incredibly welcoming and inviting environment, which (in addition to the technical aspect) reveals a wonderful, human side of things.
+
+### Reality of life
+
+After all these years, open source has finally arrived, thanks to so many people spreading the word and living the ideals. Ten to 12 years ago, we were like aliens at trade shows, but nowadays, not only are the development and license model well recognized, but open source is an integral part of many companies' business. I'm delighted that more and more companies understand the open source model, contribute to it, act according to its principles, and therefore become an equal part of the open source community. This shows that the open source model has become mature.
+
+I am skeptical, however, of the growing use of the term "community," as it seems any company with more than a handful of users on their platform claims membership, even if they are far more interested in marketing their product than serving the community. Nonetheless, it's great to see even conservative companies opening up to collaborate with their customers and the general public.
+
+### The future is open
+
+Even after more than 15 years in open source, every day is a new beginning, every day is exciting, there's always something new to discover, and the number of successes grows as the challenges do.
+
+I am quite excited and curious where things will lead—not only in the projects and the code but even more in users' and decision-makers' minds. We all benefit, at least indirectly, from the achievements of the projects and the people driving them.
+
+I'm certain the open source community will continue bringing me in touch with new topics and connecting me to new people who'll enrich my life. I am proud and happy to be a part of this movement, which allows me to experience how mutual respect, trust, and shared ideals help move things forward.
+
+This was originally published on [Florian Effenberger][5]'s blog and is reprinted with permission.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/11/what-open-source-community-means-me
+
+作者:[Florian Effenberger][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/floeff
+[b]: https://github.com/lujun9972
+[1]: https://www.documentfoundation.org/
+[2]: https://opensource.com/article/18/9/open-source-cooking
+[3]: https://blog.documentfoundation.org/blog/2016/01/24/r-i-p-john-mccreesh/
+[4]: https://blog.documentfoundation.org/blog/2012/02/20/the-document-foundation-officially-incorporated-in-berlin-germany/
+[5]: https://blog.effenberger.org/2016/04/28/what-the-open-source-community-means-to-me/
diff --git a/sources/tech/20111221 30 Best Sources For Linux - -BSD - Unix Documentation On the Web.md b/sources/tech/20111221 30 Best Sources For Linux - -BSD - Unix Documentation On the Web.md
index 6a4d1f4828..06154bdb9c 100644
--- a/sources/tech/20111221 30 Best Sources For Linux - -BSD - Unix Documentation On the Web.md
+++ b/sources/tech/20111221 30 Best Sources For Linux - -BSD - Unix Documentation On the Web.md
@@ -1,4 +1,7 @@
-30 Best Sources For Linux / *BSD / Unix Documentation On the We
+ScarboroughCoral translating!
+
+
+30 Best Sources For Linux / *BSD / Unix Documentation On the Web
======
diff --git a/sources/talk/20170523 Best Websites to Download Linux Games.md b/sources/tech/20170523 Best Websites to Download Linux Games.md
similarity index 100%
rename from sources/talk/20170523 Best Websites to Download Linux Games.md
rename to sources/tech/20170523 Best Websites to Download Linux Games.md
diff --git a/sources/tech/20171027 Scout out code problems with SonarQube.md b/sources/tech/20171027 Scout out code problems with SonarQube.md
deleted file mode 100644
index d1ce25131c..0000000000
--- a/sources/tech/20171027 Scout out code problems with SonarQube.md
+++ /dev/null
@@ -1,67 +0,0 @@
-Translating by Jamkr
-
-Scout out code problems with SonarQube
-======
-
-
-More and more organizations are implementing [DevOps][1] to make it faster to get quality code into the production environment after passing through the intermediate development and testing environments. Although things such as version control, continuous integration and deployment, and automated testing all fall under the scope of DevOps, one critical question remains: How can an organization quantify code quality, not just deployment speed?
-
-[SonarQube][2] is one option to fill this gap. It is an open source platform that continually inspects code quality via automatic static analysis of the source code. SonarQube can analyze more than 20 coding languages and store issues on all sorts of project types.
-
-SonarQube also offers a centralized location for maintaining and managing code issues within multiple, multi-language projects simultaneously. Custom rules can be implemented per project. Continuous inspection permits the analysis of the overall trajectory of the code's health.
-
-SonarQube can also be integrated into continuous integration and development (CI/CD) pipelines, assisting in and automating the process of determining the code's readiness for the production environment.
-
-### What it can measure
-
-Out of the box, SonarQube can measure key metrics, including bugs, code smells, security vulnerabilities, and duplicated code.
-
- * **Bugs** are portions of code that are incorrect or likely functioning improperly, thus producing potentially erroneous results. These are obvious errors that should be fixed before the code is released to production.
- * **[Code smells][3]** differ from bugs in that the detected code likely functions correctly and as intended. However, it may be hard to maintain, lead to future bugs, be uncovered by unit tests, or have other problems. For long-term maintainability, it's smart to fix code smells right away. It's generally hard to detect code smells when writing code, but SonarQube's static analysis is one way to discover them.
- * **Security vulnerabilities** are exactly as they sound: a flaw somewhere in the code that may present a security issue. These vulnerabilities should be fixed to prevent hackers from exploiting them.
- * **Duplicated code** is also exactly as it sounds: portions of code that are repeated in the source code. Code duplication is a bad practice in software design. On the whole, it leads to maintainability problems if changes are made to one portion but not another. Identifying code duplication makes it easier to package the duplicated code into a library for repeated use, for example.
-
-
-
-### What customization options exist
-
-Because it is open source, SonarQube encourages users to develop and offer customization options. Currently there are more than 60 [plugins][4] available to augment SonarQube's out-of-the-box analysis functionality.
-
-The majority of the plugins were created to increase the number of coding languages SonarQube can analyze. Other plugins enable analysis of extra metrics or include other views for the displayed dashboards. Essentially, if an organization needs to examine a custom metric, wants to view its analyzed data in specific ways on its own dashboard, or uses a coding language that SonarQube doesn't support, there are probably customization options available. If the needed functionality doesn't yet exist, the openness of SonarQube's source code makes it possible to develop custom solutions.
-
-Users can also customize the rules applied for each specific coding language analyzer. Rules can be selected and deselected per language and per project through SonarQube's user interface. These options recognize the need for project-specific rules, as well as maintaining all data and configurations in a central location.
-
-### Why it's important
-
-SonarQube provides a centralized location for organizations to manage and track issues in their code throughout multiple projects. It also allows continuous inspection combined with a quality gate. Once a project has been analyzed, further analyses update the original statistics, as the software is modified, to reflect the latest changes. This tracking allows users to view how well and how quickly code issues are being resolved, consistent with a "release early and release often" mentality.
-
-Additionally, SonarQube can be utilized in a [continuous integration pipeline][5], such as those run on tools like [Hudson][6] and [Jenkins][7]. The quality gate will reflect the overall health of the code and, by integrating with tools like Jenkins, can play an important role in deciding when to release code to the production environment.
-
-In the spirit of DevOps, SonarQube can quantify code quality to help organizations meet internal requirements. In order to speed the cycle of code production and release, organizations must be aware of their technical debt and software issues. By uncovering this information, SonarQube can help organizations more rapidly produce the highest quality software possible.
-
-### Want to learn more?
-
-SonarQube is licensed under the GNU Lesser General Public License, and its source code is available on [GitHub][8]. There is a growing community of users interested in SonarQube, its features, and its capabilities. There are active communities on [Twitter][9] and [Google][10]; these as well as the [SonarQube blog][11] are helpful for anyone interested in getting started with SonarQube.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/17/10/sonarqube
-
-作者:[Sophie Polson][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/sophiepolson
-[1]:https://en.wikipedia.org/wiki/DevOps
-[2]:https://www.sonarqube.org/
-[3]:https://en.wikipedia.org/wiki/Code_smell
-[4]:https://docs.sonarqube.org/display/PLUG/Plugin+Library
-[5]:https://jenkins.io/blog/2017/04/18/continuousdelivery-devops-sonarqube/
-[6]:https://en.wikipedia.org/wiki/Hudson_(software)
-[7]:https://en.wikipedia.org/wiki/Jenkins_(software)
-[8]:https://github.com/SonarSource/sonarqube
-[9]:https://twitter.com/SonarQube
-[10]:https://groups.google.com/forum/#!forum/sonarqube
-[11]:https://blog.sonarsource.com/
diff --git a/sources/tech/20171108 Continuous infrastructure- The other CI.md b/sources/tech/20171108 Continuous infrastructure- The other CI.md
index e1b22f8b43..757ec2a723 100644
--- a/sources/tech/20171108 Continuous infrastructure- The other CI.md
+++ b/sources/tech/20171108 Continuous infrastructure- The other CI.md
@@ -1,4 +1,5 @@
-translating by lujun9972
+Translating by Jamskr
+
Continuous infrastructure: The other CI
======

diff --git a/sources/tech/20171116 How to use a here documents to write data to a file in bash script.md b/sources/tech/20171116 How to use a here documents to write data to a file in bash script.md
deleted file mode 100644
index 5fe31f92cf..0000000000
--- a/sources/tech/20171116 How to use a here documents to write data to a file in bash script.md
+++ /dev/null
@@ -1,205 +0,0 @@
-translating by Flowsnow
-
-How to use a here documents to write data to a file in bash script
-======
-
-A here document is nothing but I/O redirection that tells the bash shell to read input from the current source until a line containing only delimiter is seen.
-[![redirect output of here document to a text file][1]][1]
-This is useful for providing commands to ftp, cat, echo, ssh and many other useful Linux/Unix commands. This feature should work with bash or Bourne/Korn/POSIX shell too.
-
-## heredoc syntax
-
-How do I use a heredoc redirection feature (here documents) to write data to a file in my bash shell scripts? [A here document][2] is nothing but I/O redirection that tells the bash shell to read input from the current source until a line containing only delimiter is seen.This is useful for providing commands to ftp, cat, echo, ssh and many other useful Linux/Unix commands. This feature should work with bash or Bourne/Korn/POSIX shell too.
-
-The syntax is:
-```
-command < my_output_file.txt
- mesg1
- msg2
- msg3
- $var on $foo
-EOF
-```
-
-OR **redirect and append it** to a file named my_output_file.txt:
-```
-command << EOF >> my_output_file.txt
- mesg1
- msg2
- msg3
- $var on $foo
-EOF
-```
-
-## Examples
-
-The following script will write the needed contents to a file named /tmp/output.txt:
-```
-#!/bin/bash
-OUT=/tmp/output.txt
-
-echo "Starting my script..."
-echo "Doing something..."
-
-cat <$OUT
- Status of backup as on $(date)
- Backing up files $HOME and /etc/
-EOF
-
-echo "Starting backup using rsync..."
-```
-
-
-You can view /tmp/output.txt with the [cat command][3]:
-`$ cat /tmp/output.txt`
-Sample outputs:
-```
- Status of backup as on Thu Nov 16 17:00:21 IST 2017
- Backing up files /home/vivek and /etc/
-
-```
-
-### Disabling pathname/parameter/variable expansion, command substitution, arithmetic expansion
-
-Variable such as $HOME and command such as $(date) were interpreted substitution in script. To disable it use single quotes with 'EOF' as follows:
-```
-#!/bin/bash
-OUT=/tmp/output.txt
-
-echo "Starting my script..."
-echo "Doing something..."
-# No parameter and variable expansion, command substitution, arithmetic expansion, or pathname expansion is performed on word.
-# If any part of word is quoted, the delimiter is the result of quote removal on word, and the lines in the here-document
-# are not expanded. So EOF is quoted as follows
-cat <<'EOF' >$OUT
- Status of backup as on $(date)
- Backing up files $HOME and /etc/
-EOF
-
-echo "Starting backup using rsync..."
-```
-
-#!/bin/bash OUT=/tmp/output.txtecho "Starting my script..." echo "Doing something..." # No parameter and variable expansion, command substitution, arithmetic expansion, or pathname expansion is performed on word. # If any part of word is quoted, the delimiter is the result of quote removal on word, and the lines in the here-document # are not expanded. So EOF is quoted as follows cat <<'EOF' >$OUT Status of backup as on $(date) Backing up files $HOME and /etc/ EOFecho "Starting backup using rsync..."
-
-You can view /tmp/output.txt with the [cat command][3]:
-`$ cat /tmp/output.txt`
-Sample outputs:
-```
- Status of backup as on $(date)
- Backing up files $HOME and /etc/
-
-```
-
-## A note about using tee command
-
-The syntax is:
-```
-tee /tmp/filename </dev/null
-line 1
-line 2
-line 3
-$(cmd)
-$var on $foo
-EOF
-```
-
-tee /tmp/filename </dev/null line 1 line 2 line 3 $(cmd) $var on $foo EOF
-
-Or disable variable substitution/command substitution by quoting EOF in a single quote:
-```
-tee /tmp/filename <<'EOF' >/dev/null
-line 1
-line 2
-line 3
-$(cmd)
-$var on $foo
-EOF
-```
-
-tee /tmp/filename <<'EOF' >/dev/null line 1 line 2 line 3 $(cmd) $var on $foo EOF
-
-Here is my updated script:
-```
-#!/bin/bash
-OUT=/tmp/output.txt
-
-echo "Starting my script..."
-echo "Doing something..."
-
-tee $OUT </dev/null
- Status of backup as on $(date)
- Backing up files $HOME and /etc/
-EOF
-
-echo "Starting backup using rsync..."
-```
-
-#!/bin/bash OUT=/tmp/output.txtecho "Starting my script..." echo "Doing something..."tee $OUT </dev/null Status of backup as on $(date) Backing up files $HOME and /etc/ EOFecho "Starting backup using rsync..."
-
-## A note about using in-memory here-docs
-
-Here is my updated script:
-```
-#!/bin/bash
-OUT=/tmp/output.txt
-
-## in memory here docs
-## thanks https://twitter.com/freebsdfrau
-exec 9<$OUT
-
-echo "Starting backup using rsync..."
-```
-
-
-
---------------------------------------------------------------------------------
-
-via: https://www.cyberciti.biz/faq/using-heredoc-rediection-in-bash-shell-script-to-write-to-file/
-
-作者:[Vivek Gite][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://www.cyberciti.biz
-[1]:https://www.cyberciti.biz/media/new/faq/2017/11/redirect-output-of-here-document-to-a-text-file.jpg
-[2]:https://bash.cyberciti.biz/guide/Here_documents
-[3]:https//www.cyberciti.biz/faq/linux-unix-appleosx-bsd-cat-command-examples/ (See Linux/Unix cat command examples for more info)
diff --git a/sources/tech/20171205 ANNOUNCING THE GENERAL AVAILABILITY OF CONTAINERD 1.0 THE INDUSTRY-STANDARD RUNTIME USED BY MILLIONS OF USERS.md b/sources/tech/20171205 ANNOUNCING THE GENERAL AVAILABILITY OF CONTAINERD 1.0 THE INDUSTRY-STANDARD RUNTIME USED BY MILLIONS OF USERS.md
deleted file mode 100644
index 80fe739969..0000000000
--- a/sources/tech/20171205 ANNOUNCING THE GENERAL AVAILABILITY OF CONTAINERD 1.0 THE INDUSTRY-STANDARD RUNTIME USED BY MILLIONS OF USERS.md
+++ /dev/null
@@ -1,102 +0,0 @@
-ANNOUNCING THE GENERAL AVAILABILITY OF CONTAINERD 1.0, THE INDUSTRY-STANDARD RUNTIME USED BY MILLIONS OF USERS
-============================================================
-
-Today, we’re pleased to announce that containerd (pronounced Con-Tay-Ner-D), an industry-standard runtime for building container solutions, has reached its 1.0 milestone. containerd has already been deployed in millions of systems in production today, making it the most widely adopted runtime and an essential upstream component of the Docker platform.
-
-Built to address the needs of modern container platforms like Docker and orchestration systems like Kubernetes, containerd ensures users have a consistent dev to ops experience. From [Docker’s initial announcement][22] last year that it was spinning out its core runtime to [its donation to the CNCF][23] in March 2017, the containerd project has experienced significant growth and progress over the past 12 months. .
-
-Within both the Docker and Kubernetes communities, there has been a significant uptick in contributions from independents and CNCF member companies alike including Docker, Google, NTT, IBM, Microsoft, AWS, ZTE, Huawei and ZJU. Similarly, the maintainers have been working to add key functionality to containerd.The initial containerd donation provided everything users need to ensure a seamless container experience including methods for:
-
-* transferring container images,
-
-* container execution and supervision,
-
-* low-level local storage and network interfaces and
-
-* the ability to work on both Linux, Windows and other platforms.
-
-Additional work has been done to add even more powerful capabilities to containerd including a:
-
-* Complete storage and distribution system that supports both OCI and Docker image formats and
-
-* Robust events system
-
-* More sophisticated snapshot model to manage container filesystems
-
-These changes helped the team build out a smaller interface for the snapshotters, while still fulfilling the requirements needed from things like a builder. It also reduces the amount of code needed, making it much easier to maintain in the long run.
-
-The containerd 1.0 milestone comes after several months testing both the alpha and version versions, which enabled the team to implement many performance improvements. Some of these,improvements include the creation of a stress testing system, improvements in garbage collection and shim memory usage.
-
-“In 2017 key functionality has been added containerd to address the needs of modern container platforms like Docker and orchestration systems like Kubernetes,” said Michael Crosby, Maintainer for containerd and engineer at Docker. “Since our announcement in December, we have been progressing the design of the project with the goal of making it easily embeddable in higher level systems to provide core container capabilities. We will continue to work with the community to create a runtime that’s lightweight yet powerful, balancing new functionality with the desire for code that is easy to support and maintain.”
-
-containerd is already being used by Kubernetes for its[ cri-containerd project][24], which enables users to run Kubernetes clusters using containerd as the underlying runtime. containerd is also an essential upstream component of the Docker platform and is currently used by millions of end users. There is also strong alignment with other CNCF projects: containerd exposes an API using [gRPC][25] and exposes metrics in the [Prometheus][26] format. containerd also fully leverages the Open Container Initiative (OCI) runtime, image format specifications and OCI reference implementation ([runC][27]), and will pursue OCI certification when it is available.
-
-Key Milestones in the progress to 1.0 include:
-
-
-
-Notable containerd facts and figures:
-
-* 1994 GitHub stars, 401 forks
-
-* 108 contributors
-
-* 8 maintainers from independents and and member companies alike including Docker, Google, IBM, ZTE and ZJU .
-
-* 3030+ commits, 26 releases
-
-Availability and Resources
-
-To participate in containerd: [github.com/containerd/containerd][28]
-
-* Getting Started with containerd: [http://mobyproject.org/blog/2017/08/15/containerd-getting-started/][8]
-
-* Roadmap: [https://github.com/containerd/containerd/blob/master/ROADMAP.md][1]
-
-* Scope table: [https://github.com/containerd/containerd#scope][2]
-
-* Architecture document: [https://github.com/containerd/containerd/blob/master/design/architecture.md][3]
-
-* APIs: [https://github.com/containerd/containerd/tree/master/api/][9].
-
-* Learn more about containerd at KubeCon by attending Justin Cormack’s [LinuxKit & Kubernetes talk at Austin Docker Meetup][10], Patrick Chanezon’s [Moby session][11] [Phil Estes’ session][12] or the [containerd salon][13]
-
---------------------------------------------------------------------------------
-
-via: https://blog.docker.com/2017/12/cncf-containerd-1-0-ga-announcement/
-
-作者:[Patrick Chanezon ][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://blog.docker.com/author/chanezon/
-[1]:https://github.com/docker/containerd/blob/master/ROADMAP.md
-[2]:https://github.com/docker/containerd#scope
-[3]:https://github.com/docker/containerd/blob/master/design/architecture.md
-[4]:http://www.linkedin.com/shareArticle?mini=true&url=http://dockr.ly/2ArQe3G&title=Announcing%20the%20General%20Availability%20of%20containerd%201.0%2C%20the%20industry-standard%20runtime%20used%20by%20millions%20of%20users&summary=Today,%20we%E2%80%99re%20pleased%20to%20announce%20that%20containerd%20(pronounced%20Con-Tay-Ner-D),%20an%20industry-standard%20runtime%20for%20building%20container%20solutions,%20has%20reached%20its%201.0%20milestone.%20containerd%20has%20already%20been%20deployed%20in%20millions%20of%20systems%20in%20production%20today,%20making%20it%20the%20most%20widely%20adopted%20runtime%20and%20an%20essential%20upstream%20component%20of%20the%20Docker%20platform.%20Built%20...
-[5]:http://www.reddit.com/submit?url=http://dockr.ly/2ArQe3G&title=Announcing%20the%20General%20Availability%20of%20containerd%201.0%2C%20the%20industry-standard%20runtime%20used%20by%20millions%20of%20users
-[6]:https://plus.google.com/share?url=http://dockr.ly/2ArQe3G
-[7]:http://news.ycombinator.com/submitlink?u=http://dockr.ly/2ArQe3G&t=Announcing%20the%20General%20Availability%20of%20containerd%201.0%2C%20the%20industry-standard%20runtime%20used%20by%20millions%20of%20users
-[8]:http://mobyproject.org/blog/2017/08/15/containerd-getting-started/
-[9]:https://github.com/docker/containerd/tree/master/api/
-[10]:https://www.meetup.com/Docker-Austin/events/245536895/
-[11]:http://sched.co/CU6G
-[12]:https://kccncna17.sched.com/event/CU6g/embedding-the-containerd-runtime-for-fun-and-profit-i-phil-estes-ibm
-[13]:https://kccncna17.sched.com/event/Cx9k/containerd-salon-hosted-by-derek-mcgowan-docker-lantao-liu-google
-[14]:https://blog.docker.com/author/chanezon/
-[15]:https://blog.docker.com/tag/cloud-native-computing-foundation/
-[16]:https://blog.docker.com/tag/cncf/
-[17]:https://blog.docker.com/tag/container-runtime/
-[18]:https://blog.docker.com/tag/containerd/
-[19]:https://blog.docker.com/tag/cri-containerd/
-[20]:https://blog.docker.com/tag/grpc/
-[21]:https://blog.docker.com/tag/kubernetes/
-[22]:https://blog.docker.com/2016/12/introducing-containerd/
-[23]:https://blog.docker.com/2017/03/docker-donates-containerd-to-cncf/
-[24]:http://blog.kubernetes.io/2017/11/containerd-container-runtime-options-kubernetes.html
-[25]:http://www.grpc.io/
-[26]:https://prometheus.io/
-[27]:https://github.com/opencontainers/runc
-[28]:http://github.com/containerd/containerd
diff --git a/sources/tech/20171216 Sysadmin 101- Troubleshooting.md b/sources/tech/20171216 Sysadmin 101- Troubleshooting.md
index 89cb5925c7..a08081e3fd 100644
--- a/sources/tech/20171216 Sysadmin 101- Troubleshooting.md
+++ b/sources/tech/20171216 Sysadmin 101- Troubleshooting.md
@@ -1,4 +1,3 @@
-translating by lujun9972
Sysadmin 101: Troubleshooting
======
I typically keep this blog strictly technical, keeping observations, opinions and the like to a minimum. But this, and the next few posts will be about basics and fundamentals for starting out in system administration/SRE/system engineer/sysops/devops-ops (whatever you want to call yourself) roles more generally.
diff --git a/sources/tech/20171223 My personal Email setup - Notmuch, mbsync, postfix and dovecot.md b/sources/tech/20171223 My personal Email setup - Notmuch, mbsync, postfix and dovecot.md
index 2eabd299d7..b239209c1b 100644
--- a/sources/tech/20171223 My personal Email setup - Notmuch, mbsync, postfix and dovecot.md
+++ b/sources/tech/20171223 My personal Email setup - Notmuch, mbsync, postfix and dovecot.md
@@ -1,3 +1,5 @@
+translating by lixinyuxx
+
My personal Email setup - Notmuch, mbsync, postfix and dovecot
======
I've been using personal email setup for quite long and have not documented it anywhere. Recently when I changed my laptop (a post is pending about it) I got lost trying to recreate my local mail setup. So this post is a self documentation so that I don't have to struggle again to get it right.
diff --git a/sources/tech/20171229 Excellent Free Roguelike Games.md b/sources/tech/20171229 Excellent Free Roguelike Games.md
deleted file mode 100644
index 0304b83d05..0000000000
--- a/sources/tech/20171229 Excellent Free Roguelike Games.md
+++ /dev/null
@@ -1,71 +0,0 @@
-Excellent Free Roguelike Games
-======
-![Dungeon][1]
-
-Roguelike is a sub-genre of role-playing games. It literally means "a game like Rogue". Rogue is a dungeon crawling video game, first released in 1980 by developers Michel Toy, Glenn Wichman and Ken Arnold. The game stood out from the crowd by being fiendishly addictive. The game's goal was to retrieve the Amulet of Yendor, hidden deep in the 26th level, and ascend back to the top, all set in a world based on Dungeons & Dragons.
-
-The game is rightly considered to be a classic, formidably difficult yet compelling addictive. While it was popular in college and university campuses, it wasn't a big seller. At the time of its release, Rogue wasn't published under an open source license, which led to many clones being developed.
-
-There is no exact definition of a roguelike, but this type of game typically has the following characteristics:
-
- * High fantasy narrative background
- * Procedural level generation. Most of the game world is generated by the game for every new gameplay session. This is meant to encourage replayability
- * Turn-based dungeon exploration and combat
- * Tile-based graphics that are randomly generated
- * Random conflict outcomes
- * Permanent death - death works realistically, once you're gone, you're gone
- * High difficulty
-
-
-
-This article compiles a wide selection of roguelike games available for Linux. If you enjoy addictive gameplay with real intensity, I heartily recommended downloading these games. Don't be put off by the primitive graphics offered by many of the games, you'll soon forget the visuals once you get immersed in playing. Remember, in roguelikes game mechanics tend to be the primary focus, with graphics being a welcome, but not essential, addition.
-
-There are 16 games recommended here. All of the games are available to download without charge, and almost all are released under an open source license.
-| **Roguelike Games** |
-| --- |
-| **[Dungeon Crawl Stone Soup][1]** | A continuation of Linley’s Dungeon Crawl |
-| **[Prospector][2]** | Roguelike game set in a science fiction universe |
-| **[Dwarf Fortress][3]** | Adventure and Dwarf Fortress modes |
-| **[NetHack][4]** | Wonderfully silly, and addictive Dungeons and Dragons-style adventure game |
-| **[Angband][5]** | Along the lines of Rogue and NetHack. It is derived from the games Moria and Umoria |
-| **[Ancient Domains of Mystery][6]** | Very mature Roguelike game |
-| **[Tales of Maj’Eyal][7]** | Features tactical turn-based combat and advanced character building |
-| **[UnNetHack][8]** | Inspired fork of NetHack |
-| **[Hydra Slayer][9]** | Roguelike game based on mathematical puzzles |
-| **[Cataclysm DDA][10]** | Post-apocalyptic roguelike, set in the countryside of fictional New England |
-| **[Brogue][11]** | A direct descendant of Rogue |
-| **[Goblin Hack][12]** | Inspired by the likes of NetHack, but faster with fewer keys |
-| **[Ascii Sector][13]** | 2D trading and space flight simulator with roguelike action |
-| **[SLASH'EM][14]** | Super Lotsa Added Stuff Hack - Extended Magic |
-| **[Everything Is Fodder][15]** | Seven Day Roguelike competition entry |
-| **[Woozoolike][16]** | A simple space exploration roguelike for 7DRL 2017. |
-
-
---------------------------------------------------------------------------------
-
-via: https://www.linuxlinks.com/excellent-free-roguelike-games/
-
-作者:[Steve Emms][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://www.linuxlinks.com/author/linuxlinks/
-[1]:https://www.linuxlinks.com/dungeoncrawlstonesoup/
-[2]:https://www.linuxlinks.com/Prospector-roguelike/
-[3]:https://www.linuxlinks.com/dwarffortress/
-[4]:https://www.linuxlinks.com/nethack/
-[5]:https://www.linuxlinks.com/angband/
-[6]:https://www.linuxlinks.com/ADOM/
-[7]:https://www.linuxlinks.com/talesofmajeyal/
-[8]:https://www.linuxlinks.com/unnethack/
-[9]:https://www.linuxlinks.com/hydra-slayer/
-[10]:https://www.linuxlinks.com/cataclysmdda/
-[11]:https://www.linuxlinks.com/brogue/
-[12]:https://www.linuxlinks.com/goblin-hack/
-[13]:https://www.linuxlinks.com/asciisector/
-[14]:https://www.linuxlinks.com/slashem/
-[15]:https://www.linuxlinks.com/everything-is-fodder/
-[16]:https://www.linuxlinks.com/Woozoolike/
-[17]:https://i2.wp.com/www.linuxlinks.com/wp-content/uploads/2017/12/dungeon.jpg?resize=300%2C200&ssl=1
diff --git a/sources/tech/20180101 27 open solutions to everything in education.md b/sources/tech/20180101 27 open solutions to everything in education.md
index ccf7cea523..eeba3692e4 100644
--- a/sources/tech/20180101 27 open solutions to everything in education.md
+++ b/sources/tech/20180101 27 open solutions to everything in education.md
@@ -1,3 +1,5 @@
+translating by lixinyuxx
+
27 open solutions to everything in education
======

diff --git a/sources/tech/20180104 Ubuntu Updates for the Meltdown Spectre Vulnerabilities.md b/sources/tech/20180104 Ubuntu Updates for the Meltdown Spectre Vulnerabilities.md
deleted file mode 100644
index c44d121e68..0000000000
--- a/sources/tech/20180104 Ubuntu Updates for the Meltdown Spectre Vulnerabilities.md
+++ /dev/null
@@ -1,74 +0,0 @@
-Ubuntu Updates for the Meltdown / Spectre Vulnerabilities
-============================================================
-
-
-
-* For up-to-date patch, package, and USN links, please refer to: [https://wiki.ubuntu.com/SecurityTeam/KnowledgeBase/SpectreAndMeltdown][2]
-
-Unfortunately, you’ve probably already read about one of the most widespread security issues in modern computing history — colloquially known as “[Meltdown][5]” ([CVE-2017-5754][6]) and “[Spectre][7]” ([CVE-2017-5753][8] and [CVE-2017-5715][9]) — affecting practically every computer built in the last 10 years, running any operating system. That includes [Ubuntu][10].
-
-I say “unfortunately”, in part because there was a coordinated release date of January 9, 2018, agreed upon by essentially every operating system, hardware, and cloud vendor in the world. By design, operating system updates would be available at the same time as the public disclosure of the security vulnerability. While it happens rarely, this an industry standard best practice, which has broken down in this case.
-
-At its heart, this vulnerability is a CPU hardware architecture design issue. But there are billions of affected hardware devices, and replacing CPUs is simply unreasonable. As a result, operating system kernels — Windows, MacOS, Linux, and many others — are being patched to mitigate the critical security vulnerability.
-
-Canonical engineers have been working on this since we were made aware under the embargoed disclosure (November 2017) and have worked through the Christmas and New Years holidays, testing and integrating an incredibly complex patch set into a broad set of Ubuntu kernels and CPU architectures.
-
-Ubuntu users of the 64-bit x86 architecture (aka, amd64) can expect updated kernels by the original January 9, 2018 coordinated release date, and sooner if possible. Updates will be available for:
-
-* Ubuntu 17.10 (Artful) — Linux 4.13 HWE
-
-* Ubuntu 16.04 LTS (Xenial) — Linux 4.4 (and 4.4 HWE)
-
-* Ubuntu 14.04 LTS (Trusty) — Linux 3.13
-
-* Ubuntu 12.04 ESM** (Precise) — Linux 3.2
- * Note that an [Ubuntu Advantage license][1] is required for the 12.04 ESM kernel update, as Ubuntu 12.04 LTS is past its end-of-life
-
-Ubuntu 18.04 LTS (Bionic) will release in April of 2018, and will ship a 4.15 kernel, which includes the [KPTI][11] patchset as integrated upstream.
-
-Ubuntu optimized kernels for the Amazon, Google, and Microsoft public clouds are also covered by these updates, as well as the rest of Canonical’s [Certified Public Clouds][12] including Oracle, OVH, Rackspace, IBM Cloud, Joyent, and Dimension Data.
-
-These kernel fixes will not be [Livepatch-able][13]. The source code changes required to address this problem is comprised of hundreds of independent patches, touching hundreds of files and thousands of lines of code. The sheer complexity of this patchset is not compatible with the Linux kernel Livepatch mechanism. An update and a reboot will be required to active this update.
-
-Furthermore, you can expect Ubuntu security updates for a number of other related packages, including CPU microcode, GCC and QEMU in the coming days.
-
-We don’t have a performance analysis to share at this time, but please do stay tuned here as we’ll followup with that as soon as possible.
-
-Thanks,
-[@DustinKirkland][14]
-VP of Product
-Canonical / Ubuntu
-
-### About the author
-
- 
-
-Dustin Kirkland is part of Canonical's Ubuntu Product and Strategy team, working for Mark Shuttleworth, and leading the technical strategy, road map, and life cycle of the Ubuntu Cloud and IoT commercial offerings. Formerly the CTO of Gazzang, a venture funded start-up acquired by Cloudera, Dustin designed and implemented an innovative key management system for the cloud, called zTrustee, and delivered comprehensive security for cloud and big data platforms with eCryptfs and other encryption technologies. Dustin is an active Core Developer of the Ubuntu Linux distribution, maintainer of 20+ open source projects, and the creator of Byobu, DivItUp.com, and LinuxSearch.org. A Fightin' Texas Aggie Class of 2001 graduate, Dustin lives in Austin, Texas, with his wife Kim, daughters, and his Australian Shepherds, Aggie and Tiger. Dustin is also an avid home brewer.
-
-[More articles by Dustin][3]
-
---------------------------------------------------------------------------------
-
-via: https://insights.ubuntu.com/2018/01/04/ubuntu-updates-for-the-meltdown-spectre-vulnerabilities/
-
-作者:[Dustin Kirkland][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://insights.ubuntu.com/author/kirkland/
-[1]:https://www.ubuntu.com/support/esm
-[2]:https://wiki.ubuntu.com/SecurityTeam/KnowledgeBase/SpectreAndMeltdown
-[3]:https://insights.ubuntu.com/author/kirkland/
-[4]:https://insights.ubuntu.com/author/kirkland/
-[5]:https://en.wikipedia.org/wiki/Meltdown_(security_vulnerability)
-[6]:https://people.canonical.com/~ubuntu-security/cve/2017/CVE-2017-5754.html
-[7]:https://en.wikipedia.org/wiki/Spectre_(security_vulnerability)
-[8]:https://people.canonical.com/~ubuntu-security/cve/2017/CVE-2017-5753.html
-[9]:https://people.canonical.com/~ubuntu-security/cve/2017/CVE-2017-5715.html
-[10]:https://wiki.ubuntu.com/SecurityTeam/KnowledgeBase/SpectreAndMeltdown
-[11]:https://lwn.net/Articles/742404/
-[12]:https://partners.ubuntu.com/programmes/public-cloud
-[13]:https://www.ubuntu.com/server/livepatch
-[14]:https://twitter.com/dustinkirkland
diff --git a/sources/tech/20180110 Using Your Own Private Registry with Docker Enterprise Edition.md b/sources/tech/20180110 Using Your Own Private Registry with Docker Enterprise Edition.md
deleted file mode 100644
index 00507d2b9c..0000000000
--- a/sources/tech/20180110 Using Your Own Private Registry with Docker Enterprise Edition.md
+++ /dev/null
@@ -1,128 +0,0 @@
-fuowang 翻译中
-
-Using Your Own Private Registry with Docker Enterprise Edition
-======
-
-![docker trusted registry][1]
-
-One of the things that makes Docker really cool, particularly compared to using virtual machines, is how easy it is to move around Docker images. If you've already been using Docker, you've almost certainly pulled images from [Docker Hub][2]. Docker Hub is Docker's cloud-based registry service and has tens of thousands of Docker images to choose from. If you're developing your own software and creating your own Docker images though, you'll want your own private Docker registry. This is particularly true if you have images with proprietary licenses, or if you have a complex continuous integration (CI) process for your build system.
-
-Docker Enterprise Edition includes Docker Trusted Registry (DTR), a highly available registry with secure image management capabilities which was built to run either inside of your own data center or on your own cloud-based infrastructure. In the next few weeks, we'll go over how DTR is a critical component of delivering a secure, repeatable and consistent [software supply chain][3]. You can get started with it today through our [free hosted demo][4] or by downloading and installing the free 30-day trial. The steps to get started with your own installation are below.
-
-## Setting Up Docker Enterprise Edition
-
-Docker Trusted Registry runs on top of Universal Control Plane (UCP), so to begin let's install a single-node cluster. If you've already got your own UCP cluster, you can skip this step. On your docker host, run the command:
-
-```
-# Pull and install UCP
-
-docker run -it -rm -v /var/run/docker.sock:/var/run/docker.sock -name ucp docker/ucp:latest install
-```
-
-Once UCP is up and running, there are a few more things you should do before you install DTR. Open up your browser against the UCP instance you just installed. There should be a link to it at the end of your log output. If you have already have a Docker Enterprise Edition license, go ahead and upload it through the UI. If you don't, visit the [Docker Store][5] and pick up a free, 30-day trial.
-
-Once you've got licensing squared away, you're probably going to want to change the port which UCP is running on. Since this is a single node cluster, DTR and UCP are going to want to use the same TCP ports for running their web services. If you've got a UCP swarm with more than one node, this probably isn't a problem because DTR will look for a node which has the required free ports. Inside of UCP, click on Admin Settings -> Cluster Configuration and change the Controller Port to something like 5443.
-
-## Installing DTR
-
-We're going to install a simple, single-node instance of Docker Trusted Registry. If you were setting up your DTR for production use, you would likely set things up in High Availability (HA) mode which would require a different type of storage such as a cloud-based object store, or NFS. Since this is a single-node instance, we're going to stick with the default local storage.
-
-First we need to pull the DTR bootstrap image. The bootstrap image is a tiny, self-contained installer which connects to UCP and sets up all of the containers, volumes, and logical networks required to get DTR up and running.
-
-Use the command:
-
-```
-# Pull and run the DTR bootstrapper
-
-docker run -it -rm docker/dtr:latest install -ucp-insecure-tls
-```
-
-NOTE: Both UCP and DTR by default come with their own certs which won't be recognized by your system. If you've set up UCP with TLS certs which are trusted by your system, you can omit the `-ucp-insecure-tls` option. Alternatively, you can use the `-ucp-ca` option which will let you specify the UCP CA certificate directly.
-
-The DTR bootstrap image should then ask you for a couple of settings, such as the URL of your UCP installation and your UCP admin username and password. It should only take a minute or two to pull all of the DTR images and set everything up.
-
-## Keeping Everything Secure
-
-Once everything is up and running, you're ready to push and pull images to and from
-
-the registry. Before we do that step though, let's set up our TLS certificates so that we can securely talk to DTR.
-
-On Linux, we can use these commands (just make certain you change DTR_HOSTNAME to reflect the DTR we just set up):
-
-```
-# Pull the CA certificate from DTR (you can use wget if curl is unavailable)
-
-DTR_HOSTNAME=
-
-curl -k https://$(DTR_HOSTNAME)/ca > $(DTR_HOSTNAME).crt
-
-sudo mkdir /etc/docker/certs.d/$(DTR_HOSTNAME)
-
-sudo cp $(DTR_HOSTNAME) /etc/docker/certs.d/$(DTR_HOSTNAME)
-
-# Restart the docker daemon (use `sudo service docker restart` on Ubuntu 14.04)
-
-sudo systemctl restart docker
-```
-
-On Docker for Mac and Windows, we'll set up our client a little bit differently. Go in to Settings -> Daemon and in the Insecure Registries section, enter in your DTR hostname. Click Apply, and your docker daemon should restart and you should be good to go.
-
-## Pushing and Pulling Images
-
-We now need to set up a repository to hold an image. This is a little bit different than Docker Hub which automatically creates a repository if one doesn't exist when you do a docker push. To create the repository, point your browser to https:// and then sign-in with your admin credentials when prompted. If you added a license to UCP, that license will automatically have been picked up by DTR. If not, make certain you upload your license now.
-
-Once you're in, click on the 'New Repository` button and create a new repository.
-
-We'll create a repo to hold Alpine linux, so type `alpine` in the name field, and click
-
-`Save` (it's labelled `Create` in DTR 2.5 and newer).
-
-Now let's go back to our shell and type the commands:
-
-```
-# Pull the latest version of Alpine Linux
-
-docker pull alpine:latest
-
-# Sign in to your new DTR instance
-
-docker login
-
-# Tag Alpine to be able to push it to your DTR
-
-docker tag alpine:latest /admin/alpine:latest
-
-# Push the image to DTR
-
-docker push /admin/alpine:latest
-```
-
-And that's it! We just pulled a copy of the latest Alpine Linux, re-tagged it so that we could store it inside of DTR, and then pushed it to our private registry. If you want to pull that image to a different Docker engine, set up your DTR certs as shown above, and issue the command:
-
-```
-# Pull the image from DTR
-
-docker pull /admin/alpine:latest
-```
-
-DTR has a lot of great image management features built right in such as image caching, mirroring, scanning, signing, and even automated supply chain policies. We'll leave these to future blog posts which we can explore in more detail.
-
-
-
-
---------------------------------------------------------------------------------
-
-via: https://blog.docker.com/2018/01/dtr/
-
-作者:[Patrick Devine;Rolf Neugebauer;Docker Core Engineering;Matt Bentley][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://blog.docker.com/author/pdevine/
-[1]:https://i1.wp.com/blog.docker.com/wp-content/uploads/ccd278d2-29c2-4866-8285-c2fe60b4bd5e-1.jpg?resize=965%2C452&ssl=1
-[2]:https://hub.docker.com/
-[3]:https://blog.docker.com/2016/08/securing-enterprise-software-supply-chain-using-docker/
-[4]:https://www.docker.com/trial
-[5]:https://store.docker.com/search?offering=enterprise&page=1&q=&type=edition
diff --git a/sources/tech/20180130 Reckoning The Spectre And Meltdown Performance Hit.md b/sources/tech/20180130 Reckoning The Spectre And Meltdown Performance Hit.md
deleted file mode 100644
index d7140a21cf..0000000000
--- a/sources/tech/20180130 Reckoning The Spectre And Meltdown Performance Hit.md
+++ /dev/null
@@ -1,85 +0,0 @@
-Reckoning The Spectre And Meltdown Performance Hit For HPC
-============================================================
-
-
-
-While no one has yet created an exploit to take advantage of the Spectre and Meltdown speculative execution vulnerabilities that were exposed by Google six months ago and that were revealed in early January, it is only a matter of time. The [patching frenzy has not settled down yet][2], and a big concern is not just whether these patches fill the security gaps, but at what cost they do so in terms of application performance.
-
-To try to ascertain the performance impact of the Spectre and Meltdown patches, most people have relied on comments from Google on the negligible nature of the performance hit on its own applications and some tests done by Red Hat on a variety of workloads, [which we profiled in our initial story on the vulnerabilities][3]. This is a good starting point, but what companies really need to do is profile the performance of their applications before and after applying the patches – and in such a fine-grained way that they can use the data to debug the performance hit and see if there is any remediation they can take to alleviate the impact.
-
-In the meantime, we are relying on researchers and vendors to figure out the performance impacts. Networking chip maker Mellanox Technologies, always eager to promote the benefits of the offload model of its switch and network interface chips, has run some tests to show the effects of the Spectre and Meltdown patches on high performance networking for various workloads and using various networking technologies, including its own Ethernet and InfiniBand devices and Intel’s OmniPath. Some HPC researchers at the University of Buffalo have also done some preliminary benchmarking of selected HPC workloads to see the effect on compute and network performance. This is a good starting point, but is far from a complete picture of the impact that might be seen on HPC workloads after organization deploy the Spectre and Meltdown patches to their systems.
-
-To recap, here is what Red Hat found out when it tested the initial Spectre and Meltdown patches running its Enterprise Linux 7 release on servers using Intel’s “Haswell” Xeon E5 v3, “Broadwell” Xeon E5 v4, and “Skylake” Xeon SP processors:
-
-* **Measurable, 8 percent to 19 percent:** Highly cached random memory, with buffered I/O, OLTP database workloads, and benchmarks with high kernel-to-user space transitions are impacted between 8 percent and 19 percent. Examples include OLTP Workloads (TPC), sysbench, pgbench, netperf (< 256 byte), and fio (random I/O to NvME).
-
-* **Modest, 3 percent to 7 percent:** Database analytics, Decision Support System (DSS), and Java VMs are impacted less than the Measurable category. These applications may have significant sequential disk or network traffic, but kernel/device drivers are able to aggregate requests to moderate level of kernel-to-user transitions. Examples include SPECjbb2005, Queries/Hour and overall analytic timing (sec).
-
-* **Small, 2 percent to 5 percent:** HPC CPU-intensive workloads are affected the least with only 2 percent to 5 percent performance impact because jobs run mostly in user space and are scheduled using CPU pinning or NUMA control. Examples include Linpack NxN on X86 and SPECcpu2006.
-
-* **Minimal impact:** Linux accelerator technologies that generally bypass the kernel in favor of user direct access are the least affected, with less than 2% overhead measured. Examples tested include DPDK (VsPERF at 64 byte) and OpenOnload (STAC-N). Userspace accesses to VDSO like get-time-of-day are not impacted. We expect similar minimal impact for other offloads.
-
-And just to remind you, according to Red Hat containerized applications running atop Linux do not incur an extra Spectre or Meltdown penalty compared to applications running on bare metal because they are implemented as generic Linux processes themselves. But applications running inside virtual machines running atop hypervisors, Red Hat does expect that, thanks to the increase in the frequency of user-to-kernel transitions, the performance hit will be higher. (How much has not yet been revealed.)
-
-Gilad Shainer, the vice president of marketing for the InfiniBand side of the Mellanox house, shared some initial performance data from the company’s labs with regard to the Spectre and Meltdown patches. ([The presentation is available online here.][4])
-
-In general, Shainer tells _The Next Platform_ , the offload model that Mellanox employs in its InfiniBand switches (RDMA is a big component of this) and in its Ethernet (The RoCE clone of RDMA is used here) are a very big deal given the fact that the network drivers bypass the operating system kernels. The exploits take advantage, in one of three forms, of the porous barrier between the kernel and user spaces in the operating systems, so anything that is kernel heavy will be adversely affected. This, says Shainer, includes the TCP/IP protocol that underpins Ethernet as well as the OmniPath protocol, which by its nature tries to have the CPUs in the system do a lot of the network processing. Intel and others who have used an onload model have contended that this allows for networks to be more scalable, and clearly there are very scalable InfiniBand and OmniPath networks, with many thousands of nodes, so both approaches seem to work in production.
-
-Here are the feeds and speeds on the systems that Mellanox tested on two sets of networking tests. For the comparison of Ethernet with RoCE added and standard TCP over Ethernet, the hardware was a two-socket server using Intel’s Xeon E5-2697A v4 running at 2.60 GHz. This machine was configured with Red Hat Enterprise Linux 7.4, with kernel versions 3.10.0-693.11.6.el7.x86_64 and 3.10.0-693.el7.x86_64\. (Those numbers _are_ different – there is an _11.6_ in the middle of the second one.) The machines were equipped with ConnectX-5 server adapters with firmware 16.22.0170 and the MLNX_OFED_LINUX-4.3-0.0.5.0 driver. The workload that was tested was not a specific HPC application, but rather a very low level, homegrown interconnect benchmark that is used to stress switch chips and NICs to see their peak _sustained_ performance, as distinct from peak _theoretical_ performance, which is the absolute ceiling. This particular test was run on a two-node cluster, passing data from one machine to the other.
-
-Here is how the performance stacked up before and after the Spectre and Meltdown patches were added to the systems:
-
- [][5]
-
-As you can see, at this very low level, there is no impact on network performance between two machines supporting RoCE on Ethernet, but running plain vanilla TCP without an offload on top of Ethernet, there are some big performance hits. Interestingly, on this low-level test, the impact was greatest on small message sizes in the TCP stack and then disappeared as the message sizes got larger.
-
-On a separate round of tests pitting InfiniBand from Mellanox against OmniPath from Intel, the server nodes were configured with a pair of Intel Xeon SP Gold 6138 processors running at 2 GHz, also with Red Hat Enterprise Linux 7.4 with the 3.10.0-693.el7.x86_64 and 3.10.0-693.11.6.el7.x86_64 kernel versions. The OmniPath adapter uses the IntelOPA-IFS.RHEL74-x86_64.10.6.1.0.2 driver and the Mellanox ConnectX-5 adapter uses the MLNX_OFED 4.2 driver.
-
-Here is how the InfiniBand and OmniPath protocols did on the tests before and after the patches:
-
- [][6]
-
-Again, thanks to the offload model and the fact that this was a low level benchmark that did not hit the kernel very much (and some HPC applications might cross that boundary and therefore invoke the Spectre and Meltdown performance penalties), there was no real effect on the two-node cluster running InfiniBand. With the OmniPath system, the impact was around 10 percent for small message sizes, and then grew to 25 percent or so once the message sizes transmitted reached 512 bytes.
-
-We have no idea what the performance implications are for clusters of more than two machines using the Mellanox approach. It would be interesting to see if the degradation compounds or doesn’t.
-
-### Early HPC Performance Tests
-
-While such low level benchmarks provide some initial guidance on what the effect might be of the Spectre and Meltdown patches on HPC performance, what you really need is a benchmark run of real HPC applications running on clusters of various sizes, both before and after the Spectre and Meltdown patches are applied to the Linux nodes. A team of researchers led by Nikolay Simakov at the Center For Computational Research at SUNY Buffalo fired up some HPC benchmarks and a performance monitoring tool derived from the National Science Foundation’s Extreme Digital (XSEDE) program to see the effect of the Spectre and Meltdown patches on how much work they could get done as gauged by wall clock time to get that work done.
-
-The paper that Simakov and his team put together on the initial results [is found here][7]. The tool that was used to monitor the performance of the systems was called XD Metrics on Demand, or XDMoD, and it was open sourced and is available for anyone to use. (You might consider [Open XDMoD][8] for your own metrics to determine the performance implications of the Spectre and Meltdown patches.) The benchmarks tested by the SUNY Buffalo researchers included the NAMD molecular dynamics and NWChem computational chemistry applications, as well as the HPC Challenge suite, which itself includes the STREAM memory bandwidth test and the NASA Parallel Benchmarks (NPB), the Interconnect MPI Benchmarks (IMB). The researchers also tested the IOR file reading and the MDTest metadata benchmark tests from Lawrence Livermore National Laboratory. The IOR and MDTest benchmarks were run in local mode and in conjunction with a GPFS parallel file system running on an external 3 PB storage cluster. (The tests with a “.local” suffix in the table are run on storage in the server nodes themselves.)
-
-SUNY Buffalo has an experimental cluster with two-socket machines based on Intel “Nehalem” Xeon L5520 processors, which have eight cores and which are, by our reckoning, very long in the tooth indeed in that they are nearly nine years old. Each node has 24 GB of main memory and has 40 Gb/sec QDR InfiniBand links cross connecting them together. The systems are running the latest CentOS 7.4.1708 release, without and then with the patches applied. (The same kernel patches outlined above in the Mellanox test.) Simakov and his team ran each benchmark on a single node configuration and then ran the benchmark on a two node configuration, and it shows the difference between running a low-level benchmark and actual applications when doing tests. Take a look at the table of results:
-
- [][9]
-
-The before runs of each application tested were done on around 20 runs, and the after was done on around 50 runs. For the core HPC applications – NAMD, NWChem, and the elements of HPCC – the performance degradation was between 2 percent and 3 percent, consistent with what Red Hat told people to expect back in the first week that the Spectre and Meltdown vulnerabilities were revealed and the initial patches were available. However, moving on to two-node configurations, where network overhead was taken into account, the performance impact ranged from 5 percent to 11 percent. This is more than you would expect based on the low level benchmarks that Mellanox has done. Just to make things interesting, on the IOR and MDTest benchmarks, moving from one to two nodes actually lessened the performance impact; running the IOR test on the local disks resulted in a smaller performance hit then over the network for a single node, but was not as low as for a two-node cluster running out to the GPFS file system.
-
-There is a lot of food for thought in this data, to say the least.
-
-What we want to know – and what the SUNY Buffalo researchers are working on – is what happens to performance on these HPC applications when the cluster is scaled out.
-
-“We will know that answer soon,” Simakov tells _The Next Platform_ . “But there are only two scenarios that are possible. Either it is going to get worse or it is going to stay about the same as a two-node cluster. We think that it will most likely stay the same, because all of the MPI communication happens through the shared memory on a single node, and when you get to two nodes, you get it into the network fabric and at that point, you are probably paying all of the extra performance penalties.”
-
-We will update this story with data on larger scale clusters as soon as Simakov and his team provide the data.
-
---------------------------------------------------------------------------------
-
-via: https://www.nextplatform.com/2018/01/30/reckoning-spectre-meltdown-performance-hit-hpc/
-
-作者:[Timothy Prickett Morgan][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://www.nextplatform.com/author/tpmn/
-[1]:https://www.nextplatform.com/author/tpmn/
-[2]:https://www.nextplatform.com/2018/01/18/datacenters-brace-spectre-meltdown-impact/
-[3]:https://www.nextplatform.com/2018/01/08/cost-spectre-meltdown-server-taxes/
-[4]:http://www.mellanox.com/related-docs/presentations/2018/performance/Spectre-and-Meltdown-Performance.pdf?homepage
-[5]:https://3s81si1s5ygj3mzby34dq6qf-wpengine.netdna-ssl.com/wp-content/uploads/2018/01/mellanox-spectre-meltdown-roce-versus-tcp.jpg
-[6]:https://3s81si1s5ygj3mzby34dq6qf-wpengine.netdna-ssl.com/wp-content/uploads/2018/01/mellanox-spectre-meltdown-infiniband-versus-omnipath.jpg
-[7]:https://arxiv.org/pdf/1801.04329.pdf
-[8]:http://open.xdmod.org/7.0/index.html
-[9]:https://3s81si1s5ygj3mzby34dq6qf-wpengine.netdna-ssl.com/wp-content/uploads/2018/01/suny-buffalo-spectre-meltdown-test-table.jpg
\ No newline at end of file
diff --git a/sources/tech/20180215 Build a bikesharing app with Redis and Python.md b/sources/tech/20180215 Build a bikesharing app with Redis and Python.md
deleted file mode 100644
index d3232a0b4c..0000000000
--- a/sources/tech/20180215 Build a bikesharing app with Redis and Python.md
+++ /dev/null
@@ -1,258 +0,0 @@
-translating by Flowsnow
-
-Build a bikesharing app with Redis and Python
-======
-
-
-
-I travel a lot on business. I'm not much of a car guy, so when I have some free time, I prefer to walk or bike around a city. Many of the cities I've visited on business have bikeshare systems, which let you rent a bike for a few hours. Most of these systems have an app to help users locate and rent their bikes, but it would be more helpful for users like me to have a single place to get information on all the bikes in a city that are available to rent.
-
-To solve this problem and demonstrate the power of open source to add location-aware features to a web application, I combined publicly available bikeshare data, the [Python][1] programming language, and the open source [Redis][2] in-memory data structure server to index and query geospatial data.
-
-The resulting bikeshare application incorporates data from many different sharing systems, including the [Citi Bike][3] bikeshare in New York City. It takes advantage of the General Bikeshare Feed provided by the Citi Bike system and uses its data to demonstrate some of the features that can be built using Redis to index geospatial data. The Citi Bike data is provided under the [Citi Bike data license agreement][4].
-
-### General Bikeshare Feed Specification
-
-The General Bikeshare Feed Specification (GBFS) is an [open data specification][5] developed by the [North American Bikeshare Association][6] to make it easier for map and transportation applications to add bikeshare systems into their platforms. The specification is currently in use by over 60 different sharing systems in the world.
-
-The feed consists of several simple [JSON][7] data files containing information about the state of the system. The feed starts with a top-level JSON file referencing the URLs of the sub-feed data:
-```
-{
-
- "data": {
-
- "en": {
-
- "feeds": [
-
- {
-
- "name": "system_information",
-
- "url": "https://gbfs.citibikenyc.com/gbfs/en/system_information.json"
-
- },
-
- {
-
- "name": "station_information",
-
- "url": "https://gbfs.citibikenyc.com/gbfs/en/station_information.json"
-
- },
-
- . . .
-
- ]
-
- }
-
- },
-
- "last_updated": 1506370010,
-
- "ttl": 10
-
-}
-
-```
-
-The first step is loading information about the bikesharing stations into Redis using data from the `system_information` and `station_information` feeds.
-
-The `system_information` feed provides the system ID, which is a short code that can be used to create namespaces for Redis keys. The GBFS spec doesn't specify the format of the system ID, but does guarantee it is globally unique. Many of the bikeshare feeds use short names like coast_bike_share, boise_greenbike, or topeka_metro_bikes for system IDs. Others use familiar geographic abbreviations such as NYC or BA, and one uses a universally unique identifier (UUID). The bikesharing application uses the identifier as a prefix to construct unique keys for the given system.
-
-The `station_information` feed provides static information about the sharing stations that comprise the system. Stations are represented by JSON objects with several fields. There are several mandatory fields in the station object that provide the ID, name, and location of the physical bike stations. There are also several optional fields that provide helpful information such as the nearest cross street or accepted payment methods. This is the primary source of information for this part of the bikesharing application.
-
-### Building the database
-
-I've written a sample application, [load_station_data.py][8], that mimics what would happen in a backend process for loading data from external sources.
-
-### Finding the bikeshare stations
-
-Loading the bikeshare data starts with the [systems.csv][9] file from the [GBFS repository on GitHub][5].
-
-The repository's [systems.csv][9] file provides the discovery URL for registered bikeshare systems with an available GBFS feed. The discovery URL is the starting point for processing bikeshare information.
-
-The `load_station_data` application takes each discovery URL found in the systems file and uses it to find the URL for two sub-feeds: system information and station information. The system information feed provides a key piece of information: the unique ID of the system. (Note: the system ID is also provided in the systems.csv file, but some of the identifiers in that file do not match the identifiers in the feeds, so I always fetch the identifier from the feed.) Details on the system, like bikeshare URLs, phone numbers, and emails, could be added in future versions of the application, so the data is stored in a Redis hash using the key `${system_id}:system_info`.
-
-### Loading the station data
-
-The station information provides data about every station in the system, including the system's location. The `load_station_data` application iterates over every station in the station feed and stores the data about each into a Redis hash using a key of the form `${system_id}:station:${station_id}`. The location of each station is added to a geospatial index for the bikeshare using the `GEOADD` command.
-
-### Updating data
-
-On subsequent runs, I don't want the code to remove all the feed data from Redis and reload it into an empty Redis database, so I carefully considered how to handle in-place updates of the data.
-
-The code starts by loading the dataset with information on all the bikesharing stations for the system being processed into memory. When information is loaded for a station, the station (by key) is removed from the in-memory set of stations. Once all station data is loaded, we're left with a set containing all the station data that must be removed for that system.
-
-The application iterates over this set of stations and creates a transaction to delete the station information, remove the station key from the geospatial indexes, and remove the station from the list of stations for the system.
-
-### Notes on the code
-
-There are a few interesting things to note in [the sample code][8]. First, items are added to the geospatial indexes using the `GEOADD` command but removed with the `ZREM` command. As the underlying implementation of the geospatial type uses sorted sets, items are removed using `ZREM`. A word of caution: For simplicity, the sample code demonstrates working with a single Redis node; the transaction blocks would need to be restructured to run in a cluster environment.
-
-If you are using Redis 4.0 (or later), you have some alternatives to the `DELETE` and `HMSET` commands in the code. Redis 4.0 provides the [`UNLINK`][10] command as an asynchronous alternative to the `DELETE` command. `UNLINK` will remove the key from the keyspace, but it reclaims the memory in a separate thread. The [`HMSET`][11] command is [deprecated in Redis 4.0 and the `HSET` command is now variadic][12] (that is, it accepts an indefinite number of arguments).
-
-### Notifying clients
-
-At the end of the process, a notification is sent to the clients relying on our data. Using the Redis pub/sub mechanism, the notification goes out over the `geobike:station_changed` channel with the ID of the system.
-
-### Data model
-
-When structuring data in Redis, the most important thing to think about is how you will query the information. The two main queries the bikeshare application needs to support are:
-
- * Find stations near us
- * Display information about stations
-
-
-
-Redis provides two main data types that will be useful for storing our data: hashes and sorted sets. The [hash type][13] maps well to the JSON objects that represent stations; since Redis hashes don't enforce a schema, they can be used to store the variable station information.
-
-Of course, finding stations geographically requires a geospatial index to search for stations relative to some coordinates. Redis provides [several commands][14] to build up a geospatial index using the [sorted set][15] data structure.
-
-We construct keys using the format `${system_id}:station:${station_id}` for the hashes containing information about the stations and keys using the format `${system_id}:stations:location` for the geospatial index used to find stations.
-
-### Getting the user's location
-
-The next step in building out the application is to determine the user's current location. Most applications accomplish this through built-in services provided by the operating system. The OS can provide applications with a location based on GPS hardware built into the device or approximated from the device's available WiFi networks.
-
-
-
-### Finding stations
-
-After the user's location is found, the next step is locating nearby bikesharing stations. Redis' geospatial functions can return information on stations within a given distance of the user's current coordinates. Here's an example of this using the Redis command-line interface.
-
-Imagine I'm at the Apple Store on Fifth Avenue in New York City, and I want to head downtown to Mood on West 37th to catch up with my buddy [Swatch][16]. I could take a taxi or the subway, but I'd rather bike. Are there any nearby sharing stations where I could get a bike for my trip?
-
-The Apple store is located at 40.76384, -73.97297. According to the map, two bikeshare stations—Grand Army Plaza & Central Park South and East 58th St. & Madison—fall within a 500-foot radius (in blue on the map above) of the store.
-
-I can use Redis' `GEORADIUS` command to query the NYC system index for stations within a 500-foot radius:
-```
-127.0.0.1:6379> GEORADIUS NYC:stations:location -73.97297 40.76384 500 ft
-
-1) "NYC:station:3457"
-
-2) "NYC:station:281"
-
-```
-
-Redis returns the two bikeshare locations found within that radius, using the elements in our geospatial index as the keys for the metadata about a particular station. The next step is looking up the names for the two stations:
-```
-127.0.0.1:6379> hget NYC:station:281 name
-
-"Grand Army Plaza & Central Park S"
-
-
-
-127.0.0.1:6379> hget NYC:station:3457 name
-
-"E 58 St & Madison Ave"
-
-```
-
-Those keys correspond to the stations identified on the map above. If I want, I can add more flags to the `GEORADIUS` command to get a list of elements, their coordinates, and their distance from our current point:
-```
-127.0.0.1:6379> GEORADIUS NYC:stations:location -73.97297 40.76384 500 ft WITHDIST WITHCOORD ASC
-
-1) 1) "NYC:station:281"
-
- 2) "289.1995"
-
- 3) 1) "-73.97371262311935425"
-
- 2) "40.76439830559216659"
-
-2) 1) "NYC:station:3457"
-
- 2) "383.1782"
-
- 3) 1) "-73.97209256887435913"
-
- 2) "40.76302702144496237"
-
-```
-
-Looking up the names associated with those keys generates an ordered list of stations I can choose from. Redis doesn't provide directions or routing capability, so I use the routing features of my device's OS to plot a course from my current location to the selected bike station.
-
-The `GEORADIUS` function can be easily implemented inside an API in your favorite development framework to add location functionality to an app.
-
-### Other query commands
-
-In addition to the `GEORADIUS` command, Redis provides three other commands for querying data from the index: `GEOPOS`, `GEODIST`, and `GEORADIUSBYMEMBER`.
-
-The `GEOPOS` command can provide the coordinates for a given element from the geohash. For example, if I know there is a bikesharing station at West 38th and 8th and its ID is 523, then the element name for that station is NYC🚉523. Using Redis, I can find the station's longitude and latitude:
-```
-127.0.0.1:6379> geopos NYC:stations:location NYC:station:523
-
-1) 1) "-73.99138301610946655"
-
- 2) "40.75466497634030105"
-
-```
-
-The `GEODIST` command provides the distance between two elements of the index. If I wanted to find the distance between the station at Grand Army Plaza & Central Park South and the station at East 58th St. & Madison, I would issue the following command:
-```
-127.0.0.1:6379> GEODIST NYC:stations:location NYC:station:281 NYC:station:3457 ft
-
-"671.4900"
-
-```
-
-Finally, the `GEORADIUSBYMEMBER` command is similar to the `GEORADIUS` command, but instead of taking a set of coordinates, the command takes the name of another member of the index and returns all the members within a given radius centered on that member. To find all the stations within 1,000 feet of the Grand Army Plaza & Central Park South, enter the following:
-```
-127.0.0.1:6379> GEORADIUSBYMEMBER NYC:stations:location NYC:station:281 1000 ft WITHDIST
-
-1) 1) "NYC:station:281"
-
- 2) "0.0000"
-
-2) 1) "NYC:station:3132"
-
- 2) "793.4223"
-
-3) 1) "NYC:station:2006"
-
- 2) "911.9752"
-
-4) 1) "NYC:station:3136"
-
- 2) "940.3399"
-
-5) 1) "NYC:station:3457"
-
- 2) "671.4900"
-
-```
-
-While this example focused on using Python and Redis to parse data and build an index of bikesharing system locations, it can easily be generalized to locate restaurants, public transit, or any other type of place developers want to help users find.
-
-This article is based on [my presentation][17] at Open Source 101 in Raleigh this year.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/2/building-bikesharing-application-open-source-tools
-
-作者:[Tague Griffith][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/tague
-[1]:https://www.python.org/
-[2]:https://redis.io/
-[3]:https://www.citibikenyc.com/
-[4]:https://www.citibikenyc.com/data-sharing-policy
-[5]:https://github.com/NABSA/gbfs
-[6]:http://nabsa.net/
-[7]:https://www.json.org/
-[8]:https://gist.github.com/tague/5a82d96bcb09ce2a79943ad4c87f6e15
-[9]:https://github.com/NABSA/gbfs/blob/master/systems.csv
-[10]:https://redis.io/commands/unlink
-[11]:https://redis.io/commands/hmset
-[12]:https://raw.githubusercontent.com/antirez/redis/4.0/00-RELEASENOTES
-[13]:https://redis.io/topics/data-types#Hashes
-[14]:https://redis.io/commands#geo
-[15]:https://redis.io/topics/data-types-intro#redis-sorted-sets
-[16]:https://twitter.com/swatchthedog
-[17]:http://opensource101.com/raleigh/talks/building-location-aware-apps-open-source-tools/
diff --git a/sources/tech/20180217 Louis-Philippe Véronneau .md b/sources/tech/20180217 Louis-Philippe Véronneau .md
deleted file mode 100644
index bab2f4c169..0000000000
--- a/sources/tech/20180217 Louis-Philippe Véronneau .md
+++ /dev/null
@@ -1,59 +0,0 @@
-Louis-Philippe Véronneau -
-======
-I've been watching [Critical Role][1]1 for a while now and since I've started my master's degree I haven't had much time to sit down and watch the show on YouTube as I used to do.
-
-I thus started listening to the podcasts instead; that way, I can listen to the show while I'm doing other productive tasks. Pretty quickly, I grew tired of manually downloading every episode each time I finished the last one. To make things worst, the podcast is hosted on PodBean and they won't let you download episodes on a mobile device without their app. Grrr.
-
-After the 10th time opening the terminal on my phone to download the podcast using some `wget` magic I decided enough was enough: I was going to write a dumb script to download them all in one batch.
-
-I'm a little ashamed to say it took me more time than I had intended... The PodBean website uses semi-randomized URLs, so I could not figure out a way to guess the paths to the hosted audio files. I considered using `youtube-dl` to get the DASH version of the show on YouTube, but Google has been heavily throttling DASH streams recently. Not cool Google.
-
-I then had the idea to use iTune's RSS feed to get the audio files. Surely they would somehow be included there? Of course Apple doesn't give you a simple RSS feed link on the iTunes podcast page, so I had to rummage around and eventually found out this is the link you have to use:
-```
-https://itunes.apple.com/lookup?id=1243705452&entity=podcast
-
-```
-
-Surprise surprise, from the json file this links points to, I found out the main Critical Role podcast page [has a proper RSS feed][2]. To my defense, the RSS button on the main podcast page brings you to some PodBean crap page.
-
-Anyway, once you have the RSS feed, it's only a matter of using `grep` and `sed` until you get what you want.
-
-Around 20 minutes later, I had downloaded all the episodes, for a total of 22Gb! Victory dance!
-
-Video clip loop of the Critical Role doing a victory dance.
-
-### Script
-
-Here's the bash script I wrote. You will need `recode` to run it, as the RSS feed includes some HTML entities.
-```
-# Get the whole RSS feed
-wget -qO /tmp/criticalrole.rss http://criticalrolepodcast.geekandsundry.com/feed/
-
-# Extract the URLS and the episode titles
-mp3s=( $(grep -o "http.\+mp3" /tmp/criticalrole.rss) )
-titles=( $(tail -n +45 /tmp/criticalrole.rss | grep -o ".\+" \
- | sed -r 's@?title>@@g; s@ @\\@g' | recode html..utf8) )
-
-# Download all the episodes under their titles
-for i in ${!titles[*]}
-do
- wget -qO "$(sed -e "s@\\\@\\ @g" <<< "${titles[$i]}").mp3" ${mp3s[$i]}
-done
-
-```
-
-1 - For those of you not familiar with Critical Role, it's web series where a group of voice actresses and actors from LA play Dungeons & Dragons. It's so good even people like me who never played D&D can enjoy it..
-
---------------------------------------------------------------------------------
-
-via: https://veronneau.org/downloading-all-the-critical-role-podcasts-in-one-batch.html
-
-作者:[Louis-Philippe Véronneau][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://veronneau.org/
-[1]:https://en.wikipedia.org/wiki/Critical_Role
-[2]:http://criticalrolepodcast.geekandsundry.com/feed/
diff --git a/sources/tech/20180226 -Getting to Done- on the Linux command line.md b/sources/tech/20180226 -Getting to Done- on the Linux command line.md
index c325a0d884..321a3e3002 100644
--- a/sources/tech/20180226 -Getting to Done- on the Linux command line.md
+++ b/sources/tech/20180226 -Getting to Done- on the Linux command line.md
@@ -1,3 +1,5 @@
+Translating by Guevaraya
+
'Getting to Done' on the Linux command line
======
diff --git a/sources/talk/20180327 Protecting Code Integrity with PGP - Part 7- Protecting Online Accounts.md b/sources/tech/20180327 Protecting Code Integrity with PGP - Part 7- Protecting Online Accounts.md
similarity index 100%
rename from sources/talk/20180327 Protecting Code Integrity with PGP - Part 7- Protecting Online Accounts.md
rename to sources/tech/20180327 Protecting Code Integrity with PGP - Part 7- Protecting Online Accounts.md
diff --git a/sources/tech/20180331 Emacs -4- Automated emails to org-mode and org-mode syncing.md b/sources/tech/20180331 Emacs -4- Automated emails to org-mode and org-mode syncing.md
deleted file mode 100644
index 4efe606f51..0000000000
--- a/sources/tech/20180331 Emacs -4- Automated emails to org-mode and org-mode syncing.md
+++ /dev/null
@@ -1,72 +0,0 @@
-Emacs #4: Automated emails to org-mode and org-mode syncing
-======
-This is fourth in [a series on Emacs and org-mode][1].
-
-Hopefully by now you’ve started to see how powerful and useful org-mode is. If you’re like me, you’re thinking:
-
-“I’d really like to have this in sync across all my devices.”
-
-and, perhaps:
-
-“Can I forward emails into org-mode?”
-
-This being Emacs, the answers, of course, are “Yes.”
-
-### Syncing
-
-Since org-mode just uses text files, syncing is pretty easily accomplished using any number of tools. I use git with git-remote-gcrypt. Due to some limitations of git-remote-gcrypt, each machine tends to push to its own branch, and to master on command. Each machine merges from all the other branches and pushes the result to master after a merge. A cron job causes pushes to the machine’s branch to happen, and a bit of elisp coordinates it all — making sure to save buffers before a sync, refresh them from disk after, etc.
-
-The code for this post is somewhat more extended, so I will be linking to it on github rather than posting inline.
-
-I have a directory $HOME/org where all my org-stuff lives. In ~/org lives [a Makefile][2] that handles the syncing. It defines these targets:
-
- * push: adds, commits, and pushes to a branch named after the machine’s hostname
- * fetch: does a simple git fetch
- * sync: adds, commits, pulls remote changes, merges, and (assuming the merge was successful) pushes to the branch named after the machine’s hostname plus master
-
-
-
-Now, in my user’s crontab, I have this:
-```
-*/15 * * * * make -C $HOME/org push fetch 2>&1 | logger --tag 'orgsync'
-
-```
-
-The [accompanying elisp code][3] defines a shortcut (C-c s) to cause a sync to occur. Thanks to the cronjob, as long as files were saved — even if I didn’t explicitly sync on the other boxen — they’ll be pulled in.
-
-I have found this setup to work really well.
-
-### Emailing to org-mode
-
-Before going down this path, one should ask the question: do you really need it? I use org-mode with mu4e, and the integration is excellent; any org task can link to an email by message-id, and this is ideal — it lets a person do things like make a reminder to reply to a message in a week.
-
-However, org is not just about reminders. It’s also a knowledge base, authoring system, etc. And, not all of my mail clients use mu4e. (Note: things like MobileOrg exist for mobile devices). I don’t actually use this as much as I thought I would, but it has its uses and I thought I’d document it here too.
-
-Now I didn’t want to just be able to accept plain text email. I wanted to be able to handle attachments, HTML mail, etc. This quickly starts to sound problematic — but with tools like ripmime and pandoc, it’s not too bad.
-
-The first step is to set up some way to get mail into a specific folder. A plus-extension, special user, whatever. I then use a [fetchmail configuration][4] to pull it down and run my [insorgmail][5] script.
-
-This script is where all the interesting bits happen. It starts with ripmime to process the message. HTML bits are converted from HTML to org format using pandoc. an org hierarchy is made to represent the structure of the email as best as possible. emails can get pretty complicated, with HTML and the rest, but I have found this does an acceptable job with my use cases.
-
-### Up next…
-
-My last post on org-mode will talk about using it to write documents and prepare slides — a use for which I found myself surprisingly pleased with it, but which needed a bit of tweaking.
-
-
-
---------------------------------------------------------------------------------
-
-via: http://changelog.complete.org/archives/9898-emacs-4-automated-emails-to-org-mode-and-org-mode-syncing
-
-作者:[John Goerzen][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:http://changelog.complete.org/
-[1]:https://changelog.complete.org/archives/tag/emacs2018
-[2]:https://github.com/jgoerzen/public-snippets/blob/master/emacs/org-tools/Makefile
-[3]:https://github.com/jgoerzen/public-snippets/blob/master/emacs/org-tools/emacs-config.org
-[4]:https://github.com/jgoerzen/public-snippets/blob/master/emacs/org-tools/fetchmailrc.orgmail
-[5]:https://github.com/jgoerzen/public-snippets/blob/master/emacs/org-tools/insorgmail
diff --git a/sources/tech/20180404 Emacs -5- Documents and Presentations with org-mode.md b/sources/tech/20180404 Emacs -5- Documents and Presentations with org-mode.md
deleted file mode 100644
index 06c8dc8856..0000000000
--- a/sources/tech/20180404 Emacs -5- Documents and Presentations with org-mode.md
+++ /dev/null
@@ -1,177 +0,0 @@
-Emacs #5: Documents and Presentations with org-mode
-======
-
-### 1 About org-mode exporting
-
-#### 1.1 Background
-
-org-mode isn't just an agenda-making program. It can also export to lots of formats: LaTeX, PDF, Beamer, iCalendar (agendas), HTML, Markdown, ODT, plain text, man pages, and more complicated formats such as a set of web pages.
-
-This isn't just some afterthought either; it's a core part of the system and integrates very well.
-
-One file can be source code, automatically-generated output, task list, documentation, and presentation, all at once.
-
-Some use org-mode as their preferred markup format, even for things like LaTeX documents. The org-mode manual has an extensive [section on exporting][13].
-
-#### 1.2 Getting started
-
-From any org-mode document, just hit C-c C-e. From there will come up a menu, letting you choose various export formats and options. These are generally single-key options so it's easy to set and execute. For instance, to export a document to a PDF, use C-c C-e l p or for HTML export, C-c C-e h h.
-
-There are lots of settings available for all of these export options; see the manual. It is, in fact, quite possible to use LaTeX-format equations in both LaTeX and HTML modes, to insert arbitrary preambles and settings for different modes, etc.
-
-#### 1.3 Add-on packages
-
-ELPA containts many addition exporters for org-mode as well. Check there for details.
-
-### 2 Beamer slides with org-mode
-
-#### 2.1 About Beamer
-
-[Beamer][14] is a LaTeX environment for making presentations. Its features include:
-
-* Automated generating of structural elements in the presentation (see, for example, [the Marburg theme][1]). This provides a visual reference for the audience of where they are in the presentation.
-
-* Strong help for structuring the presentation
-
-* Themes
-
-* Full LaTeX available
-
-#### 2.2 Benefits of Beamer in org-mode
-
-org-mode has a lot of benefits for working with Beamer. Among them:
-
-* org-mode's very easy and strong support for visualizing and changing the structure makes it very quick to reorganize your material.
-
-* Combined with org-babel, live source code (with syntax highlighting) and results can be embedded.
-
-* The syntax is often easier to work with.
-
-I have completely replaced my usage of LibreOffice/Powerpoint/GoogleDocs with org-mode and beamer. It is, in fact, rather frustrating when I have to use one of those tools, as they are nowhere near as strong as org-mode for visualizing a presentation structure.
-
-#### 2.3 Headline Levels
-
-org-mode's Beamer export will convert sections of your document (defined by headings) into slides. The question, of course, is: which sections? This is governed by the H [export setting][15] (org-export-headline-levels).
-
-There are many ways to go, which suit people. I like to have my presentation like this:
-
-```
-#+OPTIONS: H:2
-#+BEAMER_HEADER: \AtBeginSection{\frame{\sectionpage}}
-```
-
-This gives a standalone section slide for each major topic, to highlight major transitions, and then takes the level 2 (two asterisks) headings to set the slide. Many Beamer themes expect a third level of indirection, so you would set H:3 for them.
-
-#### 2.4 Themes and settings
-
-You can configure many Beamer and LaTeX settings in your document by inserting lines at the top of your org file. This document, for instance, defines:
-
-```
-#+TITLE: Documents and presentations with org-mode
-#+AUTHOR: John Goerzen
-#+BEAMER_HEADER: \institute{The Changelog}
-#+PROPERTY: comments yes
-#+PROPERTY: header-args :exports both :eval never-export
-#+OPTIONS: H:2
-#+BEAMER_THEME: CambridgeUS
-#+BEAMER_COLOR_THEME: default
-```
-
-#### 2.5 Advanced settings
-
-I like to change some colors, bullet formatting, and the like. I round out my document with:
-
-```
-# We can't just +BEAMER_INNER_THEME: default because that picks the theme default.
-# Override per https://tex.stackexchange.com/questions/11168/change-bullet-style-formatting-in-beamer
-#+BEAMER_INNER_THEME: default
-#+LaTeX_CLASS_OPTIONS: [aspectratio=169]
-#+BEAMER_HEADER: \definecolor{links}{HTML}{0000A0}
-#+BEAMER_HEADER: \hypersetup{colorlinks=,linkcolor=,urlcolor=links}
-#+BEAMER_HEADER: \setbeamertemplate{itemize items}[default]
-#+BEAMER_HEADER: \setbeamertemplate{enumerate items}[default]
-#+BEAMER_HEADER: \setbeamertemplate{items}[default]
-#+BEAMER_HEADER: \setbeamercolor*{local structure}{fg=darkred}
-#+BEAMER_HEADER: \setbeamercolor{section in toc}{fg=darkred}
-#+BEAMER_HEADER: \setlength{\parskip}{\smallskipamount}
-```
-
-Here, aspectratio=169 sets a 16:9 aspect ratio, and the remaining are standard LaTeX/Beamer configuration bits.
-
-#### 2.6 Shrink (to fit)
-
-Sometimes you've got some really large code examples and you might prefer to just shrink the slide to fit.
-
-Just type C-c C-x p, set the BEAMER_opt property to shrink=15\.
-
-(Or a larger value of shrink). The previous slide uses this here.
-
-#### 2.7 Result
-
-Here's the end result:
-
- [][16]
-
-### 3 Interactive Slides
-
-#### 3.1 Interactive Emacs Slideshows
-
-With the [org-tree-slide package][17], you can display your slideshow from right within Emacs. Just run M-x org-tree-slide-mode. Then, use C-> and C-< to move between slides.
-
-You might find C-c C-x C-v (which is org-toggle-inline-images) helpful to cause the system to display embedded images.
-
-#### 3.2 HTML Slideshows
-
-There are a lot of ways to export org-mode presentations to HTML, with various levels of JavaScript integration. See the [non-beamer presentations section][18] of the org-mode wiki for details.
-
-### 4 Miscellaneous
-
-#### 4.1 Additional resources to accompany this post
-
-* [orgmode.org beamer tutorial][2]
-
-* [LaTeX wiki][3]
-
-* [Generating section title slides][4]
-
-* [Shrinking content to fit on slide][5]
-
-* A great resource: refcard-org-beamer See its [Github repo][6] Make sure to check out both the PDF and the .org file
-
-* A nice [Theme matrix][7]
-
-#### 4.2 Up next in my Emacs series…
-
-mu4e for email!
-
-
---------------------------------------------------------------------------------
-
-via: http://changelog.complete.org/archives/9900-emacs-5-documents-and-presentations-with-org-mode
-
-作者:[John Goerzen][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-选题:[lujun9972](https://github.com/lujun9972)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:http://changelog.complete.org/archives/author/jgoerzen
-[1]:https://hartwork.org/beamer-theme-matrix/all/beamer-albatross-Marburg-1.png
-[2]:https://orgmode.org/worg/exporters/beamer/tutorial.html
-[3]:https://en.wikibooks.org/wiki/LaTeX/Presentations
-[4]:https://tex.stackexchange.com/questions/117658/automatically-generate-section-title-slides-in-beamer/117661
-[5]:https://tex.stackexchange.com/questions/78514/content-doesnt-fit-in-one-slide
-[6]:https://github.com/fniessen/refcard-org-beamer
-[7]:https://hartwork.org/beamer-theme-matrix/
-[8]:https://changelog.complete.org/archives/tag/emacs2018
-[9]:https://github.com/jgoerzen/public-snippets/blob/master/emacs/emacs-org-beamer/emacs-org-beamer.org
-[10]:http://changelog.complete.org/archives/9900-emacs-5-documents-and-presentations-with-org-mode
-[11]:https://github.com/jgoerzen/public-snippets/raw/master/emacs/emacs-org-beamer/emacs-org-beamer.pdf
-[12]:https://github.com/jgoerzen/public-snippets/raw/master/emacs/emacs-org-beamer/emacs-org-beamer-document.pdf
-[13]:https://orgmode.org/manual/Exporting.html#Exporting
-[14]:https://en.wikipedia.org/wiki/Beamer_(LaTeX)
-[15]:https://orgmode.org/manual/Export-settings.html#Export-settings
-[16]:https://www.flickr.com/photos/jgoerzen/26366340577/in/dateposted/
-[17]:https://orgmode.org/worg/org-tutorials/non-beamer-presentations.html#org-tree-slide
-[18]:https://orgmode.org/worg/org-tutorials/non-beamer-presentations.html
diff --git a/sources/tech/20180409 How to create LaTeX documents with Emacs.md b/sources/tech/20180409 How to create LaTeX documents with Emacs.md
deleted file mode 100644
index 7dc16bcf10..0000000000
--- a/sources/tech/20180409 How to create LaTeX documents with Emacs.md
+++ /dev/null
@@ -1,281 +0,0 @@
-How to create LaTeX documents with Emacs
-======
-
-
-In his excellent article, [An introduction to creating documents in LaTeX][1], author [Aaron Cocker][2] introduces the [LaTeX typesetting system][3] and explains how to create a LaTeX document using [TeXstudio][4]. He also lists a few LaTeX editors that many users find helpful in creating LaTeX documents.
-
-This comment on the article by [Greg Pittman][5] caught my attention: "LaTeX seems like an awful lot of typing when you first start...". This is true. LaTeX involves a lot of typing and debugging, if you missed a special character like an exclamation mark, which can discourage many users, especially beginners. In this article, I will introduce you to [GNU Emacs][6] and describe how to use it to create LaTeX documents.
-
-### Creating your first document
-
-Launch Emacs by typing:
-```
-emacs -q --no-splash helloworld.org
-
-```
-
-The `-q` flag ensures that no Emacs initializations will load. The `--no-splash-screen` flag prevents splash screens to ensure that only one window is open, with the file `helloworld.org`.
-
-![Emacs startup screen][8]
-
-GNU Emacs with the helloworld.org file opened in a buffer window
-
-Let's add some LaTeX headers the Emacs way: Go to **Org** in the menu bar and select **Export/Publish**.
-
-![template_flow.png][10]
-
-Inserting a default template
-
-In the next window, Emacs offers options to either export or insert a template. Insert the template by entering **#** ([#] Insert template). This will move a cursor to a mini-buffer, where the prompt reads **Options category:**. At this time you may not know the category names; press Tab to see possible completions. Type "default" and press Enter. The following content will be inserted:
-```
-#+TITLE: helloworld
-
-#+DATE: <2018-03-12 Mon>
-
-#+AUTHOR:
-
-#+EMAIL: makerpm@nubia
-
-#+OPTIONS: ':nil *:t -:t ::t <:t H:3 \n:nil ^:t arch:headline
-
-#+OPTIONS: author:t c:nil creator:comment d:(not "LOGBOOK") date:t
-
-#+OPTIONS: e:t email:nil f:t inline:t num:t p:nil pri:nil stat:t
-
-#+OPTIONS: tags:t tasks:t tex:t timestamp:t toc:t todo:t |:t
-
-#+CREATOR: Emacs 25.3.1 (Org mode 8.2.10)
-
-#+DESCRIPTION:
-
-#+EXCLUDE_TAGS: noexport
-
-#+KEYWORDS:
-
-#+LANGUAGE: en
-
-#+SELECT_TAGS: export
-
-```
-
-Change the title, date, author, and email as you wish. Mine looks like this:
-```
-#+TITLE: Hello World! My first LaTeX document
-
-#+DATE: \today
-
-#+AUTHOR: Sachin Patil
-
-#+EMAIL: psachin@redhat.com
-
-```
-
-We don't want to create a Table of Contents yet, so change the value of `toc` from `t` to `nil` inline, as shown below:
-```
-#+OPTIONS: tags:t tasks:t tex:t timestamp:t toc:nil todo:t |:t
-
-```
-
-Let's add a section and paragraphs. A section starts with an asterisk (*). We'll copy the content of some paragraphs from Aaron's post (from the [Lipsum Lorem Ipsum generator][11]):
-```
-* Introduction
-
-
-
- \paragraph{}
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras lorem
-
- nisi, tincidunt tempus sem nec, elementum feugiat ipsum. Nulla in
-
- diam libero. Nunc tristique ex a nibh egestas sollicitudin.
-
-
-
- \paragraph{}
-
- Mauris efficitur vitae ex id egestas. Vestibulum ligula felis,
-
- pulvinar a posuere id, luctus vitae leo. Sed ac imperdiet orci, non
-
- elementum leo. Nullam molestie congue placerat. Phasellus tempor et
-
- libero maximus commodo.
-
-```
-
-
-![helloworld_file.png][13]
-
-The helloworld.org file
-
-With the content in place, we'll export the content as a PDF. Select **Export/Publish** from the **Org** menu again, but this time, type **l** (export to LaTeX), followed by **o** (as PDF file and open). This not only opens PDF file for you to view, but also saves the file as `helloworld.pdf` in the same path as `helloworld.org`.
-
-![org_to_pdf.png][15]
-
-Exporting helloworld.org to helloworld.pdf
-
-![org_and_pdf_file.png][17]
-
-Opening the helloworld.pdf file
-
-You can also export org to PDF by pressing `Alt + x`, then typing "org-latex-export-to-pdf". Use Tab to auto-complete.
-
-Emacs also creates the `helloworld.tex` file to give you control over the content.
-
-![org_tex_pdf.png][19]
-
-Emacs with LaTeX, org, and PDF files open in three different windows
-
-You can compile the `.tex` file to `.pdf` using the command:
-```
-pdflatex helloworld.tex
-
-```
-
-You can also export the `.org` file to HTML or as a simple text file. What I like about .org files is they can be pushed to [GitHub][20], where they are rendered just like any other markdown formats.
-
-### Creating a LaTeX Beamer presentation
-
-Let's go a step further and create a LaTeX [Beamer][21] presentation using the same file with some modifications as shown below:
-```
-#+TITLE: LaTeX Beamer presentation
-
-#+DATE: \today
-
-#+AUTHOR: Sachin Patil
-
-#+EMAIL: psachin@redhat.com
-
-#+OPTIONS: ':nil *:t -:t ::t <:t H:3 \n:nil ^:t arch:headline
-
-#+OPTIONS: author:t c:nil creator:comment d:(not "LOGBOOK") date:t
-
-#+OPTIONS: e:t email:nil f:t inline:t num:t p:nil pri:nil stat:t
-
-#+OPTIONS: tags:t tasks:t tex:t timestamp:t toc:nil todo:t |:t
-
-#+CREATOR: Emacs 25.3.1 (Org mode 8.2.10)
-
-#+DESCRIPTION:
-
-#+EXCLUDE_TAGS: noexport
-
-#+KEYWORDS:
-
-#+LANGUAGE: en
-
-#+SELECT_TAGS: export
-
-#+LATEX_CLASS: beamer
-
-#+BEAMER_THEME: Frankfurt
-
-#+BEAMER_INNER_THEME: rounded
-
-
-
-
-
-* Introduction
-
-*** Programming
-
- - Python
-
- - Ruby
-
-
-
-*** Paragraph one
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing
-
- elit. Cras lorem nisi, tincidunt tempus sem nec, elementum feugiat
-
- ipsum. Nulla in diam libero. Nunc tristique ex a nibh egestas
-
- sollicitudin.
-
-
-
-*** Paragraph two
-
-
-
- Mauris efficitur vitae ex id egestas. Vestibulum
-
- ligula felis, pulvinar a posuere id, luctus vitae leo. Sed ac
-
- imperdiet orci, non elementum leo. Nullam molestie congue
-
- placerat. Phasellus tempor et libero maximus commodo.
-
-
-
-* Thanks
-
-*** Links
-
- - Link one
-
- - Link two
-
-```
-
-We have added three more lines to the header:
-```
-#+LATEX_CLASS: beamer
-
-#+BEAMER_THEME: Frankfurt
-
-#+BEAMER_INNER_THEME: rounded
-
-```
-
-To export to PDF, press `Alt + x` and type "org-beamer-export-to-pdf".
-
-![latex_beamer_presentation.png][23]
-
-The Latex Beamer presentation, created using Emacs and Org mode
-
-I hope you enjoyed creating this LaTeX and Beamer document using Emacs (note that it's faster to use keyboard shortcuts than a mouse). Emacs Org-mode offers much more than I can cover in this post; you can learn more at [orgmode.org][24].
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/4/how-create-latex-documents-emacs
-
-作者:[Sachin Patil][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-选题:[lujun9972](https://github.com/lujun9972)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://opensource.com/users/psachin
-[1]:https://opensource.com/article/17/6/introduction-latex
-[2]:https://opensource.com/users/aaroncocker
-[3]:https://www.latex-project.org
-[4]:http://www.texstudio.org/
-[5]:https://opensource.com/users/greg-p
-[6]:https://www.gnu.org/software/emacs/
-[7]:/file/392261
-[8]:https://opensource.com/sites/default/files/styles/panopoly_image_original/public/images/life-uploads/emacs_startup.png?itok=UnT4PgK5 (Emacs startup screen)
-[9]:/file/392266
-[10]:https://opensource.com/sites/default/files/styles/panopoly_image_original/public/images/life-uploads/insert_template_flow.png?itok=V_c2KipO (template_flow.png)
-[11]:https://www.lipsum.com/feed/html
-[12]:/file/392271
-[13]:https://opensource.com/sites/default/files/styles/panopoly_image_original/public/images/life-uploads/helloworld_file.png?itok=o8IX0TsJ (helloworld_file.png)
-[14]:/file/392276
-[15]:https://opensource.com/sites/default/files/styles/panopoly_image_original/public/images/life-uploads/org_to_pdf.png?itok=fNnC1Y-L (org_to_pdf.png)
-[16]:/file/392281
-[17]:https://opensource.com/sites/default/files/styles/panopoly_image_original/public/images/life-uploads/org_and_pdf_file.png?itok=HEhtw-cu (org_and_pdf_file.png)
-[18]:/file/392286
-[19]:https://opensource.com/sites/default/files/styles/panopoly_image_original/public/images/life-uploads/org_tex_pdf.png?itok=poZZV_tj (org_tex_pdf.png)
-[20]:https://github.com
-[21]:https://www.sharelatex.com/learn/Beamer
-[22]:/file/392291
-[23]:https://opensource.com/sites/default/files/styles/panopoly_image_original/public/images/life-uploads/latex_beamer_presentation.png?itok=rsPSeIuM (latex_beamer_presentation.png)
-[24]:https://orgmode.org/worg/org-tutorials/org-latex-export.html
diff --git a/sources/tech/20180412 NGINX Unit 1.0 An App Server That Supports Go.md b/sources/tech/20180412 NGINX Unit 1.0 An App Server That Supports Go.md
deleted file mode 100644
index 2f86fe2f01..0000000000
--- a/sources/tech/20180412 NGINX Unit 1.0 An App Server That Supports Go.md
+++ /dev/null
@@ -1,108 +0,0 @@
-Announcing NGINX Unit 1.0
-============================================================
-
-Today, April 12, marks a significant milestone in the development of [NGINX Unit][8], our dynamic web and application server. Approximately six months after its [first public release][9], we’re now happy to announce that NGINX Unit is generally available and production‑ready. NGINX Unit is our new open source initiative led by Igor Sysoev, creator of the original NGINX Open Source software, which is now used by more than [409 million websites][10].
-
-“I set out to make an application server which will be remotely and dynamically configured, and able to switch dynamically from one language or application version to another,” explains Igor. “Dynamic configuration and switching I saw as being certainly the main problem. People want to reconfigure servers without interrupting client processing.”
-
-NGINX Unit is dynamically configured using a REST API; there is no static configuration file. All configuration changes happen directly in memory. Configuration changes take effect without requiring process reloads or service interruptions.
-
-
-NGINX Unit runs multiple languages simultaneously
-
-“The dynamic switching requires that we can run different languages and language versions in one server,” continues Igor.
-
-As of Release 1.0, NGINX Unit supports Go, Perl, PHP, Python, and Ruby on the same server. Multiple language versions are also supported, so you can, for instance, run applications written for PHP 5 and PHP 7 on the same server. Support for additional languages, including Java, is planned for future NGINX Unit releases.
-
-Note: We have an additional blog post on [how to configure NGINX, NGINX Unit, and WordPress][11] to work together.
-
-Igor studied at Moscow State Technical University, which was a pioneer in the Russian space program, and April 12 has a special significance. “This is the anniversary of the first manned spaceflight in history, made by [Yuri Gagarin][12]. The first public version of NGINX [0.1.0] was released on [[October 4, 2004][7],] the anniversary of the [Sputnik][13] launch, and NGINX 1.0 was launched on April 12, 2011.”
-
-### What Is NGINX Unit?
-
-NGINX Unit is a dynamic web and application server, suitable for both stand‑alone applications and distributed, microservices application architectures. It launches and scales application processes on demand, executing each application instance in its own secure sandbox.
-
-NGINX Unit manages and routes all incoming network transactions to the application through a separate “router” process, so it can rapidly implement configuration changes without interrupting service.
-
-“The configuration is in JSON format, so users can edit it manually, and it’s very suitable for scripting. We hope to add capabilities to [NGINX Controller][14] and [NGINX Amplify][15] to work with Unit configuration too,” explains Igor.
-
-The NGINX Unit configuration process is described thoroughly in the [documentation][16].
-
-“Now Unit can run Python, PHP, Ruby, Perl and Go – five languages. For example, during our beta, one of our users used Unit to run a number of different PHP platform versions on a single host,” says Igor.
-
-NGINX Unit’s ability to run multiple language runtimes is based on its internal separation between the router process, which terminates incoming HTTP requests, and groups of application processes, which implement the application runtime and execute application code.
-
-
-NGINX Unit architecture
-
-The router process is persistent – it never restarts – meaning that configuration updates can be implemented seamlessly, without any interruption in service. Each application process is deployed in its own sandbox (with support for [Linux control groups][17] [cgroups] under active development), so that NGINX Unit provides secure isolation for user code.
-
-### What’s Next for NGINX Unit?
-
-The next milestones for the NGINX Unit engineering team after Release 1.0 are concerned with HTTP maturity, serving static content, and additional language support.
-
-“We plan to add SSL and HTTP/2 capabilities in Unit,” says Igor. “Also, we plan to support routing in configurations; currently, we have direct mapping from one listen port to one application. We plan to add routing using URIs and hostnames, etc.”
-
-“In addition, we want to add more language support to Unit. We are completing the Ruby implementation, and next we will consider Node.js and Java. Java will be added in a Tomcat‑compatible fashion.”
-
-The end goal for NGINX Unit is to create an open source platform for distributed, polyglot applications which can run application code securely, reliably, and with the best possible performance. The platform will self‑manage, with capabilities such as autoscaling to meet SLAs within resource constraints, and service discovery and internal load balancing to make it easy to create a [service mesh][18].
-
-### NGINX Unit and the NGINX Application Platform
-
-An NGINX Unit platform will typically be delivered with a front‑end tier of NGINX Open Source or NGINX Plus reverse proxies to provide ingress control, edge load balancing, and security. The joint platform (NGINX Unit and NGINX or NGINX Plus) can then be managed fully using NGINX Controller to monitor, configure, and control the entire platform.
-
-
-The NGINX Application Platform is our vision for building microservices
-
-Together, these three components – NGINX Plus, NGINX Unit, and NGINX Controller – make up the [NGINX Application Platform][19]. The NGINX Application Platform is a product suite that delivers load balancing, caching, API management, a WAF, and application serving, with rich management and control planes that simplify the tasks of operating monolithic, microservices, and transitional applications.
-
-### Getting Started with NGINX Unit
-
-NGINX Unit is free and open source. Please see the [installation instructions][20] to get started. We have prebuilt packages for most operating systems, including Ubuntu and Red Hat Enterprise Linux. We also make a [Docker container][21] available on Docker Hub.
-
-The source code is available in our [Mercurial repository][22] and [mirrored on GitHub][23]. The code is available under the Apache 2.0 license. You can compile NGINX Unit yourself on most popular Linux and Unix systems.
-
-If you have any questions, please use the [GitHub issues board][24] or the [NGINX Unit mailing list][25]. We’d love to hear how you are using NGINX Unit, and we welcome [code contributions][26] too.
-
-We’re also happy to extend technical support for NGINX Unit to NGINX Plus customers with Professional or Enterprise support contracts. Please refer to our [Support page][27] for details of the support services we can offer.
-
---------------------------------------------------------------------------------
-
-via: https://www.nginx.com/blog/nginx-unit-1-0-released/
-
-作者:[www.nginx.com ][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:www.nginx.com
-[1]:https://twitter.com/intent/tweet?text=Announcing+NGINX+Unit+1.0+by+%40nginx+https%3A%2F%2Fwww.nginx.com%2Fblog%2Fnginx-unit-1-0-released%2F
-[2]:http://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fwww.nginx.com%2Fblog%2Fnginx-unit-1-0-released%2F&title=Announcing+NGINX+Unit+1.0&summary=Today%2C+April+12%2C+marks+a+significant+milestone+in+the+development+of+NGINX%26nbsp%3BUnit%2C+our+dynamic+web+and+application+server.+Approximately+six+months+after+its+first+public+release%2C+we%E2%80%99re+now+happy+to+announce+that+NGINX%26nbsp%3BUnit+is+generally+available+and+production%26%238209%3Bready.+NGINX%26nbsp%3BUnit+is+our+new+open+source+initiative+led+by+Igor%26nbsp%3BSysoev%2C+creator+of+the+original+NGINX+Open+Source+%5B%26hellip%3B%5D
-[3]:https://news.ycombinator.com/submitlink?u=https%3A%2F%2Fwww.nginx.com%2Fblog%2Fnginx-unit-1-0-released%2F&t=Announcing%20NGINX%20Unit%201.0&text=Today,%20April%2012,%20marks%20a%20significant%20milestone%20in%20the%20development%20of%20NGINX%C2%A0Unit,%20our%20dynamic%20web%20and%20application%20server.%20Approximately%20six%20months%20after%20its%20first%20public%20release,%20we%E2%80%99re%20now%20happy%20to%20announce%20that%20NGINX%C2%A0Unit%20is%20generally%20available%20and%20production%E2%80%91ready.%20NGINX%C2%A0Unit%20is%20our%20new%20open%20source%20initiative%20led%20by%20Igor%C2%A0Sysoev,%20creator%20of%20the%20original%20NGINX%20Open%20Source%20[%E2%80%A6]
-[4]:https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fwww.nginx.com%2Fblog%2Fnginx-unit-1-0-released%2F
-[5]:https://plus.google.com/share?url=https%3A%2F%2Fwww.nginx.com%2Fblog%2Fnginx-unit-1-0-released%2F
-[6]:http://www.reddit.com/submit?url=https%3A%2F%2Fwww.nginx.com%2Fblog%2Fnginx-unit-1-0-released%2F&title=Announcing+NGINX+Unit+1.0&text=Today%2C+April+12%2C+marks+a+significant+milestone+in+the+development+of+NGINX%26nbsp%3BUnit%2C+our+dynamic+web+and+application+server.+Approximately+six+months+after+its+first+public+release%2C+we%E2%80%99re+now+happy+to+announce+that+NGINX%26nbsp%3BUnit+is+generally+available+and+production%26%238209%3Bready.+NGINX%26nbsp%3BUnit+is+our+new+open+source+initiative+led+by+Igor%26nbsp%3BSysoev%2C+creator+of+the+original+NGINX+Open+Source+%5B%26hellip%3B%5D
-[7]:http://nginx.org/en/CHANGES
-[8]:https://www.nginx.com/products/nginx-unit/
-[9]:https://www.nginx.com/blog/introducing-nginx-unit/
-[10]:https://news.netcraft.com/archives/2018/03/27/march-2018-web-server-survey.html
-[11]:https://www.nginx.com/blog/installing-wordpress-with-nginx-unit/
-[12]:https://en.wikipedia.org/wiki/Yuri_Gagarin
-[13]:https://en.wikipedia.org/wiki/Sputnik_1
-[14]:https://www.nginx.com/products/nginx-controller/
-[15]:https://www.nginx.com/products/nginx-amplify/
-[16]:http://unit.nginx.org/configuration/
-[17]:https://en.wikipedia.org/wiki/Cgroups
-[18]:https://www.nginx.com/blog/what-is-a-service-mesh/
-[19]:https://www.nginx.com/products
-[20]:http://unit.nginx.org/installation/
-[21]:https://hub.docker.com/r/nginx/unit/
-[22]:http://hg.nginx.org/unit
-[23]:https://github.com/nginx/unit
-[24]:https://github.com/nginx/unit/issues
-[25]:http://mailman.nginx.org/mailman/listinfo/unit
-[26]:https://unit.nginx.org/contribution/
-[27]:https://www.nginx.com/support
-[28]:https://www.nginx.com/blog/tag/releases/
-[29]:https://www.nginx.com/blog/tag/nginx-unit/
diff --git a/sources/tech/20180417 How To Browse Stack Overflow From Terminal.md b/sources/tech/20180417 How To Browse Stack Overflow From Terminal.md
deleted file mode 100644
index 1ebf17ef68..0000000000
--- a/sources/tech/20180417 How To Browse Stack Overflow From Terminal.md
+++ /dev/null
@@ -1,138 +0,0 @@
-How To Browse Stack Overflow From Terminal
-======
-
-
-A while ago, we have written about [**SoCLI**][1], a python script to search and browse Stack Overflow website from command line. Today, we will discuss about a similar tool named **“how2”**. It is a command line utility to browse Stack Overflow from Terminal. You can query in the plain English as the way you do in [**Google search**][2] and it uses Google and Stackoverflow APIs to search for the given queries. It is free and open source utility written using NodeJS.
-
-### Browse Stack Overflow From Terminal Using how2
-
-Since how2 is a NodeJS package, we can install it using Npm package manager. If you haven’t installed Npm and NodeJS already, refer the following guide.
-
-After installing Npm and NodeJS, run the following command to install how2 utility.
-```
-$ npm install -g how2
-
-```
-
-Now let us see how to browse Stack Overflow uisng this program. The typical usage to search through Stack Overflow site using “how2” utility is:
-```
-$ how2
-
-```
-
-For example, I am going to search for how to create tgz archive.
-```
-$ how2 create archive tgz
-
-```
-
-Oops! I get the following error.
-```
-/home/sk/.nvm/versions/node/v9.11.1/lib/node_modules/how2/node_modules/devnull/transports/transport.js:59
-Transport.prototype.__proto__ = EventEmitter.prototype;
- ^
-
- TypeError: Cannot read property 'prototype' of undefined
- at Object. (/home/sk/.nvm/versions/node/v9.11.1/lib/node_modules/how2/node_modules/devnull/transports/transport.js:59:46)
- at Module._compile (internal/modules/cjs/loader.js:654:30)
- at Object.Module._extensions..js (internal/modules/cjs/loader.js:665:10)
- at Module.load (internal/modules/cjs/loader.js:566:32)
- at tryModuleLoad (internal/modules/cjs/loader.js:506:12)
- at Function.Module._load (internal/modules/cjs/loader.js:498:3)
- at Module.require (internal/modules/cjs/loader.js:598:17)
- at require (internal/modules/cjs/helpers.js:11:18)
- at Object. (/home/sk/.nvm/versions/node/v9.11.1/lib/node_modules/how2/node_modules/devnull/transports/stream.js:8:17)
- at Module._compile (internal/modules/cjs/loader.js:654:30)
-
-```
-
-I may be a bug. I hope it gets fixed in the future versions. However, I find a workaround posted [**here**][3].
-
-To fix this error temporarily, you need to edit the **transport.js** file using command:
-```
-$ vi /home/sk/.nvm/versions/node/v9.11.1/lib/node_modules/how2/node_modules/devnull/transports/transport.js
-
-```
-
-The actual path of this file will be displayed in your error output. Replace the above file path with your own. Then find the following line:
-```
-var EventEmitter = process.EventEmitter;
-
-```
-
-and replace it with following line:
-```
-var EventEmitter = require('events');
-
-```
-
-Press ESC and type **:wq** to save and quit the file.
-
-Now search again the query.
-```
-$ how2 create archive tgz
-
-```
-
-Here is the sample output from my Ubuntu system.
-
-[![][4]][5]
-
-If the answer you’re looking for is not displayed in the above output, press **SPACE BAR** key to start the interactive search where you can go through all suggested questions and answers from the Stack Overflow site.
-
-[![][4]][6]
-
-Use UP/DOWN arrows to move between the results. Once you got the right answer/question, hit SPACE BAR or ENTER key to open it in the Terminal.
-
-[![][4]][7]
-
-To go back and exit, press **ESC**.
-
-**Search answers for specific language**
-
-If you don’t specify a language it **defaults to Bash** unix command line and give you immediately the most likely answer as above. You can also narrow the results to a specific language, for example perl, python, c, Java etc.
-
-For instance, to search for queries related to “Python” language only using **-l** flag as shown below.
-```
-$ how2 -l python linked list
-
-```
-
-[![][4]][8]
-
-To get a quick help, type:
-```
-$ how2 -h
-
-```
-
-### Conclusion
-
-The how2 utility is a basic command line program to quickly search for questions and answers from Stack Overflow without leaving your Terminal and it does this job pretty well. However, it is just CLI browser for Stack overflow. For some advanced features such as searching most voted questions, searching queries using multiple tags, colored interface, submitting a new question and viewing questions stats etc., **SoCLI** is good to go.
-
-And, that’s all for now. Hope this was useful. I will be soon here with another useful guide. Until then, stay tuned with OSTechNix!
-
-Cheers!
-
-
-
---------------------------------------------------------------------------------
-
-via: https://www.ostechnix.com/how-to-browse-stack-overflow-from-terminal/
-
-作者:[SK][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-选题:[lujun9972](https://github.com/lujun9972)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://www.ostechnix.com/author/sk/
-[1]:https://www.ostechnix.com/search-browse-stack-overflow-website-commandline/
-[2]:https://www.ostechnix.com/google-search-navigator-enhance-keyboard-navigation-in-google-search/
-[3]:https://github.com/santinic/how2/issues/79
-[4]:data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
-[5]:http://www.ostechnix.com/wp-content/uploads/2018/04/stack-overflow-1.png
-[6]:http://www.ostechnix.com/wp-content/uploads/2018/04/stack-overflow-2.png
-[7]:http://www.ostechnix.com/wp-content/uploads/2018/04/stack-overflow-3.png
-[8]:http://www.ostechnix.com/wp-content/uploads/2018/04/stack-overflow-4.png
diff --git a/sources/tech/20180425 Things to do After Installing Ubuntu 18.04.md b/sources/tech/20180425 Things to do After Installing Ubuntu 18.04.md
deleted file mode 100644
index 4e69d04837..0000000000
--- a/sources/tech/20180425 Things to do After Installing Ubuntu 18.04.md
+++ /dev/null
@@ -1,294 +0,0 @@
-Things to do After Installing Ubuntu 18.04
-======
-**Brief: This list of things to do after installing Ubuntu 18.04 helps you get started with Bionic Beaver for a smoother desktop experience.**
-
-[Ubuntu][1] 18.04 Bionic Beaver releases today. You are perhaps already aware of the [new features in Ubuntu 18.04 LTS][2] release. If not, here’s the video review of Ubuntu 18.04 LTS:
-
-[Subscribe to YouTube Channel for more Ubuntu Videos][3]
-
-If you opted to install Ubuntu 18.04, I have listed out a few recommended steps that you can follow to get started with it.
-
-### Things to do after installing Ubuntu 18.04 Bionic Beaver
-
-![Things to do after installing Ubuntu 18.04][4]
-
-I should mention that the list of things to do after installing Ubuntu 18.04 depends a lot on you and your interests and needs. If you are a programmer, you’ll focus on installing programming tools. If you are a graphic designer, you’ll focus on installing graphics tools.
-
-Still, there are a few things that should be applicable to most Ubuntu users. This list is composed of those things plus a few of my of my favorites.
-
-Also, this list is for the default [GNOME desktop][5]. If you are using some other flavor like [Kubuntu][6], Lubuntu etc then the GNOME-specific stuff won’t be applicable to your system.
-
-You don’t have to follow each and every point on the list blindly. You should see if the recommended action suits your requirements or not.
-
-With that said, let’s get started with this list of things to do after installing Ubuntu 18.04.
-
-#### 1\. Update the system
-
-This is the first thing you should do after installing Ubuntu. Update the system without fail. It may sound strange because you just installed a fresh OS but still, you must check for the updates.
-
-In my experience, if you don’t update the system right after installing Ubuntu, you might face issues while trying to install a new program.
-
-To update Ubuntu 18.04, press Super Key (Windows Key) to launch the Activity Overview and look for Software Updater. Run it to check for updates.
-
-![Software Updater in Ubuntu 17.10][7]
-
-**Alternatively** , you can use these famous commands in the terminal ( Use Ctrl+Alt+T):
-```
-sudo apt update && sudo apt upgrade
-
-```
-
-#### 2\. Enable additional repositories for more software
-
-[Ubuntu has several repositories][8] from where it provides software for your system. These repositories are:
-
- * Main – Free and open-source software supported by Ubuntu team
- * Universe – Free and open-source software maintained by the community
- * Restricted – Proprietary drivers for devices.
- * Multiverse – Software restricted by copyright or legal issues.
- * Canonical Partners – Software packaged by Ubuntu for their partners
-
-
-
-Enabling all these repositories will give you access to more software and proprietary drivers.
-
-Go to Activity Overview by pressing Super Key (Windows key), and search for Software & Updates:
-
-![Software and Updates in Ubuntu 17.10][9]
-
-Under the Ubuntu Software tab, make sure you have checked all of the Main, Universe, Restricted and Multiverse repository checked.
-
-![Setting repositories in Ubuntu 18.04][10]
-
-Now move to the **Other Software** tab, check the option of **Canonical Partners**.
-
-![Enable Canonical Partners repository in Ubuntu 17.10][11]
-
-You’ll have to enter your password in order to update the software sources. Once it completes, you’ll find more applications to install in the Software Center.
-
-#### 3\. Install media codecs
-
-In order to play media files like MP#, MPEG4, AVI etc, you’ll need to install media codecs. Ubuntu has them in their repository but doesn’t install it by default because of copyright issues in various countries.
-
-As an individual, you can install these media codecs easily using the Ubuntu Restricted Extra package. Click on the link below to install it from the Software Center.
-
-[Install Ubuntu Restricted Extras][12]
-
-Or alternatively, use the command below to install it:
-```
-sudo apt install ubuntu-restricted-extras
-
-```
-
-#### 4\. Install software from the Software Center
-
-Now that you have setup the repositories and installed the codecs, it is time to get software. If you are absolutely new to Ubuntu, please follow this [guide to installing software in Ubuntu][13].
-
-There are several ways to install software. The most convenient way is to use the Software Center that has thousands of software available in various categories. You can install them in a few clicks from the software center.
-
-![Software Center in Ubuntu 17.10 ][14]
-
-It depends on you what kind of software you would like to install. I’ll suggest some of my favorites here.
-
- * **VLC** – media player for videos
- * **GIMP** – Photoshop alternative for Linux
- * **Pinta** – Paint alternative in Linux
- * **Calibre** – eBook management tool
- * **Chromium** – Open Source web browser
- * **Kazam** – Screen recorder tool
- * [**Gdebi**][15] – Lightweight package installer for .deb packages
- * **Spotify** – For streaming music
- * **Skype** – For video messaging
- * **Kdenlive** – [Video editor for Linux][16]
- * **Atom** – [Code editor][17] for programming
-
-
-
-You may also refer to this list of [must-have Linux applications][18] for more software recommendations.
-
-#### 5\. Install software from the Web
-
-Though Ubuntu has thousands of applications in the software center, you may not find some of your favorite applications despite the fact that they support Linux.
-
-Many software vendors provide ready to install .deb packages. You can download these .deb files from their website and install it by double-clicking on it.
-
-[Google Chrome][19] is one such software that you can download from the web and install it.
-
-#### 6\. Opt out of data collection in Ubuntu 18.04 (optional)
-
-Ubuntu 18.04 collects some harmless statistics about your system hardware and your system installation preference. It also collects crash reports.
-
-You’ll be given the option to not send this data to Ubuntu servers when you log in to Ubuntu 18.04 for the first time.
-
-![Opt out of data collection in Ubuntu 18.04][20]
-
-If you miss it that time, you can disable it by going to System Settings -> Privacy and then set the Problem Reporting to Manual.
-
-![Privacy settings in Ubuntu 18.04][21]
-
-#### 7\. Customize the GNOME desktop (Dock, themes, extensions and more)
-
-The GNOME desktop looks good in Ubuntu 18.04 but doesn’t mean you cannot change it.
-
-You can do a few visual changes from the System Settings. You can change the wallpaper of the desktop and the lock screen, you can change the position of the dock (launcher on the left side), change power settings, Bluetooth etc. In short, you can find many settings that you can change as per your need.
-
-![Ubuntu 17.10 System Settings][22]
-
-Changing themes and icons are the major way to change the looks of your system. I advise going through the list of [best GNOME themes][23] and [icons for Ubuntu][24]. Once you have found the theme and icon of your choice, you can use them with GNOME Tweaks tool.
-
-You can install GNOME Tweaks via the Software Center or you can use the command below to install it:
-```
-sudo apt install gnome-tweak-tool
-
-```
-
-Once it is installed, you can easily [install new themes and icons][25].
-
-![Change theme is one of the must to do things after installing Ubuntu 17.10][26]
-
-You should also have a look at [use GNOME extensions][27] to further enhance the looks and capabilities of your system. I made this video about using GNOME extensions in 17.10 and you can follow the same for Ubuntu 18.04.
-
-If you are wondering which extension to use, do take a look at this list of [best GNOME extensions][28].
-
-I also recommend reading this article on [GNOME customization in Ubuntu][29] so that you can know the GNOME desktop in detail.
-
-#### 8\. Prolong your battery and prevent overheating
-
-Let’s move on to [prevent overheating in Linux laptops][30]. TLP is a wonderful tool that controls CPU temperature and extends your laptops’ battery life in the long run.
-
-Make sure that you haven’t installed any other power saving application such as [Laptop Mode Tools][31]. You can install it using the command below in a terminal:
-```
-sudo apt install tlp tlp-rdw
-
-```
-
-Once installed, run the command below to start it:
-```
-sudo tlp start
-
-```
-
-#### 9\. Save your eyes with Nightlight
-
-Nightlight is my favorite feature in GNOME desktop. Keeping [your eyes safe at night][32] from the computer screen is very important. Reducing blue light helps reducing eye strain at night.
-
-![flux effect][33]
-
-GNOME provides a built-in Night Light option, which you can activate in the System Settings.
-
-Just go to System Settings-> Devices-> Displays and turn on the Night Light option.
-
-![Enabling night light is a must to do in Ubuntu 17.10][34]
-
-#### 9\. Disable automatic suspend for laptops
-
-Ubuntu 18.04 comes with a new automatic suspend feature for laptops. If the system is running on battery and is inactive for 20 minutes, it will go in suspend mode.
-
-I understand that the intention is to save battery life but it is an inconvenience as well. You can’t keep the power plugged in all the time because it’s not good for the battery life. And you may need the system to be running even when you are not using it.
-
-Thankfully, you can change this behavior. Go to System Settings -> Power. Under Suspend & Power Button section, either turn off the Automatic Suspend option or extend its time period.
-
-![Disable automatic suspend in Ubuntu 18.04][35]
-
-You can also change the screen dimming behavior in here.
-
-#### 10\. System cleaning
-
-I have written in detail about [how to clean up your Ubuntu system][36]. I recommend reading that article to know various ways to keep your system free of junk.
-
-Normally, you can use this little command to free up space from your system:
-```
-sudo apt autoremove
-
-```
-
-It’s a good idea to run this command every once a while. If you don’t like the command line, you can use a GUI tool like [Stacer][37] or [Bleach Bit][38].
-
-#### 11\. Going back to Unity or Vanilla GNOME (not recommended)
-
-If you have been using Unity or GNOME in the past, you may not like the new customized GNOME desktop in Ubuntu 18.04. Ubuntu has customized GNOME so that it resembles Unity but at the end of the day, it is neither completely Unity nor completely GNOME.
-
-So if you are a hardcore Unity or GNOMEfan, you may want to use your favorite desktop in its ‘real’ form. I wouldn’t recommend but if you insist here are some tutorials for you:
-
-#### 12\. Can’t log in to Ubuntu 18.04 after incorrect password? Here’s a workaround
-
-I noticed a [little bug in Ubuntu 18.04][39] while trying to change the desktop session to Ubuntu Community theme. It seems if you try to change the sessions at the login screen, it rejects your password first and at the second attempt, the login gets stuck. You can wait for 5-10 minutes to get it back or force power it off.
-
-The workaround here is that after it displays the incorrect password message, click Cancel, then click your name, then enter your password again.
-
-#### 13\. Experience the Community theme (optional)
-
-Ubuntu 18.04 was supposed to have a dashing new theme developed by the community. The theme could not be completed so it could not become the default look of Bionic Beaver release. I am guessing that it will be the default theme in Ubuntu 18.10.
-
-![Ubuntu 18.04 Communitheme][40]
-
-You can try out the aesthetic theme even today. [Installing Ubuntu Community Theme][41] is very easy. Just look for it in the software center, install it, restart your system and then at the login choose the Communitheme session.
-
-#### 14\. Get Windows 10 in Virtual Box (if you need it)
-
-In a situation where you must use Windows for some reasons, you can [install Windows in virtual box inside Linux][42]. It will run as a regular Ubuntu application.
-
-It’s not the best way but it still gives you an option. You can also [use WINE to run Windows software on Linux][43]. In both cases, I suggest trying the alternative native Linux application first before jumping to virtual machine or WINE.
-
-#### What do you do after installing Ubuntu?
-
-Those were my suggestions for getting started with Ubuntu. There are many more tutorials that you can find under [Ubuntu 18.04][44] tag. You may go through them as well to see if there is something useful for you.
-
-Enough from myside. Your turn now. What are the items on your list of **things to do after installing Ubuntu 18.04**? The comment section is all yours.
-
---------------------------------------------------------------------------------
-
-via: https://itsfoss.com/things-to-do-after-installing-ubuntu-18-04/
-
-作者:[Abhishek Prakash][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:http://itsfoss.com/author/abhishek/
-[1]:https://www.ubuntu.com/
-[2]:https://itsfoss.com/ubuntu-18-04-release-features/
-[3]:https://www.youtube.com/c/itsfoss?sub_confirmation=1
-[4]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/04/things-to-after-installing-ubuntu-18-04-featured-800x450.jpeg
-[5]:https://www.gnome.org/
-[6]:https://kubuntu.org/
-[7]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2017/10/software-update-ubuntu-17-10.jpg
-[8]:https://help.ubuntu.com/community/Repositories/Ubuntu
-[9]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2017/10/software-updates-ubuntu-17-10.jpg
-[10]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/04/repositories-ubuntu-18.png
-[11]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2017/10/software-repository-ubuntu-17-10.jpeg
-[12]:apt://ubuntu-restricted-extras
-[13]:https://itsfoss.com/remove-install-software-ubuntu/
-[14]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2017/10/Ubuntu-software-center-17-10-800x551.jpeg
-[15]:https://itsfoss.com/gdebi-default-ubuntu-software-center/
-[16]:https://itsfoss.com/best-video-editing-software-linux/
-[17]:https://itsfoss.com/best-modern-open-source-code-editors-for-linux/
-[18]:https://itsfoss.com/essential-linux-applications/
-[19]:https://www.google.com/chrome/
-[20]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/04/opt-out-of-data-collection-ubuntu-18-800x492.jpeg
-[21]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/04/privacy-ubuntu-18-04-800x417.png
-[22]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2017/10/System-Settings-Ubuntu-17-10-800x573.jpeg
-[23]:https://itsfoss.com/best-gtk-themes/
-[24]:https://itsfoss.com/best-icon-themes-ubuntu-16-04/
-[25]:https://itsfoss.com/install-themes-ubuntu/
-[26]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2017/10/GNOME-Tweak-Tool-Ubuntu-17-10.jpeg
-[27]:https://itsfoss.com/gnome-shell-extensions/
-[28]:https://itsfoss.com/best-gnome-extensions/
-[29]:https://itsfoss.com/gnome-tricks-ubuntu/
-[30]:https://itsfoss.com/reduce-overheating-laptops-linux/
-[31]:https://wiki.archlinux.org/index.php/Laptop_Mode_Tools
-[32]:https://itsfoss.com/night-shift-flux-ubuntu-linux/
-[33]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2016/03/flux-eyes-strain.jpg
-[34]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2017/10/Enable-Night-Light-Feature-Ubuntu-17-10-800x396.jpeg
-[35]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/04/disable-automatic-suspend-ubuntu-18-800x586.jpeg
-[36]:https://itsfoss.com/free-up-space-ubuntu-linux/
-[37]:https://itsfoss.com/optimize-ubuntu-stacer/
-[38]:https://itsfoss.com/bleachbit-2-release/
-[39]:https://gitlab.gnome.org/GNOME/gnome-shell/issues/227
-[40]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/04/ubunt-18-theme.jpeg
-[41]:https://itsfoss.com/ubuntu-community-theme/
-[42]:https://itsfoss.com/install-windows-10-virtualbox-linux/
-[43]:https://itsfoss.com/use-windows-applications-linux/
-[44]:https://itsfoss.com/tag/ubuntu-18-04/
diff --git a/sources/tech/20180523 How to dual-boot Linux and Windows.md b/sources/tech/20180523 How to dual-boot Linux and Windows.md
index 5d80e7925d..372097c866 100644
--- a/sources/tech/20180523 How to dual-boot Linux and Windows.md
+++ b/sources/tech/20180523 How to dual-boot Linux and Windows.md
@@ -1,3 +1,4 @@
+translating by Auk7F7
How to dual-boot Linux and Windows
======
diff --git a/sources/tech/20180525 How to Set Different Wallpaper for Each Monitor in Linux.md b/sources/tech/20180525 How to Set Different Wallpaper for Each Monitor in Linux.md
deleted file mode 100644
index 386149400c..0000000000
--- a/sources/tech/20180525 How to Set Different Wallpaper for Each Monitor in Linux.md
+++ /dev/null
@@ -1,89 +0,0 @@
-How to Set Different Wallpaper for Each Monitor in Linux
-======
-**Brief: If you want to display different wallpapers on multiple monitors on Ubuntu 18.04 or any other Linux distribution with GNOME, MATE or Budgie desktop environment, this nifty tool will help you achieve this.**
-
-Multi-monitor setup often leads to multiple issues on Linux but I am not going to discuss those issues in this article. I have rather a positive article on multiple monitor support on Linux.
-
-If you are using multiple monitor, perhaps you would like to setup a different wallpaper for each monitor. I am not sure about other Linux distributions and desktop environments, but Ubuntu with [GNOME desktop][1] doesn’t provide this functionality on its own.
-
-Fret not! In this quick tutorial, I’ll show you how to set a different wallpaper for each monitor on Linux distributions with GNOME desktop environment.
-
-### Setting up different wallpaper for each monitor on Ubuntu 18.04 and other Linux distributions
-
-![Different wallaper on each monitor in Ubuntu][2]
-
-I am going to use a nifty tool called [HydraPaper][3] for setting different backgrounds on different monitors. HydraPaper is a [GTK][4] based application to set different backgrounds for each monitor in [GNOME desktop environment][5].
-
-It also supports on [MATE][6] and [Budgie][7] desktop environments. Which means Ubuntu MATE and [Ubuntu Budgie][8] users can also benefit from this application.
-
-#### Install HydraPaper on Linux using FlatPak
-
-HydraPaper can be installed easily using [FlatPak][9]. Ubuntu 18.04 already provides support for FlatPaks so all you need to do is to download the application file and double click on it to open it with the GNOME Software Center.
-
-You can refer to this article to learn [how to enable FlatPak support][10] on your distribution. Once you have the FlatPak support enabled, just download it from [FlatHub][11] and install it.
-
-[Download HydraPaper][12]
-
-#### Using HydraPaper for setting different background on different monitors
-
-Once installed, just look for HydraPaper in application menu and start the application. You’ll see images from your Pictures folder here because by default the application takes images from the Pictures folder of the user.
-
-You can add your own folder(s) where you keep your wallpapers. Do note that it doesn’t find images recursively. If you have nested folders, it will only show images from the top folder.
-
-![Setting up different wallpaper for each monitor on Linux][13]
-
-Using HydraPaper is absolutely simple. Just select the wallpapers for each monitor and click on the apply button at the top. You can easily identify external monitor(s) termed with HDMI.
-
-![Setting up different wallpaper for each monitor on Linux][14]
-
-You can also add selected wallpapers to ‘Favorites’ for quick access. Doing this will move the ‘favorite wallpapers’ from Wallpapers tab to Favorites tab.
-
-![Setting up different wallpaper for each monitor on Linux][15]
-
-You don’t need to start HydraPaper at each boot. Once you set different wallpaper for different monitor, the settings are saved and you’ll see your chosen wallpapers even after restart. This would be expected behavior of course but I thought I would mention the obvious.
-
-One big downside of HydraPaper is in the way it is designed to work. You see, HydraPaper combines your selected wallpapers into one single image and stretches it across the screens giving an impression of having different background on each display. And this becomes an issue when you remove the external display.
-
-For example, when I tried using my laptop without the external display, it showed me an background image like this.
-
-![Dual Monitor wallpaper HydraPaper][16]
-
-Quite obviously, this is not what I would expect.
-
-#### Did you like it?
-
-HydraPaper makes setting up different backgrounds on different monitors a painless task. It supports more than two monitors and monitors with different orientation. Simple interface with only the required features makes it an ideal application for those who always use dual monitors.
-
-How do you set different wallpaper for different monitor on Linux? Do you think HydraPaper is an application worth installing?
-
-Do share your views and if you find this article, please share it on various social media channels such as Twitter and [Reddit][17].
-
---------------------------------------------------------------------------------
-
-via: https://itsfoss.com/wallpaper-multi-monitor/
-
-作者:[Abhishek Prakash][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://itsfoss.com/author/abhishek/
-[1]:https://www.gnome.org/
-[2]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/05/multi-monitor-wallpaper-setup-800x450.jpeg
-[3]:https://github.com/GabMus/HydraPaper
-[4]:https://www.gtk.org/
-[5]:https://itsfoss.com/gnome-tricks-ubuntu/
-[6]:https://mate-desktop.org/
-[7]:https://budgie-desktop.org/home/
-[8]:https://itsfoss.com/ubuntu-budgie-18-review/
-[9]:https://flatpak.org
-[10]:https://flatpak.org/setup/
-[11]:https://flathub.org
-[12]:https://flathub.org/apps/details/org.gabmus.hydrapaper
-[13]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/05/different-wallpaper-each-monitor-hydrapaper-2-800x631.jpeg
-[14]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/05/different-wallpaper-each-monitor-hydrapaper-1.jpeg
-[15]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/05/different-wallpaper-each-monitor-hydrapaper-3.jpeg
-[16]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/05/hydra-paper-dual-monitor-800x450.jpeg
-[17]:https://www.reddit.com/r/LinuxUsersGroup/
diff --git a/sources/talk/20180611 12 fiction books for Linux and open source types.md b/sources/tech/20180611 12 fiction books for Linux and open source types.md
similarity index 100%
rename from sources/talk/20180611 12 fiction books for Linux and open source types.md
rename to sources/tech/20180611 12 fiction books for Linux and open source types.md
diff --git a/sources/tech/20180625 Checking out the notebookbar and other improvements in LibreOffice 6.0 - FOSS adventures.md b/sources/tech/20180625 Checking out the notebookbar and other improvements in LibreOffice 6.0 - FOSS adventures.md
deleted file mode 100644
index 0321080a4b..0000000000
--- a/sources/tech/20180625 Checking out the notebookbar and other improvements in LibreOffice 6.0 - FOSS adventures.md
+++ /dev/null
@@ -1,111 +0,0 @@
-Checking out the notebookbar and other improvements in LibreOffice 6.0 – FOSS adventures
-======
-
-With any new openSUSE release, I am interested in the improvements that the big applications have made. One of these big applications is LibreOffice. Ever since LibreOffice has forked from OpenOffice.org, there has been a constant delivery of new features and new fixes every 6 months. openSUSE Leap 15 brought us the upgrade from LibreOffice 5.3.3 to LibreOffice 6.0.4. In this post, I will highlight the improvements that I found most newsworthy.
-
-### Notebookbar
-
-One of the experimental features of LibreOffice 5.3 was the Notebookbar. In LibreOffice 6.0 this feature has matured a lot and has gained a new form: the groupedbar. Lets take a look at the 3 variants. You can enable the Notebookbar by clicking on View –> Toolbar Layout and then Notebookbar.
-
-![][1]
-
-Please be aware that switching back to the Default Toolbar Layout is a bit of a hassle. To list the tricks:
-
- * The contextual groups notebookbar shows the menubar by default. Make sure that you don’t hide it. Change the Layout via the View menu in the menubar.
- * The tabbed notebookbar has a hamburger menu on the upper right side. Select menubar. Then change the Layout via the View menu in the menubar.
- * The groupedbar notebookbar has a menu dropdown menu on the upper right side. Make sure to maximize the window. Otherwise it might be hidden.
-
-
-
-The most talked about version of the notebookbar is the tabbed version. This looks similar to the Microsoft Office 2007 ribbon. That fact alone is enough to ruffle some feathers in the open source community. In comparison to the ribbon, the tabs (other than Home) can feel rather empty. The reason for that is that the icons are not designed to be big and bold. Another reason is that there are no sub-sections in the tabs. In the Microsoft version of the ribbon, you have names of the sub-sections underneath the icons. This helps to fill the empty space. However, in terms of ease of use, this design does the job. It provides you with a lot of functions in an easy to understand interface.
-
-![][2]
-
-The most successful version of the notebookbar is in my opinion the groupedbar. It gives you all of the most needed functions in a single overview. And the dropdown menus (File / Edit / Styles / Format / Paragraph / Insert / Reference) all show useful functions that are not so often used.
-
-![][3]
-
-By the way, it also works great for Calc (Spreadsheets) and Impress (Presentations).
-
-![][4]
-
-![][5]
-
-Finally there is the contextual groups version. The “groups” version is not very helpful. It shows a very limited number of basic functions. And it takes up a lot of space. If you want to use more advanced functions, you need to use the traditional menubar. The traditional menubar works perfectly, but in that case I rather combine it with the Default toolbar layout.
-
-![][6]
-
-The contextual single version is the better version. If you compare it to the “normal” single toolbar, it contains more functions and the order in which the functions are arranged is easier to use.
-
-![][7]
-
-There is no real need to make the switch to the notebookbar. But it provides you with choice. One of these user interfaces might just suit your taste.
-
-### Microsoft Office compatibility
-
-Microsoft Office compatibility (especially .docx, .xlsx and .pptx) is one of the things that I find very important. As a former Business Consultant I have created a lot of documents in the past. I have created 200+ page reports. They need to work flawless, including getting the page brakes right, which is incredibly difficult as the margins are never the same. Also the index, headers, footers, grouped drawings and SmartArt drawings need to display as originally composed. I have created large PowerPoint presentations with branded slides with +30 layouts, grouped drawings and SmartArt drawings. I need these to render perfectly in the slideshow. Furthermore, I have created large multi-tabbed Excel sheets with filters, pivot tables, graphs and conditional formatting. All of these need to be conserved when I open these files in LibreOffice.
-
-And no, LibreOffice is still not perfect. But damn, it is close. This time I have seen no major problems when opening older documents. Which means that LibreOffice finally gets SmartArt drawings right. In Writer, the page breaks in different places compared to Microsoft Word. That has always been an issue. But I don’t see many other issues. In Calc, the rendering of the graphs is less beautiful. But it’s similar enough to Excel. In Impress, presentations can look strange, because sometimes you see bigger/smaller fonts in the same slide (and that is not on purpose). But I was very impressed to see branded slides with multiple sections render correctly. If I needed to score it, I would give LibreOffice a 7 out of 10 for Microsoft Office compatibility. A very solid score. Below some examples of compatibility done right.
-
-![][8]
-
-![][9]
-
-![][10]
-
-### Noteworthy features
-
-Finally, there are the noteworthy features. I will only highlight the ones that I find cool. The first one is the ability to rotate images in any degree. Below is an example of me rotating a Gecko.
-
-![][11]
-
-The second cool feature is that the old collection of autoformat table styles are now replaced with a new collection of table styles. You can access these styles via the menubar: Table –> AutoFormat Styles. In the screenshots below, I show how to change a table from the Box List Green to the Box List Red format.
-
-![][12]
-
-![][13]
-
-The third feature is the ability to copy-past unformatted text in Calc. This is something I will use a lot, making it a cool feature.
-
-![][14]
-
-The final feature is the new and improved LibreOffice Online help. This is not the same as the LibreOffice help (press F1 to see what I mean). That is still there (and as far as I know unchanged). But this is the online wiki that you will find on the LibreOffice.org website. Some contributors obviously put a lot of effort in this feature. It looks good, now also on a mobile device. Kudos!
-
-![][15]
-
-If you want to learn about all of the other introduced features, read the [release notes][16]. They are really well written.
-
-### And that’s not all folks
-
-I discussed LibreOffice on openSUSE Leap 15. However, LibreOffice is also available on Android and in the Cloud. You can get the Android version from the [Google Play Store][17]. And you can see the Cloud version in action if you go to the [Collabora website][18]. Check them out for yourselves.
-
---------------------------------------------------------------------------------
-
-via: https://www.fossadventures.com/checking-out-the-notebookbar-and-other-improvements-in-libreoffice-6-0/
-
-作者:[Martin De Boer][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://www.fossadventures.com/author/martin_de_boer/
-[1]:https://www.fossadventures.com/wp-content/uploads/2018/06/LibreOffice06.jpeg
-[2]:https://www.fossadventures.com/wp-content/uploads/2018/06/LibreOffice09.jpeg
-[3]:https://www.fossadventures.com/wp-content/uploads/2018/06/LibreOffice11.jpeg
-[4]:https://www.fossadventures.com/wp-content/uploads/2018/06/LibreOffice10.jpeg
-[5]:https://www.fossadventures.com/wp-content/uploads/2018/06/LibreOffice08.jpeg
-[6]:https://www.fossadventures.com/wp-content/uploads/2018/06/LibreOffice07.jpeg
-[7]:https://www.fossadventures.com/wp-content/uploads/2018/06/LibreOffice12.jpeg
-[8]:https://www.fossadventures.com/wp-content/uploads/2018/06/LibreOffice14.jpeg
-[9]:https://www.fossadventures.com/wp-content/uploads/2018/06/LibreOffice15.jpeg
-[10]:https://www.fossadventures.com/wp-content/uploads/2018/06/LibreOffice16.jpeg
-[11]:https://www.fossadventures.com/wp-content/uploads/2018/06/LibreOffice01.jpeg
-[12]:https://www.fossadventures.com/wp-content/uploads/2018/06/LibreOffice02.jpeg
-[13]:https://www.fossadventures.com/wp-content/uploads/2018/06/LibreOffice03.jpeg
-[14]:https://www.fossadventures.com/wp-content/uploads/2018/06/LibreOffice04.jpeg
-[15]:https://www.fossadventures.com/wp-content/uploads/2018/06/LibreOffice05.jpeg
-[16]:https://wiki.documentfoundation.org/ReleaseNotes/6.0
-[17]:https://play.google.com/store/apps/details?id=org.documentfoundation.libreoffice&hl=en
-[18]:https://www.collaboraoffice.com/press-releases/collabora-office-6-0-released/
diff --git a/sources/tech/20180626 8 great pytest plugins.md b/sources/tech/20180626 8 great pytest plugins.md
deleted file mode 100644
index 25a00cb126..0000000000
--- a/sources/tech/20180626 8 great pytest plugins.md
+++ /dev/null
@@ -1,68 +0,0 @@
-8 great pytest plugins
-======
-
-
-
-We are big fans of [pytest][1] and use it as our default Python testing tool for work and open source projects. For this month's Python column, we're sharing why we love pytest and some of the plugins that make testing with pytest so much fun.
-
-### What is pytest?
-
-As the tool's website says, "The pytest framework makes it easy to write small tests, yet scales to support complex functional testing for applications and libraries."
-
-`test_*.py` and as functions that begin with `test_*`. Pytest will then find all your tests, across your whole project, and run them automatically when you run `pytest` in your console. Pytest accepts `set_trace()` function that can be entered into your test; this will pause your tests and allow you to interact with your variables and otherwise "poke around" in the console to debug your project.
-
-Pytest allows you to define your tests in any file calledand as functions that begin with. Pytest will then find all your tests, across your whole project, and run them automatically when you runin your console. Pytest accepts [flags and arguments][2] that can change when the testrunner stops, how it outputs results, which tests are run, and what information is included in the output. It also includes afunction that can be entered into your test; this will pause your tests and allow you to interact with your variables and otherwise "poke around" in the console to debug your project.
-
-One of the best aspects of pytest is its robust plugin ecosystem. Because pytest is such a popular testing library, over the years many plugins have been created to extend, customize, and enhance its capabilities. These eight plugins are among our favorites.
-
-### Great 8
-
-**1.[pytest-sugar][3]**
-`pytest-sugar` changes the default look and feel of pytest, adds a progress bar, and shows failing tests instantly. It requires no configuration; just `pip install pytest-sugar`, run your tests with `pytest`, and enjoy the prettier, more useful output.
-
-**2.[pytest-cov][4]**
-`pytest-cov` adds coverage support for pytest to show which lines of code have been tested and which have not. It will also include the percentage of test coverage for your project.
-
-**3.[pytest-picked][5]**
-`pytest-picked` runs tests based on code that you have modified but not committed to `git` yet. Install the library and run your tests with `pytest --picked` to test only files that have been changed since your last commit.
-
-**4.[pytest-instafail][6]**
-`pytest-instafail` modifies pytest's default behavior to show failures and errors immediately instead of waiting until pytest has finished running every test.
-
-**5.[pytest-tldr][7]**
-A brand-new pytest plugin that limits the output to just the things you need. `pytest-tldr` (the `tldr` stands for "too long, didn't read"), like `pytest-sugar`, requires no configuration other than basic installation. Instead of pytest's default output, which is pretty verbose, `pytest-tldr`'s default limits the output to only tracebacks for failing tests and omits the color-coding that some find annoying. Adding a `-v` flag returns the more verbose output for those who prefer it.
-
-**6.[pytest-xdist][8]**
-`pytest-xdist` allows you to run multiple tests in parallel via the `-n` flag: `pytest -n 2`, for example, would run your tests on two CPUs. This can significantly speed up your tests. It also includes the `--looponfail` flag, which will automatically re-run your failing tests.
-
-**7.[pytest-django][9]**
-`pytest-django` adds pytest support to Django applications and projects. Specifically, `pytest-django` introduces the ability to test Django projects using pytest fixtures, omits the need to import `unittest` and copy/paste other boilerplate testing code, and runs faster than the standard Django test suite.
-
-**8.[django-test-plus][10]**
-`django-test-plus` isn't specific to pytest, but it now supports pytest. It includes its own `TestCase` class that your tests can inherit from and enables you to use fewer keystrokes to type out frequent test cases, like checking for specific HTTP error codes.
-
-The libraries we mentioned above are by no means your only options for extending your pytest usage. The landscape for useful pytest plugins is vast. Check out the [Pytest Plugins Compatibility][11] page to explore on your own. Which ones are your favorites?
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/6/pytest-plugins
-
-作者:[Jeff Triplett;Lacery Williams Henschel][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://opensource.com/sites/default/files/styles/byline_thumbnail/public/pictures/dcus-2017-bw.jpg?itok=s8PhD7Ok
-[1]:https://docs.pytest.org/en/latest/
-[2]:https://docs.pytest.org/en/latest/usage.html
-[3]:https://github.com/Frozenball/pytest-sugar
-[4]:https://github.com/pytest-dev/pytest-cov
-[5]:https://github.com/anapaulagomes/pytest-picked
-[6]:https://github.com/pytest-dev/pytest-instafail
-[7]:https://github.com/freakboy3742/pytest-tldr
-[8]:https://github.com/pytest-dev/pytest-xdist
-[9]:https://pytest-django.readthedocs.io/en/latest/
-[10]:https://django-test-plus.readthedocs.io/en/latest/
-[11]:https://plugincompat.herokuapp.com/
diff --git a/sources/tech/20180707 Version Control Before Git with CVS.md b/sources/tech/20180707 Version Control Before Git with CVS.md
index f1c34177a6..4c59a2cfc0 100644
--- a/sources/tech/20180707 Version Control Before Git with CVS.md
+++ b/sources/tech/20180707 Version Control Before Git with CVS.md
@@ -1,3 +1,4 @@
+(translating by runningwater)
Version Control Before Git with CVS
======
Github was launched in 2008. If your software engineering career, like mine, is no older than Github, then Git may be the only version control software you have ever used. While people sometimes grouse about its steep learning curve or unintuitive interface, Git has become everyone’s go-to for version control. In Stack Overflow’s 2015 developer survey, 69.3% of respondents used Git, almost twice as many as used the second-most-popular version control system, Subversion. After 2015, Stack Overflow stopped asking developers about the version control systems they use, perhaps because Git had become so popular that the question was uninteresting.
@@ -296,7 +297,7 @@ via: https://twobithistory.org/2018/07/07/cvs.html
作者:[Two-Bit History][a]
选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
+译者:[runningwater](https://github.com/runningwater)
校对:[校对者ID](https://github.com/校对者ID)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/sources/tech/20180709 5 Firefox extensions to protect your privacy.md b/sources/tech/20180709 5 Firefox extensions to protect your privacy.md
index 848856fe07..821769aa2c 100644
--- a/sources/tech/20180709 5 Firefox extensions to protect your privacy.md
+++ b/sources/tech/20180709 5 Firefox extensions to protect your privacy.md
@@ -1,3 +1,5 @@
+translating---geekpi
+
5 Firefox extensions to protect your privacy
======
diff --git a/sources/tech/20180709 Anbox- How To Install Google Play Store And Enable ARM (libhoudini) Support, The Easy Way.md b/sources/tech/20180709 Anbox- How To Install Google Play Store And Enable ARM (libhoudini) Support, The Easy Way.md
deleted file mode 100644
index f390109123..0000000000
--- a/sources/tech/20180709 Anbox- How To Install Google Play Store And Enable ARM (libhoudini) Support, The Easy Way.md
+++ /dev/null
@@ -1,101 +0,0 @@
-Anbox: How To Install Google Play Store And Enable ARM (libhoudini) Support, The Easy Way
-======
-**[Anbox][1], or Android in a Box, is a free and open source tool that allows running Android applications on Linux.** It works by running the Android runtime environment in an LXC container, recreating the directory structure of Android as a mountable loop image, while using the native Linux kernel to execute applications.
-
-Its key features are security, performance, integration and convergence (scales across different form factors), according to its website.
-
-**Using Anbox, each Android application or game is launched in a separate window, just like system applications** , and they behave more or less like regular windows, showing up in the launcher, can be tiled, etc.
-
-By default, Anbox doesn't ship with the Google Play Store or support for ARM applications. To install applications you must download each app APK and install it manually using adb. Also, installing ARM applications or games doesn't work by default with Anbox - trying to install ARM apps results in the following error being displayed:
-```
-Failed to install PACKAGE.NAME.apk: Failure [INSTALL_FAILED_NO_MATCHING_ABIS: Failed to extract native libraries, res=-113]
-
-```
-
-You can set up both Google Play Store and support for ARM applications (through libhoudini) manually for Android in a Box, but it's a quite complicated process. **To make it easier to install Google Play Store and Google Play Services on Anbox, and get it to support ARM applications and games (using libhoudini), the folks at[geeks-r-us.de][2] (linked article is in German) have created a [script][3] that automates these tasks.**
-
-Before using this, I'd like to make it clear that not all Android applications and games work in Anbox, even after integrating libhoudini for ARM support. Some Android applications and games may not show up in the Google Play Store at all, while others may be available for installation but will not work. Also, some features may not be available in some applications.
-
-### Install Google Play Store and enable ARM applications / games support on Anbox (Android in a Box)
-
-These instructions will obviously not work if Anbox is not already installed on your Linux desktop. If you haven't already, install Anbox by following the installation instructions found
-
-`anbox.appmgr`
-
-at least once after installing Anbox and before using this script, to avoid running into issues.
-
-1\. Install the required dependencies (`wget` , `lzip` , `unzip` and `squashfs-tools`).
-
-In Debian, Ubuntu or Linux Mint, use this command to install the required dependencies:
-```
-sudo apt install wget lzip unzip squashfs-tools
-
-```
-
-2\. Download and run the script that automatically downloads and installs Google Play Store (and Google Play Services) and libhoudini (for ARM apps / games support) on your Android in a Box installation.
-
-**Warning: never run a script you didn't write without knowing what it does. Before running this script, check out its [code][4]. **
-
-To download the script, make it executable and run it on your Linux desktop, use these commands in a terminal:
-```
-wget https://raw.githubusercontent.com/geeks-r-us/anbox-playstore-installer/master/install-playstore.sh
-chmod +x install-playstore.sh
-sudo ./install-playstore.sh
-
-```
-
-3\. To get Google Play Store to work in Anbox, you need to enable all the permissions for both Google Play Store and Google Play Services
-
-To do this, run Anbox:
-```
-anbox.appmgr
-
-```
-
-Then go to `Settings > Apps > Google Play Services > Permissions` and enable all available permissions. Do the same for Google Play Store!
-
-You should now be able to login using a Google account into Google Play Store.
-
-Without enabling all permissions for Google Play Store and Google Play Services, you may encounter an issue when trying to login to your Google account, with the following error message: " _Couldn't sign in. There was a problem communicating with Google servers. Try again later_ ", as you can see in this screenshot:
-
-After logging in, you can disable some of the Google Play Store / Google Play Services permissions.
-
-**If you're encountering some connectivity issues when logging in to your Google account on Anbox,** make sure the `anbox-bride.sh` is running:
-
- * to start it:
-
-
-```
-sudo /snap/anbox/current/bin/anbox-bridge.sh start
-
-```
-
- * to restart it:
-
-
-```
-sudo /snap/anbox/current/bin/anbox-bridge.sh restart
-
-```
-
-You may also need to install the dnsmasq package if you continue to have connectivity issues with Anbox, according to
-
-
---------------------------------------------------------------------------------
-
-via: https://www.linuxuprising.com/2018/07/anbox-how-to-install-google-play-store.html
-
-作者:[Logix][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://plus.google.com/118280394805678839070
-[1]:https://anbox.io/
-[2]:https://geeks-r-us.de/2017/08/26/android-apps-auf-dem-linux-desktop/
-[3]:https://github.com/geeks-r-us/anbox-playstore-installer/
-[4]:https://github.com/geeks-r-us/anbox-playstore-installer/blob/master/install-playstore.sh
-[5]:https://docs.anbox.io/userguide/install.html
-[6]:https://github.com/anbox/anbox/issues/118#issuecomment-295270113
diff --git a/sources/tech/20180725 Build an interactive CLI with Node.js.md b/sources/tech/20180725 Build an interactive CLI with Node.js.md
index f240e51efd..6ec13f1cfc 100644
--- a/sources/tech/20180725 Build an interactive CLI with Node.js.md
+++ b/sources/tech/20180725 Build an interactive CLI with Node.js.md
@@ -1,5 +1,3 @@
-translating by Flowsnow
-
Build an interactive CLI with Node.js
======
diff --git a/sources/tech/20180730 A single-user, lightweight OS for your next home project - Opensource.com.md b/sources/tech/20180730 A single-user, lightweight OS for your next home project - Opensource.com.md
deleted file mode 100644
index a4dbfb9e12..0000000000
--- a/sources/tech/20180730 A single-user, lightweight OS for your next home project - Opensource.com.md
+++ /dev/null
@@ -1,65 +0,0 @@
-A single-user, lightweight OS for your next home project | Opensource.com
-======
-
-
-What on earth is RISC OS? Well, it's not a new kind of Linux. And it's not someone's take on Windows. In fact, released in 1987, it's older than either of these. But you wouldn't necessarily realize it by looking at it.
-
-The point-and-click graphic user interface features a pinboard and an icon bar across the bottom for your active applications. So, it looks eerily like Windows 95, eight years before it happened.
-
-This OS was originally written for the [Acorn Archimedes][1] . The Acorn RISC Machines CPU in this computer was completely new hardware that needed completely new software to run on it. This was the original operating system for the ARM chip, long before anyone had thought of Android or [Armbian][2]
-
-And while the Acorn desktop eventually faded to obscurity, the ARM chip went on to conquer the world. And here, RISC OS has always had a niche—often in embedded devices, where you'd never actually know it was there. RISC OS was, for a long time, a completely proprietary operating system. But in recent years, the owners have started releasing the source code to a project called [RISC OS Open][3].
-
-### 1\. You can install it on your Raspberry Pi
-
-The Raspberry Pi's official operating system, [Raspbian][4], is actually pretty great (but if you aren't interested in tinkering with novel and different things in tech, you probably wouldn't be fiddling with a Raspberry Pi in the first place). Because RISC OS is written specifically for ARM, it can run on all kinds of small-board computers, including every model of Raspberry Pi.
-
-### 2\. It's super lightweight
-
-The RISC OS installation on my Raspberry Pi takes up a few hundred megabytes—and that's after I've loaded dozens of utilities and games. Most of these are well under a megabyte.
-
-If you're really on a diet, the RISC OS Pico will fit on a 16MB SD card. This is perfect if you're hacking something to go in an embedded system or IoT project. Of course, 16MB is actually a fair bit more than the 512KB ROM chip squeezed into the old Archimedes. But I guess with 30 years of progress in memory technology, it's okay to stretch your legs just a little a bit.
-
-### 3\. It's excellent for retro gaming
-
-When the Archimedes was in its prime, the ARM CPU was several times faster than the Motorola 68000 in the Apple Macintosh and Commodore Amiga, and it totally smoked that new 386, too. This made it an attractive platform for game developers who wanted to strut their stuff with the most powerful desktop computer on the planet.
-
-Many of the rights holders to these games have been generous enough to give permission for hobbyists to download their old work for free. And while RISC OS and the hardware has moved on, with a very small amount of fiddling you can get them to run.
-
-If you're interested in exploring this, [here's a guide][5] to getting these games working on your Raspberry Pi.
-
-### 4\. It's got BBC BASIC
-
-Press F12 to go to the command line, type `*BASIC`, and you get a full BBC BASIC interpreter, just like the old days.
-
-For those who weren't around for it in the 80s, let me explain: BBC BASIC was the first ever programming language for so many of us back in the day, for the excellent reason that it was specifically designed to teach children how to code. There were mountains of books and magazine articles that taught us to code our own simple but highly playable games.
-
-Decades later, coding your own game in BBC BASIC is still a great project for a technically minded kid who wants something to do during school holidays. But few kids have a BBC micro at home anymore. So what should they run it on?
-
-Well, there are interpreters you can run on just about every home computer, but that's not helpful when someone else needs to use it. So why not a Raspberry Pi with RISC OS installed?
-
-### 5\. It's a simple, single-user operating system
-
-RISC OS is not like Linux, with its user and superuser access. It has one user who has full access to the whole machine. So it's probably not the best daily driver to deploy across an enterprise, or even to give to granddad to do his banking. But if you're looking for something to hack and tinker with, it's absolutely fantastic. There isn't all that much between you and the bare metal, so you can just tuck right in.
-
-### Further reading
-
-If you want to learn more about this operating system, check out [RISC OS Open][3], or just flash an image to a card and start using it.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/7/gentle-intro-risc-os
-
-作者:[James Mawson][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://opensource.com/users/dxmjames
-[1]:https://en.wikipedia.org/wiki/Acorn_Archimedes
-[2]:https://www.armbian.com/
-[3]:https://www.riscosopen.org/content/
-[4]:https://www.raspbian.org/
-[5]:https://www.riscosopen.org/wiki/documentation/show/Introduction%20to%20RISC%20OS
diff --git a/sources/tech/20180801 5 of the Best Linux Games to Play in 2018.md b/sources/tech/20180801 5 of the Best Linux Games to Play in 2018.md
deleted file mode 100644
index a0580434ec..0000000000
--- a/sources/tech/20180801 5 of the Best Linux Games to Play in 2018.md
+++ /dev/null
@@ -1,83 +0,0 @@
-5 of the Best Linux Games to Play in 2018
-======
-
-
-
-Linux may not be establishing itself as the gamer’s platform of choice any time soon – the lack of success with Valve’s Steam Machines seems a poignant reminder of that – but that doesn’t mean that the platform isn’t steadily growing with its fair share of great games.
-
-From indie hits to glorious RPGs, 2018 has already been a solid year for Linux games. Here we’ve listed our five favourites so far.
-
-Looking for great Linux games but don’t want to splash the cash? Look to our list of the best [free Linux games][1] for guidance!
-
-### 1. Pillars of Eternity II: Deadfire
-
-![best-linux-games-2018-pillars-of-eternity-2-deadfire][2]
-
-One of the titles that best represents the cRPG revival of recent years makes your typical Bethesda RPG look like a facile action-adventure. The latest entry in the majestic Pillars of Eternity series has a more buccaneering slant as you sail with a crew around islands filled with adventures and peril.
-
-Adding naval combat to the mix, Deadfire continues with the rich storytelling and excellent writing of its predecessor while building on those beautiful graphics and hand-painted backgrounds of the original game.
-
-This is a deep and unquestionably hardcore RPG that may cause some to bounce off it, but those who take to it will be absorbed in its world for months.
-
-### 2. Slay the Spire
-
-![best-linux-games-2018-slay-the-spire][3]
-
-Still in early access, but already one of the best games of the year, Slay the Spire is a deck-building card game that’s embellished by a vibrant visual style and rogue-like mechanics that’ll leave you coming back for more after each infuriating (but probably deserved) death.
-
-With endless card combinations and a different layout each time you play, Slay the Spire feels like the realisation of all the best systems that have been rocking the indie scene in recent years – card games and a permadeath adventure rolled into one.
-
-And we repeat that it’s still in early access, so it’s only going to get better!
-
-### 3. Battletech
-
-![best-linux-games-2018-battletech][4]
-
-As close as we get on this list to a “blockbuster” game, Battletech is an intergalactic wargame (based on a tabletop game) where you load up a team of Mechs and guide them through a campaign of rich, turn-based battles.
-
-The action takes place across a range of terrain – from frigid wastelands to golden sun-soaked climes – as you load your squad of four with hulking hot weaponry, taking on rival squads. If this sounds a little “MechWarrior” to you, then you’re thinking along the right track, albeit this one’s more focused on the tactics than outright action.
-
-Alongside a campaign that sees you navigate your way through a cosmic conflict, the multiplayer mode is also likely to consume untold hours of your life.
-
-### 4. Dead Cells
-
-![best-linux-games-2018-dead-cells][5]
-
-This one deserves highlighting as the combat-platformer of the year. With its rogue-lite structure, Dead Cells throws you into a dark (yet gorgeously coloured) world where you slash and dodge your way through procedurally-generated levels. It’s a bit like a 2D Dark Souls, if Dark Souls were saturated in vibrant neon colours.
-
-Dead Cells can be merciless, but its precise and responsive controls ensure that you only ever have yourself to blame for failure, and its upgrades system that carries over between runs ensures that you always have some sense of progress.
-
-Dead Cells is a zenith of pixel-game graphics, animations and mechanics, a timely reminder of just how much can be achieved without the excesses of 3D graphics.
-
-### 5. Iconoclasts
-
-![best-linux-games-2018-iconoclasts][6]
-
-A little less known than some of the above, this is still a lovely game that could be seen as a less foreboding, more cutesy alternative to Dead Cells. It casts you as Robin, a girl who’s cast out as a fugitive after finding herself at the wrong end of the twisted politics of an alien world.
-
-It’s a good plot, even though your role in it is mainly blasting your way through the non-linear levels. Robin acquires all kinds of imaginative upgrades, the most crucial of which is her wrench, which you use to do everything from deflecting projectiles to solving the clever little environmental puzzles.
-
-Iconoclasts is a joyful, vibrant platformer, borrowing from greats like Megaman for its combat and Metroid for its exploration. You can do a lot worse than take inspiration from those two classics.
-
-### Conclusion
-
-That’s it for our picks of the best Linux games to have come out in 2018. Have you dug up any gaming gems that we’ve missed? Let us know in the comments!
-
---------------------------------------------------------------------------------
-
-via: https://www.maketecheasier.com/best-linux-games/
-
-作者:[Robert Zak][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://www.maketecheasier.com/author/robzak/
-[1]:https://www.maketecheasier.com/open-source-linux-games/
-[2]:https://www.maketecheasier.com/assets/uploads/2018/07/best-linux-games-2018-pillars-of-eternity-2-deadfire.jpg (best-linux-games-2018-pillars-of-eternity-2-deadfire)
-[3]:https://www.maketecheasier.com/assets/uploads/2018/07/best-linux-games-2018-slay-the-spire.jpg (best-linux-games-2018-slay-the-spire)
-[4]:https://www.maketecheasier.com/assets/uploads/2018/07/best-linux-games-2018-battletech.jpg (best-linux-games-2018-battletech)
-[5]:https://www.maketecheasier.com/assets/uploads/2018/07/best-linux-games-2018-dead-cells.jpg (best-linux-games-2018-dead-cells)
-[6]:https://www.maketecheasier.com/assets/uploads/2018/07/best-linux-games-2018-iconoclasts.jpg (best-linux-games-2018-iconoclasts)
diff --git a/sources/tech/20180806 GPaste Is A Great Clipboard Manager For Gnome Shell.md b/sources/tech/20180806 GPaste Is A Great Clipboard Manager For Gnome Shell.md
deleted file mode 100644
index c3b2d2b77e..0000000000
--- a/sources/tech/20180806 GPaste Is A Great Clipboard Manager For Gnome Shell.md
+++ /dev/null
@@ -1,96 +0,0 @@
-GPaste Is A Great Clipboard Manager For Gnome Shell
-======
-**[GPaste][1] is a clipboard management system that consists of a library, daemon, and interfaces for the command line and Gnome (using a native Gnome Shell extension).**
-
-A clipboard manager allows keeping track of what you're copying and pasting, providing access to previously copied items. GPaste, with its native Gnome Shell extension, makes the perfect addition for those looking for a Gnome clipboard manager.
-
-[![GPaste Gnome Shell extension Ubuntu 18.04][2]][3]
-GPaste Gnome Shell extension
-**Using GPaste in Gnome, you get a configurable, searchable clipboard history, available with a click on the top panel. GPaste remembers not only the text you copy, but also file paths and images** (the latter needs to be enabled from its settings as it's disabled by default).
-
-What's more, GPaste can detect growing lines, meaning it can detect when a new text copy is an extension of another and replaces it if it's true, useful for keeping your clipboard clean.
-
-From the extension menu you can pause GPaste from tracking the clipboard, and remove items from the clipboard history or the whole history. You'll also find a button that launches the GPaste user interface window.
-
-**If you prefer to use the keyboard, you can use a key shortcut to open the GPaste history from the top bar** (`Ctrl + Alt + H`), **or open the full GPaste GUI** (`Ctrl + Alt + G`).
-
-The tool also incorporates keyboard shortcuts to (can be changed):
-
- * delete the active item from history: `Ctrl + Alt + V`
-
- * **mark the active item as being a password (which obfuscates the clipboard entry in GPaste):** `Ctrl + Alt + S`
-
- * sync the clipboard to the primary selection: `Ctrl + Alt + O`
-
- * sync the primary selection to the clipboard: `Ctrl + Alt + P`
-
- * upload the active item to a pastebin service: `Ctrl + Alt + U`
-
-[![][4]][5]
-GPaste GUI
-
-The GPaste interface window provides access to the clipboard history (with options to clear, edit or upload items), which can be searched, an option to pause GPaste from tracking the clipboard, restart the GPaste daemon, backup current clipboard history, as well as to its settings.
-
-[![][6]][7]
-GPaste GUI
-
-From the GPaste UI you can change settings like:
-
- * Enable or disable the Gnome Shell extension
- * Sync the daemon state with the extension's one
- * Primary selection affects history
- * Synchronize clipboard with primary selection
- * Image support
- * Trim items
- * Detect growing lines
- * Save history
- * History settings like max history size, memory usage, max text item length, and more
- * Keyboard shortcuts
-
-
-
-### Download GPaste
-
-[Download GPaste](https://github.com/Keruspe/GPaste)
-
-The Gpaste project page does not link to any GPaste binaries, and only source installation instructions. Users running Linux distributions other than Debian or Ubuntu (for which you'll find GPaste installation instructions below) can search their distro repositories for GPaste.
-
-Do not confuse GPaste with the GPaste Integration extension posted on the Gnome Shell extension website. That is a Gnome Shell extension that uses GPaste daemon, which is no longer maintained. The native Gnome Shell extension built into GPaste is still maintained.
-
-#### Install GPaste in Ubuntu (18.04, 16.04) or Debian (Jessie and newer)
-
-**For Debian, GPaste is available for Jessie and newer, while for Ubuntu, GPaste is in the repositories for 16.04 and newer (so it's available in the Ubuntu 18.04 Bionic Beaver).**
-
-**You can install GPaste (the daemon and the Gnome Shell extension) in Debian or Ubuntu using this command:**
-```
-sudo apt install gnome-shell-extensions-gpaste gpaste
-
-```
-
-After the installation completes, restart Gnome Shell by pressing `Alt + F2` and typing `r` , then pressing the `Enter` key. The GPaste Gnome Shell extension should now be enabled and its icon should show up on the top Gnome Shell panel. If it's not, use Gnome Tweaks (Gnome Tweak Tool) to enable the extension.
-
-**The GPaste 3.28.0 package from[Debian][8] and [Ubuntu][9] has a bug that makes it crash if the image support option is enabled, so do not enable this feature for now.** This was marked as
-
-
---------------------------------------------------------------------------------
-
-via: https://www.linuxuprising.com/2018/08/gpaste-is-great-clipboard-manager-for.html
-
-作者:[Logix][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://plus.google.com/118280394805678839070
-[1]:https://github.com/Keruspe/GPaste
-[2]:https://2.bp.blogspot.com/-2ndArDBcrwY/W2gyhMc1kEI/AAAAAAAABS0/ZAe_onuGCacMblF733QGBX3XqyZd--WuACLcBGAs/s400/gpaste-gnome-shell-extension-ubuntu1804.png (Gpaste Gnome Shell)
-[3]:https://2.bp.blogspot.com/-2ndArDBcrwY/W2gyhMc1kEI/AAAAAAAABS0/ZAe_onuGCacMblF733QGBX3XqyZd--WuACLcBGAs/s1600/gpaste-gnome-shell-extension-ubuntu1804.png
-[4]:https://2.bp.blogspot.com/-7FBRsZJvYek/W2gyvzmeRxI/AAAAAAAABS4/LhokMFSn8_kZndrNB-BTP4W3e9IUuz9BgCLcBGAs/s640/gpaste-gui_1.png
-[5]:https://2.bp.blogspot.com/-7FBRsZJvYek/W2gyvzmeRxI/AAAAAAAABS4/LhokMFSn8_kZndrNB-BTP4W3e9IUuz9BgCLcBGAs/s1600/gpaste-gui_1.png
-[6]:https://4.bp.blogspot.com/-047ShYc6RrQ/W2gyz5FCf_I/AAAAAAAABTA/-o6jaWzwNpsSjG0QRwRJ5Xurq_A6dQ0sQCLcBGAs/s640/gpaste-gui_2.png
-[7]:https://4.bp.blogspot.com/-047ShYc6RrQ/W2gyz5FCf_I/AAAAAAAABTA/-o6jaWzwNpsSjG0QRwRJ5Xurq_A6dQ0sQCLcBGAs/s1600/gpaste-gui_2.png
-[8]:https://packages.debian.org/buster/gpaste
-[9]:https://launchpad.net/ubuntu/+source/gpaste
-[10]:https://www.imagination-land.org/posts/2018-04-13-gpaste-3.28.2-released.html
diff --git a/sources/tech/20180806 Systemd Timers- Three Use Cases.md b/sources/tech/20180806 Systemd Timers- Three Use Cases.md
deleted file mode 100644
index 7d1d4cac97..0000000000
--- a/sources/tech/20180806 Systemd Timers- Three Use Cases.md
+++ /dev/null
@@ -1,220 +0,0 @@
-Systemd Timers: Three Use Cases
-======
-
-
-
-In this systemd tutorial series, we have[ already talked about systemd timer units to some degree][1], but, before moving on to the sockets, let's look at three examples that illustrate how you can best leverage these units.
-
-### Simple _cron_ -like behavior
-
-This is something I have to do: collect [popcon data from Debian][2] every week, preferably at the same time so I can see how the downloads for certain applications evolve. This is the typical thing you can have a _cron_ job do, but a systemd timer can do it too:
-```
-# cron-like popcon.timer
-
-[Unit]
-Description= Says when to download and process popcons
-
-[Timer]
-OnCalendar= Thu *-*-* 05:32:07
-Unit= popcon.service
-
-[Install]
-WantedBy= basic.target
-
-```
-
-The actual _popcon.service_ runs a regular _wget_ job, so nothing special. What is new in here is the `OnCalendar=` directive. This is what lets you set a service to run on a certain date at a certain time. In this case, `Thu` means " _run on Thursdays_ " and the `*-*-*` means " _the exact date, month and year don't matter_ ", which translates to " _run on Thursday, regardless of the date, month or year_ ".
-
-Then you have the time you want to run the service. I chose at about 5:30 am CEST, which is when the server is not very busy.
-
-If the server is down and misses the weekly deadline, you can also work an _anacron_ -like functionality into the same timer:
-```
-# popcon.timer with anacron-like functionality
-
-[Unit]
-Description=Says when to download and process popcons
-
-[Timer]
-Unit=popcon.service
-OnCalendar=Thu *-*-* 05:32:07
-Persistent=true
-
-[Install]
-WantedBy=basic.target
-
-```
-
-When you set the `Persistent=` directive to true, it tells systemd to run the service immediately after booting if the server was down when it was supposed to run. This means that if the machine was down, say for maintenance, in the early hours of Thursday, as soon as it is booted again, _popcon.service_ will be run immediately and then it will go back to the routine of running the service every Thursday at 5:32 am.
-
-So far, so straightforward.
-
-### Delayed execution
-
-But let's kick thing up a notch and "improve" the [systemd-based surveillance system][3]. Remember that the system started taking pictures the moment you plugged in a camera. Suppose you don't want pictures of your face while you install the camera. You will want to delay the start up of the picture-taking service by a minute or two so you can plug in the camera and move out of frame.
-
-To do this; first change the Udev rule so it points to a timer:
-```
-ACTION=="add", SUBSYSTEM=="video4linux", ATTRS{idVendor}=="03f0",
-ATTRS{idProduct}=="e207", TAG+="systemd", ENV{SYSTEMD_WANTS}="picchanged.timer",
-SYMLINK+="mywebcam", MODE="0666"
-
-```
-
-The timer looks like this:
-```
-# picchanged.timer
-
-[Unit]
-Description= Runs picchanged 1 minute after the camera is plugged in
-
-[Timer]
-OnActiveSec= 1 m
-Unit= picchanged.path
-
-[Install]
-WantedBy= basic.target
-
-```
-
-The Udev rule gets triggered when you plug the camera in and it calls the timer. The timer waits for one minute after it starts (`OnActiveSec= 1 m`) and then runs _picchanged.path_ , which [monitors to see if the master image changes][4]. The _picchanged.path_ is also in charge of pulling in the _webcam.service_ , the service that actually takes the picture.
-
-### Start and stop Minetest server at a certain time every day
-
-In the final example, let's say you have decided to delegate parenting to systemd. I mean, systemd seems to be already taking over most of your life anyway. Why not embrace the inevitable?
-
-So you have your Minetest service set up for your kids. You also want to give some semblance of caring about their education and upbringing and have them do homework and chores. What you want to do is make sure Minetest is only available for a limited time (say from 5 pm to 7 pm) every evening.
-
-This is different from " _starting a service at certain time_ " in that, writing a timer to start the service at 5 pm is easy...:
-```
-# minetest.timer
-
-[Unit]
-Description= Runs the minetest.service at 5pm everyday
-
-[Timer]
-OnCalendar= *-*-* 17:00:00
-Unit= minetest.service
-
-[Install]
-WantedBy= basic.target
-
-```
-
-... But writing a counterpart timer that shuts down a service at a certain time needs a bigger dose of lateral thinking.
-
-Let's start with the obvious -- the timer:
-```
-# stopminetest.timer
-
-[Unit]
-Description= Stops the minetest.service at 7 pm everyday
-
-[Timer]
-OnCalendar= *-*-* 19:05:00
-Unit= stopminetest.service
-
-[Install]
-WantedBy= basic.target
-
-```
-
-The tricky part is how to tell _stopminetest.service_ to actually, you know, stop the Minetest. There is no way to pass the PID of the Minetest server from _minetest.service_. and there are no obvious commands in systemd's unit vocabulary to stop or disable a running service.
-
-The trick is to use systemd's `Conflicts=` directive. The `Conflicts=` directive is similar to systemd's `Wants=` directive, in that it does _exactly the opposite_. If you have `Wants=a.service` in a unit called _b.service_ , when it starts, _b.service_ will run _a.service_ if it is not running already. Likewise, if you have a line that reads `Conflicts= a.service` in your _b.service_ unit, as soon as _b.service_ starts, systemd will stop _a.service_.
-
-This was created for when two services could clash when trying to take control of the same resource simultaneously, say when two services needed to access your printer at the same time. By putting a `Conflicts=` in your preferred service, you could make sure it would override the least important one.
-
-You are going to use `Conflicts=` a bit differently, however. You will use `Conflicts=` to close down cleanly the _minetest.service_ :
-```
-# stopminetest.service
-
-[Unit]
-Description= Closes down the Minetest service
-Conflicts= minetest.service
-
-[Service]
-Type= oneshot
-ExecStart= /bin/echo "Closing down minetest.service"
-
-```
-
-The _stopminetest.service_ doesn't do much at all. Indeed, it could do nothing at all, but just because it contins that `Conflicts=` line in there, when it is started, systemd will close down _minetest.service_.
-
-There is one last wrinkle in your perfect Minetest set up: What happens if you are late home from work, it is past the time when the server should be up but playtime is not over? The `Persistent=` directive (see above) that runs a service if it has missed its start time is no good here, because if you switch the server on, say at 11 am, it would start Minetest and that is not what you want. What you really want is a way to make sure that systemd will only start Minetest between the hours of 5 and 7 in the evening:
-```
-# minetest.timer
-
-[Unit]
-Description= Runs the minetest.service every minute between the hours of 5pm and 7pm
-
-[Timer]
-OnCalendar= *-*-* 17..19:*:00
-Unit= minetest.service
-
-[Install]
-WantedBy= basic.target
-
-```
-
-The line `OnCalendar= *-*-* 17..19:*:00` is interesting for two reasons: (1) `17..19` is not a point in time, but a period of time, in this case the period of time between the times of 17 and 19; and (2) the `*` in the minute field indicates that the service must be run every minute. Hence, you would read this as " _run the minetest.service every minute between 5 and 7 pm_ ".
-
-There is still one catch, though: once the _minetest.service_ is up and running, you want _minetest.timer_ to stop trying to run it again and again. You can do that by including a `Conflicts=` directive into _minetest.service_ :
-```
-# minetest.service
-
-[Unit]
-Description= Runs Minetest server
-Conflicts= minetest.timer
-
-[Service]
-Type= simple
-User=
-
-ExecStart= /usr/bin/minetest --server
-ExecStop= /bin/kill -2 $MAINPID
-
-[Install]
-WantedBy= multi-user.targe
-
-```
-
-The `Conflicts=` directive shown above makes sure _minetest.timer_ is stopped as soon as the _minetest.service_ is successfully started.
-
-Now enable and start _minetest.timer_ :
-```
-systemctl enable minetest.timer
-systemctl start minetest.timer
-
-```
-
-And, if you boot the server at, say, 6 o'clock, _minetest.timer_ will start up and, as the time falls between 5 and 7, _minetest.timer_ will try and start _minetest.service_ every minute. But, as soon as _minetest.service_ is running, systemd will stop _minetest.timer_ because it "conflicts" with _minetest.service_ , thus avoiding the timer from trying to start the service over and over when it is already running.
-
-It is a bit counterintuitive that you use the service to kill the timer that started it up in the first place, but it works.
-
-### Conclusion
-
-You probably think that there are better ways of doing all of the above. I have heard the term "overengineered" in regard to these articles, especially when using systemd timers instead of cron.
-
-But, the purpose of this series of articles is not to provide the best solution to any particular problem. The aim is to show solutions that use systemd units as much as possible, even to a ridiculous length. The aim is to showcase plenty of examples of how the different types of units and the directives they contain can be leveraged. It is up to you, the reader, to find the real practical applications for all of this.
-
-Be that as it may, there is still one more thing to go: next time, we'll be looking at _sockets_ and _targets_ , and then we'll be done with systemd units.
-
-Learn more about Linux through the free ["Introduction to Linux" ][5]course from The Linux Foundation and edX.
-
---------------------------------------------------------------------------------
-
-via: https://www.linux.com/blog/intro-to-linux/2018/8/systemd-timers-two-use-cases-0
-
-作者:[Paul Brown][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://www.linux.com/users/bro66
-[1]:https://www.linux.com/blog/learn/intro-to-linux/2018/7/setting-timer-systemd-linux
-[2]:https://popcon.debian.org/
-[3]:https://www.linux.com/blog/intro-to-linux/2018/6/systemd-services-reacting-change
-[4]:https://www.linux.com/blog/learn/intro-to-linux/2018/6/systemd-services-monitoring-files-and-directories
-[5]:https://training.linuxfoundation.org/linux-courses/system-administration-training/introduction-to-linux
diff --git a/sources/tech/20180807 5 reasons the i3 window manager makes Linux better.md b/sources/tech/20180807 5 reasons the i3 window manager makes Linux better.md
deleted file mode 100644
index 8ad6a4ac7d..0000000000
--- a/sources/tech/20180807 5 reasons the i3 window manager makes Linux better.md
+++ /dev/null
@@ -1,111 +0,0 @@
-5 reasons the i3 window manager makes Linux better
-======
-
-
-
-One of the nicest things about Linux (and open source software in general) is the freedom to choose among different alternatives to address our needs.
-
-I've been using Linux for a long time, but I was never entirely happy with the desktop environment options available. Until last year, [Xfce][1] was the closest to what I consider a good compromise between features and performance. Then I found [i3][2], an amazing piece of software that changed my life.
-
-I3 is a tiling window manager. The goal of a window manager is to control the appearance and placement of windows in a windowing system. Window managers are often used as part a full-featured desktop environment (such as GNOME or Xfce), but some can also be used as standalone applications.
-
-A tiling window manager automatically arranges the windows to occupy the whole screen in a non-overlapping way. Other popular tiling window managers include [wmii][3] and [xmonad][4].
-
-![i3 tiled window manager screenshot][6]
-
-Screenshot of i3 with three tiled windows
-
-Following are the top five reasons I use the i3 window manager and recommend it for a better Linux desktop experience.
-
-### 1\. Minimalism
-
-I3 is fast. It is neither bloated nor fancy. It is designed to be simple and efficient. As a developer, I value these features, as I can use the extra capacity to power my favorite development tools or test stuff locally using containers or virtual machines.
-
-In addition, i3 is a window manager and, unlike full-featured desktop environments, it does not dictate the applications you should use. Do you want to use Thunar from Xfce as your file manager? GNOME's gedit to edit text? I3 does not care. Pick the tools that make the most sense for your workflow, and i3 will manage them all in the same way.
-
-### 2\. Screen real estate
-
-As a tiling window manager, i3 will automatically "tile" or position the windows in a non-overlapping way, similar to laying tiles on a wall. Since you don't need to worry about window positioning, i3 generally makes better use of your screen real estate. It also allows you to get to what you need faster.
-
-There are many useful cases for this. For example, system administrators can open several terminals to monitor or work on different remote systems simultaneously; and developers can use their favorite IDE or editor and a few terminals to test their programs.
-
-In addition, i3 is flexible. If you need more space for a particular window, enable full-screen mode or switch to a different layout, such as stacked or tabbed.
-
-### 3\. Keyboard-driven workflow
-
-I3 makes extensive use of keyboard shortcuts to control different aspects of your environment. These include opening the terminal and other programs, resizing and positioning windows, changing layouts, and even exiting i3. When you start using i3, you need to memorize a few of those shortcuts to get around and, with time, you'll use more of them.
-
-The main benefit is that you don't often need to switch contexts from the keyboard to the mouse. With practice, it means you'll improve the speed and efficiency of your workflow.
-
-For example, to open a new terminal, press `+`. Since the windows are automatically positioned, you can start typing your commands right away. Combine that with a nice terminal-driven text editor (e.g., Vim) and a keyboard-focused browser for a fully keyboard-driven workflow.
-
-In i3, you can define shortcuts for everything. Here are some examples:
-
- * Open terminal
- * Open browser
- * Change layouts
- * Resize windows
- * Control music player
- * Switch workspaces
-
-
-
-Now that I am used to this workflow, I can't see myself going back to a regular desktop environment.
-
-### 4\. Flexibility
-
-I3 strives to be minimal and use few system resources, but that does not mean it can't be pretty. I3 is flexible and can be customized in several ways to improve the visual experience. Because i3 is a window manager, it doesn't provide tools to enable customizations; you need external tools for that. Some examples:
-
- * Use `feh` to define a background picture for your desktop.
- * Use a compositor manager such as `compton` to enable effects like window fading and transparency.
- * Use `dmenu` or `rofi` to enable customizable menus that can be launched from a keyboard shortcut.
- * Use `dunst` for desktop notifications.
-
-
-
-I3 is fully configurable, and you can control every aspect of it by updating the default configuration file. From changing all keyboard shortcuts, to redefining the name of the workspaces, to modifying the status bar, you can make i3 behave in any way that makes the most sense for your needs.
-
-![i3 with rofi menu and dunst desktop notifications][8]
-
-i3 with `rofi` menu and `dunst` desktop notifications
-
-Finally, for more advanced users, i3 provides a full interprocess communication ([IPC][9]) interface that allows you to use your favorite language to develop scripts or programs for even more customization options.
-
-### 5\. Workspaces
-
-In i3, a workspace is an easy way to group windows. You can group them in different ways according to your workflow. For example, you can put the browser on one workspace, the terminal on another, an email client on a third, etc. You can even change i3's configuration to always assign specific applications to their own workspaces.
-
-Switching workspaces is quick and easy. As usual in i3, do it with a keyboard shortcut. Press `+num` to switch to workspace `num`. If you get into the habit of always assigning applications/groups of windows to the same workspace, you can quickly switch between them, which makes workspaces a very useful feature.
-
-In addition, you can use workspaces to control multi-monitor setups, where each monitor gets an initial workspace. If you switch to that workspace, you switch to that monitor—without moving your hand off the keyboard.
-
-Finally, there is another, special type of workspace in i3: the scratchpad. It is an invisible workspace that shows up in the middle of the other workspaces by pressing a shortcut. This is a convenient way to access windows or programs that you frequently use, such as an email client or your music player.
-
-### Give it a try
-
-If you value simplicity and efficiency and are not afraid of working with the keyboard, i3 is the window manager for you. Some say it is for advanced users, but that is not necessarily the case. You need to learn a few basic shortcuts to get around at the beginning, but they'll soon feel natural and you'll start using them without thinking.
-
-This article just scratches the surface of what i3 can do. For more details, consult [i3's documentation][10].
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/8/i3-tiling-window-manager
-
-作者:[Ricardo Gerardi][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://opensource.com/users/rgerardi
-[1]:https://xfce.org/
-[2]:https://i3wm.org/
-[3]:https://code.google.com/archive/p/wmii/
-[4]:https://xmonad.org/
-[5]:/file/406476
-[6]:https://opensource.com/sites/default/files/uploads/i3_screenshot.png (i3 tiled window manager screenshot)
-[7]:/file/405161
-[8]:https://opensource.com/sites/default/files/uploads/rofi_dunst.png (i3 with rofi menu and dunst desktop notifications)
-[9]:https://i3wm.org/docs/ipc.html
-[10]:https://i3wm.org/docs/userguide.html
diff --git a/sources/tech/20180824 Joplin- Encrypted Open Source Note Taking And To-Do Application.md b/sources/tech/20180824 Joplin- Encrypted Open Source Note Taking And To-Do Application.md
deleted file mode 100644
index ae6a1f32d9..0000000000
--- a/sources/tech/20180824 Joplin- Encrypted Open Source Note Taking And To-Do Application.md
+++ /dev/null
@@ -1,80 +0,0 @@
-translating---geekpi
-
-Joplin: Encrypted Open Source Note Taking And To-Do Application
-======
-**[Joplin][1] is a free and open source note taking and to-do application available for Linux, Windows, macOS, Android and iOS. Its key features include end-to-end encryption, Markdown support, and synchronization via third-party services like NextCloud, Dropbox, OneDrive or WebDAV.**
-
-
-
-With Joplin you can write your notes in the **Markdown format** (with support for math notations and checkboxes) and the desktop app comes with 3 views: Markdown code, Markdown preview, or both side by side. **You can add attachments to your notes (with image previews) or edit them in an external Markdown editor** and have them automatically updated in Joplin each time you save the file.
-
-The application should handle a large number of notes pretty well by allowing you to **organizing notes into notebooks, add tags, and search in notes**. You can also sort notes by updated date, creation date or title. **Each notebook can contain notes, to-do items, or both** , and you can easily add links to other notes (in the desktop app right click on a note and select `Copy Markdown link` , then paste the link in a note).
-
-**Do-do items in Joplin support alarms** , but this feature didn't work for me on Ubuntu 18.04.
-
-**Other Joplin features include:**
-
- * **Optional Web Clipper extension** for Firefox and Chrome (in the Joplin desktop application go to `Tools > Web clipper options` to enable the clipper service and find download links for the Chrome / Firefox extension) which can clip simplified or complete pages, clip a selection or screenshot.
-
- * **Optional command line client**.
-
- * **Import Enex files (Evernote export format) and Markdown files**.
-
- * **Export JEX files (Joplin Export format), PDF and raw files**.
-
- * **Offline first, so the entire data is always available on the device even without an internet connection**.
-
- * **Geolocation support**.
-
-
-
-[![Joplin notes checkboxes link to other note][2]][3]
-Joplin with hidden sidebar showing checkboxes and a link to another note
-
-While it doesn't offer as many features as Evernote, Joplin is a robust open source Evernote alternative. Joplin includes all the basic features, and on top of that it's open source software, it includes encryption support, and you also get to choose the service you want to use for synchronization.
-
-The application was actually designed as an Evernote alternative so it can import complete Evernote notebooks, notes, tags, attachments, and note metadata like the author, creation and updated time, or geolocation.
-
-Another aspect on which the Joplin development was focused was to avoid being tied to a particular company or service. This is why the application offers multiple synchronization solutions, like NextCloud, Dropbox, oneDrive and WebDav, while also making it easy to support new services. It's also easy to switch from one service to another if you change your mind.
-
-**I should note that Joplin doesn't use encryption by default and you must enable this from its settings. Go to** `Tools > Encryption options` and enable the Joplin end-to-end encryption from there.
-
-### Download Joplin
-
-[Download Joplin][7]
-
-**Joplin is available for Linux, Windows, macOS, Android and iOS. On Linux, there's an AppImage as well as an Aur package available.**
-
-To run the Joplin AppImage on Linux, double click it and select `Make executable and run` if your file manager supports this. If not, you'll need to make it executable either using your file manager (should be something like: `right click > Properties > Permissions > Allow executing file as program` , but this may vary depending on the file manager you use), or from the command line:
-```
-chmod +x /path/to/Joplin-*-x86_64.AppImage
-
-```
-
-Replacing `/path/to/` with the path to where you downloaded Joplin. Now you can double click the Joplin Appimage file to launch it.
-
-**TIP:** If you integrate Joplin to your menu and `~/.local/share/applications/appimagekit-joplin.desktop`) and adding `StartupWMClass=Joplin` at the end of the file on a new line, without modifying anything else.
-
-Joplin has a **command line client** that can be [installed using npm][5] (for Debian, Ubuntu or Linux Mint, see [how to install and configure Node.js and npm][6] ).
-
-
---------------------------------------------------------------------------------
-
-via: https://www.linuxuprising.com/2018/08/joplin-encrypted-open-source-note.html
-
-作者:[Logix][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://plus.google.com/118280394805678839070
-[1]:https://joplin.cozic.net/
-[2]:https://3.bp.blogspot.com/-y9JKL1F89Vo/W3_0dkZjzQI/AAAAAAAABcI/hQI7GAx6i_sMcel4mF0x4uxBrMO88O59wCLcBGAs/s640/joplin-notes-markdown.png (Joplin notes checkboxes link to other note)
-[3]:https://3.bp.blogspot.com/-y9JKL1F89Vo/W3_0dkZjzQI/AAAAAAAABcI/hQI7GAx6i_sMcel4mF0x4uxBrMO88O59wCLcBGAs/s1600/joplin-notes-markdown.png
-[4]:https://github.com/laurent22/joplin/issues/338
-[5]:https://joplin.cozic.net/terminal/
-[6]:https://www.linuxuprising.com/2018/04/how-to-install-and-configure-nodejs-and.html
-
-[7]: https://joplin.cozic.net/#installation
diff --git a/sources/tech/20180829 4 open source monitoring tools.md b/sources/tech/20180829 4 open source monitoring tools.md
index dbc59d8a29..a5b8bf6806 100644
--- a/sources/tech/20180829 4 open source monitoring tools.md
+++ b/sources/tech/20180829 4 open source monitoring tools.md
@@ -1,4 +1,3 @@
-translating by sd886393
4 open source monitoring tools
======
diff --git a/sources/tech/20180831 Publishing Markdown to HTML with MDwiki.md b/sources/tech/20180831 Publishing Markdown to HTML with MDwiki.md
deleted file mode 100644
index c25239b7ba..0000000000
--- a/sources/tech/20180831 Publishing Markdown to HTML with MDwiki.md
+++ /dev/null
@@ -1,73 +0,0 @@
-Publishing Markdown to HTML with MDwiki
-======
-
-
-
-There are plenty of reasons to like Markdown, a simple language with an easy-to-learn syntax that can be used with any text editor. Using tools like [Pandoc][1], you can convert Markdown text to [a variety of popular formats][2], including HTML. You can also automate that conversion process in a web server. An HTML5 and JavaScript application called [MDwiki][3], created by Timo Dörr, can take a stack of Markdown files and turn them into a website when requested from a browser. The MDwiki site includes a how-to guide and other information to help you get started:
-
-![MDwiki site getting started][5]
-
-What an Mdwiki site looks like.
-
-Inside the web server, a basic MDwiki site looks like this:
-
-![MDwiki site inside web server][7]
-
-What the webserver folder for that site looks like.
-
-I renamed the MDwiki HTML file `START.HTML` for this project. There is also one Markdown file that deals with navigation and a JSON file to hold a few configuration settings. Everything else is site content.
-
-While the overall website design is pretty much fixed by MDwiki, the content, styling, and number of pages are not. You can view a selection of different sites generated by MDwiki at [the MDwiki site][8]. It is fair to say that MDwiki sites lack the visual appeal that a web designer could achieve—but they are functional, and users should balance their simple appearance against the speed and ease of creating and editing them.
-
-Markdown comes in various flavors that extend a stable core functionality for different specific purposes. MDwiki uses GitHub flavor [Markdown][9], which adds features such as formatted code blocks and syntax highlighting for popular programming languages, making it well-suited for producing program documentation and tutorials.
-
-MDwiki also supports what it calls "gimmicks," which add extra functionality such as embedding YouTube video content and displaying mathematical formulas. These are worth exploring if you need them for specific projects. I find MDwiki an ideal tool for creating technical documentation and educational resources. I have also discovered some tricks and hacks that might not be immediately apparent.
-
-MDwiki works with any modern web browser when deployed in a web server; however, you do not need a web server if you access MDwiki with Mozilla Firefox. Most MDwiki users will opt to deploy completed projects on a web server to avoid excluding potential users, but development and testing can be done with just a text editor and Firefox. Completed MDwiki projects that are loaded into a Moodle Virtual Learning Environment (VLE) can be read by any modern browser, which could be useful in educational contexts. (This is probably also true for other VLE software, but you should test that.)
-
-MDwiki's default color scheme is not ideal for all projects, but you can replace it with another theme downloaded from [Bootswatch.com][10]. To do this, simply open the MDwiki HTML file in an editor, take out the `extlib/css/bootstrap-3.0.0.min.css` code, and insert the downloaded Bootswatch theme. There is also an MDwiki gimmick that lets users choose a Bootswatch theme to replace the default after MDwiki loads in their browser. I often work with users who have visual impairments, and they tend to prefer high-contrast themes, with white text on a dark background.
-
-![MDwiki screen with Bootswatch Superhero theme][12]
-
-MDwiki screen using the Bootswatch Superhero theme
-
-MDwiki, Markdown files, and static images are fine for many purposes. However, you might sometimes want to include, say, a JavaScript slideshow or a feedback form. Markdown files can include HTML code, but mixing Markdown with HTML can get confusing. One solution is to create the feature you want in a separate HTML file and display it inside a Markdown file with an iframe tag. I took this idea from the [Twine Cookbook][13], a support site for the Twine interactive fiction engine. The Twine Cookbook doesn’t actually use MDwiki, but combining Markdown and iframe tags opens up a wide range of creative possibilities.
-
-Here is an example:
-
-This HTML will display an HTML page created by the Twine interactive fiction engine inside a Markdown file.
-```
-
-```
-
-The result in an MDwiki-generated site looks like this:
-
-
-
-In short, MDwiki is an excellent small application that achieves its purpose extremely well.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/8/markdown-html-publishing
-
-作者:[Peter Cheer][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://opensource.com/users/petercheer
-[1]: https://pandoc.org/
-[2]: https://opensource.com/downloads/pandoc-cheat-sheet
-[3]: http://dynalon.github.io/mdwiki/#!index.md
-[4]: https://opensource.com/file/407306
-[5]: https://opensource.com/sites/default/files/uploads/1_-_mdwiki_screenshot.png (MDwiki site getting started)
-[6]: https://opensource.com/file/407311
-[7]: https://opensource.com/sites/default/files/uploads/2_-_mdwiki_inside_web_server.png (MDwiki site inside web server)
-[8]: http://dynalon.github.io/mdwiki/#!examples.md
-[9]: https://guides.github.com/features/mastering-markdown/
-[10]: https://bootswatch.com/
-[11]: https://opensource.com/file/407316
-[12]: https://opensource.com/sites/default/files/uploads/3_-_mdwiki_bootswatch_superhero.png (MDwiki screen with Bootswatch Superhero theme)
-[13]: https://github.com/iftechfoundation/twine-cookbook
diff --git a/sources/tech/20180831 Test containers with Python and Conu.md b/sources/tech/20180831 Test containers with Python and Conu.md
deleted file mode 100644
index 9911901d51..0000000000
--- a/sources/tech/20180831 Test containers with Python and Conu.md
+++ /dev/null
@@ -1,164 +0,0 @@
-translating by GraveAccent Test containers with Python and Conu
-======
-
-
-
-More and more developers are using containers to develop and deploy their applications. This means that easily testing containers is also becoming important. [Conu][1] (short for container utilities) is a Python library that makes it easy to write tests for your containers. This article shows you how to use it to test your containers.
-
-### Getting started
-
-First you need a container application to test. For that, the following commands create a new directory with a container Dockerfile, and a Flask application to be served by the container.
-```
-$ mkdir container_test
-$ cd container_test
-$ touch Dockerfile
-$ touch app.py
-
-```
-
-Copy the following code inside the app.py file. This is the customary basic Flask application that returns the string “Hello Container World!”
-```
-from flask import Flask
-app = Flask(__name__)
-
-@app.route('/')
-def hello_world():
- return 'Hello Container World!'
-
-if __name__ == '__main__':
- app.run(debug=True,host='0.0.0.0')
-
-```
-
-### Create and Build a Test Container
-
-To build the test container, add the following instructions to the Dockerfile.
-```
-FROM registry.fedoraproject.org/fedora-minimal:latest
-RUN microdnf -y install python3-flask && microdnf clean all
-ADD ./app.py /srv
-CMD ["python3", "/srv/app.py"]
-
-```
-
-Then build the container using the Docker CLI tool.
-```
-$ sudo dnf -y install docker
-$ sudo systemctl start docker
-$ sudo docker build . -t flaskapp_container
-
-```
-
-Note : The first two commands are only needed if Docker is not installed on your system.
-
-After the build use the following command to run the container.
-```
-$ sudo docker run -p 5000:5000 --rm flaskapp_container
-* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
-* Restarting with stat
-* Debugger is active!
-* Debugger PIN: 473-505-51
-
-```
-
-Finally, use curl to check that the Flask application is correctly running inside the container:
-```
-$ curl http://127.0.0.1:5000
-Hello Container World!
-
-```
-
-With the flaskapp_container now running and ready for testing, you can stop it using **Ctrl+C**.
-
-### Create a test script
-
-Before you write the test script, you must install conu. Inside the previously created container_test directory run the following commands.
-```
-$ python3 -m venv .venv
-$ source .venv/bin/activate
-(.venv)$ pip install --upgrade pip
-(.venv)$ pip install conu
-
-$ touch test_container.py
-
-```
-
-Then copy and save the following script in the test_container.py file.
-```
-import conu
-
-PORT = 5000
-
-with conu.DockerBackend() as backend:
- image = backend.ImageClass("flaskapp_container")
- options = ["-p", "5000:5000"]
- container = image.run_via_binary(additional_opts=options)
-
- try:
- # Check that the container is running and wait for the flask application to start.
- assert container.is_running()
- container.wait_for_port(PORT)
-
- # Run a GET request on / port 5000.
- http_response = container.http_request(path="/", port=PORT)
-
- # Check the response status code is 200
- assert http_response.ok
-
- # Get the response content
- response_content = http_response.content.decode("utf-8")
-
- # Check that the "Hello Container World!" string is served.
- assert "Hello Container World!" in response_content
-
- # Get the logs from the container
- logs = [line for line in container.logs()]
- # Check the the Flask application saw the GET request.
- assert b'"GET / HTTP/1.1" 200 -' in logs[-1]
-
- finally:
- container.stop()
- container.delete()
-
-```
-
-#### Test Setup
-
-The script starts by setting conu to use Docker as a backend to run the container. Then it sets the container image to use the flaskapp_container you built in the first part of this tutorial.
-
-The next step is to configure the options needed to run the container. In this example, the Flask application serves the content on port 5000. Therefore you need to expose this port and map it to the same port on the host.
-
-Finally, the script starts the container, and it’s now ready to be tested.
-
-#### Testing methods
-
-Before testing a container, check that the container is running and ready. The example script is using container.is_running and container.wait_for_port. These methods ensure the container is running and the service is available on the expected port.
-
-The container.http_request is a wrapper around the [requests][2] library which makes it convenient to send HTTP requests during the tests. This method returns a [requests.Response][3]object, so it’s easy to access the content of the response for testing.
-
-Conu also gives access to the container logs. Once again, this can be useful during testing. In the example above, the container.logs method returns the container logs. You can use them to assert that a specific log was printed, or for example that no exceptions were raised during testing.
-
-Conu provides many other useful methods to interface with containers. A full list of the APIs is available in the [documentation][4]. You can also consult the examples available on [GitHub][5].
-
-All the code and files needed to run this tutorial are available on [GitHub][6] as well. For readers who want to take this example further, you can look at using [pytest][7] to run the tests and build a container test suite.
-
-
---------------------------------------------------------------------------------
-
-via: https://fedoramagazine.org/test-containers-python-conu/
-
-作者:[Clément Verna][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://fedoramagazine.org/author/cverna/
-[1]: https://github.com/user-cont/conu
-[2]: http://docs.python-requests.org/en/master/
-[3]: http://docs.python-requests.org/en/master/api/#requests.Response
-[4]: https://conu.readthedocs.io/en/latest/index.html
-[5]: https://github.com/user-cont/conu/tree/master/docs/source/examples
-[6]: https://github.com/cverna/container_test_script
-[7]: https://docs.pytest.org/en/latest/
diff --git a/sources/tech/20180907 6.828 lab tools guide.md b/sources/tech/20180907 6.828 lab tools guide.md
deleted file mode 100644
index e9061a3097..0000000000
--- a/sources/tech/20180907 6.828 lab tools guide.md
+++ /dev/null
@@ -1,201 +0,0 @@
-6.828 lab tools guide
-======
-### 6.828 lab tools guide
-
-Familiarity with your environment is crucial for productive development and debugging. This page gives a brief overview of the JOS environment and useful GDB and QEMU commands. Don't take our word for it, though. Read the GDB and QEMU manuals. These are powerful tools that are worth knowing how to use.
-
-#### Debugging tips
-
-##### Kernel
-
-GDB is your friend. Use the qemu-gdb target (or its `qemu-gdb-nox` variant) to make QEMU wait for GDB to attach. See the GDB reference below for some commands that are useful when debugging kernels.
-
-If you're getting unexpected interrupts, exceptions, or triple faults, you can ask QEMU to generate a detailed log of interrupts using the -d argument.
-
-To debug virtual memory issues, try the QEMU monitor commands info mem (for a high-level overview) or info pg (for lots of detail). Note that these commands only display the _current_ page table.
-
-(Lab 4+) To debug multiple CPUs, use GDB's thread-related commands like thread and info threads.
-
-##### User environments (lab 3+)
-
-GDB also lets you debug user environments, but there are a few things you need to watch out for, since GDB doesn't know that there's a distinction between multiple user environments, or between user and kernel.
-
-You can start JOS with a specific user environment using make run- _name_ (or you can edit `kern/init.c` directly). To make QEMU wait for GDB to attach, use the run- _name_ -gdb variant.
-
-You can symbolically debug user code, just like you can kernel code, but you have to tell GDB which symbol table to use with the symbol-file command, since it can only use one symbol table at a time. The provided `.gdbinit` loads the kernel symbol table, `obj/kern/kernel`. The symbol table for a user environment is in its ELF binary, so you can load it using symbol-file obj/user/ _name_. _Don't_ load symbols from any `.o` files, as those haven't been relocated by the linker (libraries are statically linked into JOS user binaries, so those symbols are already included in each user binary). Make sure you get the _right_ user binary; library functions will be linked at different EIPs in different binaries and GDB won't know any better!
-
-(Lab 4+) Since GDB is attached to the virtual machine as a whole, it sees clock interrupts as just another control transfer. This makes it basically impossible to step through user code because a clock interrupt is virtually guaranteed the moment you let the VM run again. The stepi command works because it suppresses interrupts, but it only steps one assembly instruction. Breakpoints generally work, but watch out because you can hit the same EIP in a different environment (indeed, a different binary altogether!).
-
-#### Reference
-
-##### JOS makefile
-
-The JOS GNUmakefile includes a number of phony targets for running JOS in various ways. All of these targets configure QEMU to listen for GDB connections (the `*-gdb` targets also wait for this connection). To start once QEMU is running, simply run gdb from your lab directory. We provide a `.gdbinit` file that automatically points GDB at QEMU, loads the kernel symbol file, and switches between 16-bit and 32-bit mode. Exiting GDB will shut down QEMU.
-
- * make qemu
-Build everything and start QEMU with the VGA console in a new window and the serial console in your terminal. To exit, either close the VGA window or press `Ctrl-c` or `Ctrl-a x` in your terminal.
- * make qemu-nox
-Like `make qemu`, but run with only the serial console. To exit, press `Ctrl-a x`. This is particularly useful over SSH connections to Athena dialups because the VGA window consumes a lot of bandwidth.
- * make qemu-gdb
-Like `make qemu`, but rather than passively accepting GDB connections at any time, this pauses at the first machine instruction and waits for a GDB connection.
- * make qemu-nox-gdb
-A combination of the `qemu-nox` and `qemu-gdb` targets.
- * make run- _name_
-(Lab 3+) Run user program _name_. For example, `make run-hello` runs `user/hello.c`.
- * make run- _name_ -nox, run- _name_ -gdb, run- _name_ -gdb-nox,
-(Lab 3+) Variants of `run-name` that correspond to the variants of the `qemu` target.
-
-
-
-The makefile also accepts a few useful variables:
-
- * make V=1 ...
-Verbose mode. Print out every command being executed, including arguments.
- * make V=1 grade
-Stop after any failed grade test and leave the QEMU output in `jos.out` for inspection.
- * make QEMUEXTRA=' _args_ ' ...
-Specify additional arguments to pass to QEMU.
-
-
-
-##### JOS obj/
-
-The JOS GNUmakefile includes a number of phony targets for running JOS in various ways. All of these targets configure QEMU to listen for GDB connections (thetargets also wait for this connection). To start once QEMU is running, simply runfrom your lab directory. We provide afile that automatically points GDB at QEMU, loads the kernel symbol file, and switches between 16-bit and 32-bit mode. Exiting GDB will shut down QEMU.The makefile also accepts a few useful variables:
-
-When building JOS, the makefile also produces some additional output files that may prove useful while debugging:
-
- * `obj/boot/boot.asm`, `obj/kern/kernel.asm`, `obj/user/hello.asm`, etc.
-Assembly code listings for the bootloader, kernel, and user programs.
- * `obj/kern/kernel.sym`, `obj/user/hello.sym`, etc.
-Symbol tables for the kernel and user programs.
- * `obj/boot/boot.out`, `obj/kern/kernel`, `obj/user/hello`, etc
-Linked ELF images of the kernel and user programs. These contain symbol information that can be used by GDB.
-
-
-
-##### GDB
-
-See the [GDB manual][1] for a full guide to GDB commands. Here are some particularly useful commands for 6.828, some of which don't typically come up outside of OS development.
-
- * Ctrl-c
-Halt the machine and break in to GDB at the current instruction. If QEMU has multiple virtual CPUs, this halts all of them.
- * c (or continue)
-Continue execution until the next breakpoint or `Ctrl-c`.
- * si (or stepi)
-Execute one machine instruction.
- * b function or b file:line (or breakpoint)
-Set a breakpoint at the given function or line.
- * b * _addr_ (or breakpoint)
-Set a breakpoint at the EIP _addr_.
- * set print pretty
-Enable pretty-printing of arrays and structs.
- * info registers
-Print the general purpose registers, `eip`, `eflags`, and the segment selectors. For a much more thorough dump of the machine register state, see QEMU's own `info registers` command.
- * x/ _N_ x _addr_
-Display a hex dump of _N_ words starting at virtual address _addr_. If _N_ is omitted, it defaults to 1. _addr_ can be any expression.
- * x/ _N_ i _addr_
-Display the _N_ assembly instructions starting at _addr_. Using `$eip` as _addr_ will display the instructions at the current instruction pointer.
- * symbol-file _file_
-(Lab 3+) Switch to symbol file _file_. When GDB attaches to QEMU, it has no notion of the process boundaries within the virtual machine, so we have to tell it which symbols to use. By default, we configure GDB to use the kernel symbol file, `obj/kern/kernel`. If the machine is running user code, say `hello.c`, you can switch to the hello symbol file using `symbol-file obj/user/hello`.
-
-
-
-QEMU represents each virtual CPU as a thread in GDB, so you can use all of GDB's thread-related commands to view or manipulate QEMU's virtual CPUs.
-
- * thread _n_
-GDB focuses on one thread (i.e., CPU) at a time. This command switches that focus to thread _n_ , numbered from zero.
- * info threads
-List all threads (i.e., CPUs), including their state (active or halted) and what function they're in.
-
-
-
-##### QEMU
-
-QEMU includes a built-in monitor that can inspect and modify the machine state in useful ways. To enter the monitor, press Ctrl-a c in the terminal running QEMU. Press Ctrl-a c again to switch back to the serial console.
-
-For a complete reference to the monitor commands, see the [QEMU manual][2]. Here are some particularly useful commands:
-
- * xp/ _N_ x _paddr_
-Display a hex dump of _N_ words starting at _physical_ address _paddr_. If _N_ is omitted, it defaults to 1. This is the physical memory analogue of GDB's `x` command.
-
- * info registers
-Display a full dump of the machine's internal register state. In particular, this includes the machine's _hidden_ segment state for the segment selectors and the local, global, and interrupt descriptor tables, plus the task register. This hidden state is the information the virtual CPU read from the GDT/LDT when the segment selector was loaded. Here's the CS when running in the JOS kernel in lab 1 and the meaning of each field:
-```
- CS =0008 10000000 ffffffff 10cf9a00 DPL=0 CS32 [-R-]
-```
-
- * `CS =0008`
-The visible part of the code selector. We're using segment 0x8. This also tells us we're referring to the global descriptor table (0x8 &4=0), and our CPL (current privilege level) is 0x8&3=0.
- * `10000000`
-The base of this segment. Linear address = logical address + 0x10000000.
- * `ffffffff`
-The limit of this segment. Linear addresses above 0xffffffff will result in segment violation exceptions.
- * `10cf9a00`
-The raw flags of this segment, which QEMU helpfully decodes for us in the next few fields.
- * `DPL=0`
-The privilege level of this segment. Only code running with privilege level 0 can load this segment.
- * `CS32`
-This is a 32-bit code segment. Other values include `DS` for data segments (not to be confused with the DS register), and `LDT` for local descriptor tables.
- * `[-R-]`
-This segment is read-only.
- * info mem
-(Lab 2+) Display mapped virtual memory and permissions. For example,
-```
- ef7c0000-ef800000 00040000 urw
- efbf8000-efc00000 00008000 -rw
-
-```
-
-tells us that the 0x00040000 bytes of memory from 0xef7c0000 to 0xef800000 are mapped read/write and user-accessible, while the memory from 0xefbf8000 to 0xefc00000 is mapped read/write, but only kernel-accessible.
-
- * info pg
-(Lab 2+) Display the current page table structure. The output is similar to `info mem`, but distinguishes page directory entries and page table entries and gives the permissions for each separately. Repeated PTE's and entire page tables are folded up into a single line. For example,
-```
- VPN range Entry Flags Physical page
- [00000-003ff] PDE[000] -------UWP
- [00200-00233] PTE[200-233] -------U-P 00380 0037e 0037d 0037c 0037b 0037a ..
- [00800-00bff] PDE[002] ----A--UWP
- [00800-00801] PTE[000-001] ----A--U-P 0034b 00349
- [00802-00802] PTE[002] -------U-P 00348
-
-```
-
-This shows two page directory entries, spanning virtual addresses 0x00000000 to 0x003fffff and 0x00800000 to 0x00bfffff, respectively. Both PDE's are present, writable, and user and the second PDE is also accessed. The second of these page tables maps three pages, spanning virtual addresses 0x00800000 through 0x00802fff, of which the first two are present, user, and accessed and the third is only present and user. The first of these PTE's maps physical page 0x34b.
-
-
-
-
-QEMU also takes some useful command line arguments, which can be passed into the JOS makefile using the
-
- * make QEMUEXTRA='-d int' ...
-Log all interrupts, along with a full register dump, to `qemu.log`. You can ignore the first two log entries, "SMM: enter" and "SMM: after RMS", as these are generated before entering the boot loader. After this, log entries look like
-```
- 4: v=30 e=0000 i=1 cpl=3 IP=001b:00800e2e pc=00800e2e SP=0023:eebfdf28 EAX=00000005
- EAX=00000005 EBX=00001002 ECX=00200000 EDX=00000000
- ESI=00000805 EDI=00200000 EBP=eebfdf60 ESP=eebfdf28
- ...
-
-```
-
-The first line describes the interrupt. The `4:` is just a log record counter. `v` gives the vector number in hex. `e` gives the error code. `i=1` indicates that this was produced by an `int` instruction (versus a hardware interrupt). The rest of the line should be self-explanatory. See info registers for a description of the register dump that follows.
-
-Note: If you're running a pre-0.15 version of QEMU, the log will be written to `/tmp` instead of the current directory.
-
-
-
-
---------------------------------------------------------------------------------
-
-via: https://pdos.csail.mit.edu/6.828/2018/labguide.html
-
-作者:[csail.mit][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://pdos.csail.mit.edu
-[b]: https://github.com/lujun9972
-[1]: http://sourceware.org/gdb/current/onlinedocs/gdb/
-[2]: http://wiki.qemu.org/download/qemu-doc.html#pcsys_005fmonitor
diff --git a/sources/tech/20180911 Tools Used in 6.828.md b/sources/tech/20180911 Tools Used in 6.828.md
deleted file mode 100644
index c9afeae4ea..0000000000
--- a/sources/tech/20180911 Tools Used in 6.828.md
+++ /dev/null
@@ -1,247 +0,0 @@
-Tools Used in 6.828
-======
-### Tools Used in 6.828
-
-You'll use two sets of tools in this class: an x86 emulator, QEMU, for running your kernel; and a compiler toolchain, including assembler, linker, C compiler, and debugger, for compiling and testing your kernel. This page has the information you'll need to download and install your own copies. This class assumes familiarity with Unix commands throughout.
-
-We highly recommend using a Debathena machine, such as athena.dialup.mit.edu, to work on the labs. If you use the MIT Athena machines that run Linux, then all the software tools you will need for this course are located in the 6.828 locker: just type 'add -f 6.828' to get access to them.
-
-If you don't have access to a Debathena machine, we recommend you use a virtual machine with Linux. If you really want to, you can build and install the tools on your own machine. We have instructions below for Linux and MacOS computers.
-
-It should be possible to get this development environment running under windows with the help of [Cygwin][1]. Install cygwin, and be sure to install the flex and bison packages (they are under the development header).
-
-For an overview of useful commands in the tools used in 6.828, see the [lab tools guide][2].
-
-#### Compiler Toolchain
-
-A "compiler toolchain" is the set of programs, including a C compiler, assemblers, and linkers, that turn code into executable binaries. You'll need a compiler toolchain that generates code for 32-bit Intel architectures ("x86" architectures) in the ELF binary format.
-
-##### Test Your Compiler Toolchain
-
-Modern Linux and BSD UNIX distributions already provide a toolchain suitable for 6.828. To test your distribution, try the following commands:
-
-```
-% objdump -i
-
-```
-
-The second line should say `elf32-i386`.
-
-```
-% gcc -m32 -print-libgcc-file-name
-
-```
-
-The command should print something like `/usr/lib/gcc/i486-linux-gnu/version/libgcc.a` or `/usr/lib/gcc/x86_64-linux-gnu/version/32/libgcc.a`
-
-If both these commands succeed, you're all set, and don't need to compile your own toolchain.
-
-If the gcc command fails, you may need to install a development environment. On Ubuntu Linux, try this:
-
-```
-% sudo apt-get install -y build-essential gdb
-
-```
-
-On 64-bit machines, you may need to install a 32-bit support library. The symptom is that linking fails with error messages like "`__udivdi3` not found" and "`__muldi3` not found". On Ubuntu Linux, try this to fix the problem:
-
-```
-% sudo apt-get install gcc-multilib
-
-```
-
-##### Using a Virtual Machine
-
-Otherwise, the easiest way to get a compatible toolchain is to install a modern Linux distribution on your computer. With platform virtualization, Linux can cohabitate with your normal computing environment. Installing a Linux virtual machine is a two step process. First, you download the virtualization platform.
-
- * [**VirtualBox**][3] (free for Mac, Linux, Windows) — [Download page][3]
- * [VMware Player][4] (free for Linux and Windows, registration required)
- * [VMware Fusion][5] (Downloadable from IS&T for free).
-
-
-
-VirtualBox is a little slower and less flexible, but free!
-
-Once the virtualization platform is installed, download a boot disk image for the Linux distribution of your choice.
-
- * [Ubuntu Desktop][6] is what we use.
-
-
-
-This will download a file named something like `ubuntu-10.04.1-desktop-i386.iso`. Start up your virtualization platform and create a new (32-bit) virtual machine. Use the downloaded Ubuntu image as a boot disk; the procedure differs among VMs but is pretty simple. Type `objdump -i`, as above, to verify that your toolchain is now set up. You will do your work inside the VM.
-
-##### Building Your Own Compiler Toolchain
-
-This will take longer to set up, but give slightly better performance than a virtual machine, and lets you work in your own familiar environment (Unix/MacOS). Fast-forward to the end for MacOS instructions.
-
-###### Linux
-
-You can use your own tool chain by adding the following line to `conf/env.mk`:
-
-```
-GCCPREFIX=
-
-```
-
-We assume that you are installing the toolchain into `/usr/local`. You will need a fair amount of disk space to compile the tools (around 1GiB). If you don't have that much space, delete each directory after its `make install` step.
-
-Download the following packages:
-
-+ ftp://ftp.gmplib.org/pub/gmp-5.0.2/gmp-5.0.2.tar.bz2
-+ https://www.mpfr.org/mpfr-3.1.2/mpfr-3.1.2.tar.bz2
-+ http://www.multiprecision.org/downloads/mpc-0.9.tar.gz
-+ http://ftpmirror.gnu.org/binutils/binutils-2.21.1.tar.bz2
-+ http://ftpmirror.gnu.org/gcc/gcc-4.6.4/gcc-core-4.6.4.tar.bz2
-+ http://ftpmirror.gnu.org/gdb/gdb-7.3.1.tar.bz2
-
-(You may also use newer versions of these packages.) Unpack and build the packages. The `green bold` text shows you how to install into `/usr/local`, which is what we recommend. To install into a different directory, $PFX, note the differences in lighter type ([hide][7]). If you have problems, see below.
-
-```
-export PATH=$PFX/bin:$PATH
-export LD_LIBRARY_PATH=$PFX/lib:$LD_LIBRARY_PATH
-
-tar xjf gmp-5.0.2.tar.bz2
-cd gmp-5.0.2
-./configure --prefix=$PFX
-make
-make install # This step may require privilege (sudo make install)
-cd ..
-
-tar xjf mpfr-3.1.2.tar.bz2
-cd mpfr-3.1.2
-./configure --prefix=$PFX --with-gmp=$PFX
-make
-make install # This step may require privilege (sudo make install)
-cd ..
-
-tar xzf mpc-0.9.tar.gz
-cd mpc-0.9
-./configure --prefix=$PFX --with-gmp=$PFX --with-mpfr=$PFX
-make
-make install # This step may require privilege (sudo make install)
-cd ..
-
-
-tar xjf binutils-2.21.1.tar.bz2
-cd binutils-2.21.1
-./configure --prefix=$PFX --target=i386-jos-elf --disable-werror
-make
-make install # This step may require privilege (sudo make install)
-cd ..
-
-i386-jos-elf-objdump -i
-# Should produce output like:
-# BFD header file version (GNU Binutils) 2.21.1
-# elf32-i386
-# (header little endian, data little endian)
-# i386...
-
-
-tar xjf gcc-core-4.6.4.tar.bz2
-cd gcc-4.6.4
-mkdir build # GCC will not compile correctly unless you build in a separate directory
-cd build
-../configure --prefix=$PFX --with-gmp=$PFX --with-mpfr=$PFX --with-mpc=$PFX \
- --target=i386-jos-elf --disable-werror \
- --disable-libssp --disable-libmudflap --with-newlib \
- --without-headers --enable-languages=c MAKEINFO=missing
-make all-gcc
-make install-gcc # This step may require privilege (sudo make install-gcc)
-make all-target-libgcc
-make install-target-libgcc # This step may require privilege (sudo make install-target-libgcc)
-cd ../..
-
-i386-jos-elf-gcc -v
-# Should produce output like:
-# Using built-in specs.
-# COLLECT_GCC=i386-jos-elf-gcc
-# COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/i386-jos-elf/4.6.4/lto-wrapper
-# Target: i386-jos-elf
-
-
-tar xjf gdb-7.3.1.tar.bz2
-cd gdb-7.3.1
-./configure --prefix=$PFX --target=i386-jos-elf --program-prefix=i386-jos-elf- \
- --disable-werror
-make all
-make install # This step may require privilege (sudo make install)
-cd ..
-
-```
-
-###### Linux troubleshooting
-
- * Q. I can't run `make install` because I don't have root permission on this machine.
-A. Our instructions assume you are installing into the `/usr/local` directory. However, this may not be allowed in your environment. If you can only install code into your home directory, that's OK. In the instructions above, replace `--prefix=/usr/local` with `--prefix=$HOME` (and [click here][7] to update the instructions further). You will also need to change your `PATH` and `LD_LIBRARY_PATH` environment variables, to inform your shell where to find the tools. For example:
-```
- export PATH=$HOME/bin:$PATH
- export LD_LIBRARY_PATH=$HOME/lib:$LD_LIBRARY_PATH
-```
-
-Enter these lines in your `~/.bashrc` file so you don't need to type them every time you log in.
-
-
-
- * Q. My build fails with an inscrutable message about "library not found".
-A. You need to set your `LD_LIBRARY_PATH`. The environment variable must include the `PREFIX/lib` directory (for instance, `/usr/local/lib`).
-
-
-
-#### MacOS
-
-First begin by installing developer tools on Mac OSX:
-`xcode-select --install`
-
-First begin by installing developer tools on Mac OSX:
-
-You can install the qemu dependencies from homebrew, however do not install qemu itself as you will need the 6.828 patched version.
-
-`brew install $(brew deps qemu)`
-
-The gettext utility does not add installed binaries to the path, so you will need to run
-
-`PATH=${PATH}:/usr/local/opt/gettext/bin make install`
-
-when installing qemu below.
-
-### QEMU Emulator
-
-[QEMU][8] is a modern and fast PC emulator. QEMU version 2.3.0 is set up on Athena for x86 machines in the 6.828 locker (`add -f 6.828`)
-
-Unfortunately, QEMU's debugging facilities, while powerful, are somewhat immature, so we highly recommend you use our patched version of QEMU instead of the stock version that may come with your distribution. The version installed on Athena is already patched. To build your own patched version of QEMU:
-
- 1. Clone the IAP 6.828 QEMU git repository `git clone https://github.com/mit-pdos/6.828-qemu.git qemu`
- 2. On Linux, you may need to install several libraries. We have successfully built 6.828 QEMU on Debian/Ubuntu 16.04 after installing the following packages: libsdl1.2-dev, libtool-bin, libglib2.0-dev, libz-dev, and libpixman-1-dev.
- 3. Configure the source code (optional arguments are shown in square brackets; replace PFX with a path of your choice)
- 1. Linux: `./configure --disable-kvm --disable-werror [--prefix=PFX] [--target-list="i386-softmmu x86_64-softmmu"]`
- 2. OS X: `./configure --disable-kvm --disable-werror --disable-sdl [--prefix=PFX] [--target-list="i386-softmmu x86_64-softmmu"]` The `prefix` argument specifies where to install QEMU; without it QEMU will install to `/usr/local` by default. The `target-list` argument simply slims down the architectures QEMU will build support for.
- 4. Run `make && make install`
-
-
-
-
---------------------------------------------------------------------------------
-
-via: https://pdos.csail.mit.edu/6.828/2018/tools.html
-
-作者:[csail.mit][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://pdos.csail.mit.edu
-[b]: https://github.com/lujun9972
-[1]: http://www.cygwin.com
-[2]: labguide.html
-[3]: http://www.oracle.com/us/technologies/virtualization/oraclevm/
-[4]: http://www.vmware.com/products/player/
-[5]: http://www.vmware.com/products/fusion/
-[6]: http://www.ubuntu.com/download/desktop
-[7]:
-[8]: http://www.nongnu.org/qemu/
-[9]: mailto:6828-staff@lists.csail.mit.edu
-[10]: https://i.creativecommons.org/l/by/3.0/us/88x31.png
-[11]: https://creativecommons.org/licenses/by/3.0/us/
-[12]: https://pdos.csail.mit.edu/6.828/2018/index.html
diff --git a/sources/tech/20180913 Lab 1- PC Bootstrap and GCC Calling Conventions.md b/sources/tech/20180913 Lab 1- PC Bootstrap and GCC Calling Conventions.md
deleted file mode 100644
index 365b5eb5f8..0000000000
--- a/sources/tech/20180913 Lab 1- PC Bootstrap and GCC Calling Conventions.md
+++ /dev/null
@@ -1,616 +0,0 @@
-Lab 1: PC Bootstrap and GCC Calling Conventions
-======
-### Lab 1: Booting a PC
-
-#### Introduction
-
-This lab is split into three parts. The first part concentrates on getting familiarized with x86 assembly language, the QEMU x86 emulator, and the PC's power-on bootstrap procedure. The second part examines the boot loader for our 6.828 kernel, which resides in the `boot` directory of the `lab` tree. Finally, the third part delves into the initial template for our 6.828 kernel itself, named JOS, which resides in the `kernel` directory.
-
-##### Software Setup
-
-The files you will need for this and subsequent lab assignments in this course are distributed using the [Git][1] version control system. To learn more about Git, take a look at the [Git user's manual][2], or, if you are already familiar with other version control systems, you may find this [CS-oriented overview of Git][3] useful.
-
-The URL for the course Git repository is . To install the files in your Athena account, you need to _clone_ the course repository, by running the commands below. You must use an x86 Athena machine; that is, `uname -a` should mention `i386 GNU/Linux` or `i686 GNU/Linux` or `x86_64 GNU/Linux`. You can log into a public Athena host with `ssh -X athena.dialup.mit.edu`.
-
-```
-athena% mkdir ~/6.828
-athena% cd ~/6.828
-athena% add git
-athena% git clone https://pdos.csail.mit.edu/6.828/2018/jos.git lab
-Cloning into lab...
-athena% cd lab
-athena%
-
-```
-
-Git allows you to keep track of the changes you make to the code. For example, if you are finished with one of the exercises, and want to checkpoint your progress, you can _commit_ your changes by running:
-
-```
-athena% git commit -am 'my solution for lab1 exercise 9'
-Created commit 60d2135: my solution for lab1 exercise 9
- 1 files changed, 1 insertions(+), 0 deletions(-)
-athena%
-
-```
-
-You can keep track of your changes by using the git diff command. Running git diff will display the changes to your code since your last commit, and git diff origin/lab1 will display the changes relative to the initial code supplied for this lab. Here, `origin/lab1` is the name of the git branch with the initial code you downloaded from our server for this assignment.
-
-We have set up the appropriate compilers and simulators for you on Athena. To use them, run add -f 6.828. You must run this command every time you log in (or add it to your `~/.environment` file). If you get obscure errors while compiling or running `qemu`, double check that you added the course locker.
-
-If you are working on a non-Athena machine, you'll need to install `qemu` and possibly `gcc` following the directions on the [tools page][4]. We've made several useful debugging changes to `qemu` and some of the later labs depend on these patches, so you must build your own. If your machine uses a native ELF toolchain (such as Linux and most BSD's, but notably _not_ OS X), you can simply install `gcc` from your package manager. Otherwise, follow the directions on the tools page.
-
-##### Hand-In Procedure
-
-You will turn in your assignments using the [submission website][5]. You need to request an API key from the submission website before you can turn in any assignments or labs.
-
-The lab code comes with GNU Make rules to make submission easier. After committing your final changes to the lab, type make handin to submit your lab.
-
-```
-athena% git commit -am "ready to submit my lab"
-[lab1 c2e3c8b] ready to submit my lab
- 2 files changed, 18 insertions(+), 2 deletions(-)
-
-athena% make handin
-git archive --prefix=lab1/ --format=tar HEAD | gzip > lab1-handin.tar.gz
-Get an API key for yourself by visiting https://6828.scripts.mit.edu/2018/handin.py/
-Please enter your API key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
- % Total % Received % Xferd Average Speed Time Time Time Current
- Dload Upload Total Spent Left Speed
-100 50199 100 241 100 49958 414 85824 --:--:-- --:--:-- --:--:-- 85986
-athena%
-
-```
-
-make handin will store your API key in _myapi.key_. If you need to change your API key, just remove this file and let make handin generate it again ( _myapi.key_ must not include newline characters).
-
-If use make handin and you have either uncomitted changes or untracked files, you will see output similar to the following:
-
-```
- M hello.c
-?? bar.c
-?? foo.pyc
-Untracked files will not be handed in. Continue? [y/N]
-
-```
-
-Inspect the above lines and make sure all files that your lab solution needs are tracked i.e. not listed in a line that begins with ??.
-
-In the case that make handin does not work properly, try fixing the problem with the curl or Git commands. Or you can run make tarball. This will make a tar file for you, which you can then upload via our [web interface][5].
-
-You can run make grade to test your solutions with the grading program. The [web interface][5] uses the same grading program to assign your lab submission a grade. You should check the output of the grader (it may take a few minutes since the grader runs periodically) and ensure that you received the grade which you expected. If the grades don't match, your lab submission probably has a bug -- check the output of the grader (resp-lab*.txt) to see which particular test failed.
-
-For Lab 1, you do not need to turn in answers to any of the questions below. (Do answer them for yourself though! They will help with the rest of the lab.)
-
-#### Part 1: PC Bootstrap
-
-The purpose of the first exercise is to introduce you to x86 assembly language and the PC bootstrap process, and to get you started with QEMU and QEMU/GDB debugging. You will not have to write any code for this part of the lab, but you should go through it anyway for your own understanding and be prepared to answer the questions posed below.
-
-##### Getting Started with x86 assembly
-
-If you are not already familiar with x86 assembly language, you will quickly become familiar with it during this course! The [PC Assembly Language Book][6] is an excellent place to start. Hopefully, the book contains mixture of new and old material for you.
-
-_Warning:_ Unfortunately the examples in the book are written for the NASM assembler, whereas we will be using the GNU assembler. NASM uses the so-called _Intel_ syntax while GNU uses the _AT &T_ syntax. While semantically equivalent, an assembly file will differ quite a lot, at least superficially, depending on which syntax is used. Luckily the conversion between the two is pretty simple, and is covered in [Brennan's Guide to Inline Assembly][7].
-
-Exercise 1. Familiarize yourself with the assembly language materials available on [the 6.828 reference page][8]. You don't have to read them now, but you'll almost certainly want to refer to some of this material when reading and writing x86 assembly.
-
-We do recommend reading the section "The Syntax" in [Brennan's Guide to Inline Assembly][7]. It gives a good (and quite brief) description of the AT&T assembly syntax we'll be using with the GNU assembler in JOS.
-
-Certainly the definitive reference for x86 assembly language programming is Intel's instruction set architecture reference, which you can find on [the 6.828 reference page][8] in two flavors: an HTML edition of the old [80386 Programmer's Reference Manual][9], which is much shorter and easier to navigate than more recent manuals but describes all of the x86 processor features that we will make use of in 6.828; and the full, latest and greatest [IA-32 Intel Architecture Software Developer's Manuals][10] from Intel, covering all the features of the most recent processors that we won't need in class but you may be interested in learning about. An equivalent (and often friendlier) set of manuals is [available from AMD][11]. Save the Intel/AMD architecture manuals for later or use them for reference when you want to look up the definitive explanation of a particular processor feature or instruction.
-
-##### Simulating the x86
-
-Instead of developing the operating system on a real, physical personal computer (PC), we use a program that faithfully emulates a complete PC: the code you write for the emulator will boot on a real PC too. Using an emulator simplifies debugging; you can, for example, set break points inside of the emulated x86, which is difficult to do with the silicon version of an x86.
-
-In 6.828 we will use the [QEMU Emulator][12], a modern and relatively fast emulator. While QEMU's built-in monitor provides only limited debugging support, QEMU can act as a remote debugging target for the [GNU debugger][13] (GDB), which we'll use in this lab to step through the early boot process.
-
-To get started, extract the Lab 1 files into your own directory on Athena as described above in "Software Setup", then type make (or gmake on BSD systems) in the `lab` directory to build the minimal 6.828 boot loader and kernel you will start with. (It's a little generous to call the code we're running here a "kernel," but we'll flesh it out throughout the semester.)
-
-```
-athena% cd lab
-athena% make
-+ as kern/entry.S
-+ cc kern/entrypgdir.c
-+ cc kern/init.c
-+ cc kern/console.c
-+ cc kern/monitor.c
-+ cc kern/printf.c
-+ cc kern/kdebug.c
-+ cc lib/printfmt.c
-+ cc lib/readline.c
-+ cc lib/string.c
-+ ld obj/kern/kernel
-+ as boot/boot.S
-+ cc -Os boot/main.c
-+ ld boot/boot
-boot block is 380 bytes (max 510)
-+ mk obj/kern/kernel.img
-
-```
-
-(If you get errors like "undefined reference to `__udivdi3'", you probably don't have the 32-bit gcc multilib. If you're running Debian or Ubuntu, try installing the gcc-multilib package.)
-
-Now you're ready to run QEMU, supplying the file `obj/kern/kernel.img`, created above, as the contents of the emulated PC's "virtual hard disk." This hard disk image contains both our boot loader (`obj/boot/boot`) and our kernel (`obj/kernel`).
-
-```
-athena% make qemu
-
-```
-
-or
-
-```
-athena% make qemu-nox
-
-```
-
-This executes QEMU with the options required to set the hard disk and direct serial port output to the terminal. Some text should appear in the QEMU window:
-
-```
-Booting from Hard Disk...
-6828 decimal is XXX octal!
-entering test_backtrace 5
-entering test_backtrace 4
-entering test_backtrace 3
-entering test_backtrace 2
-entering test_backtrace 1
-entering test_backtrace 0
-leaving test_backtrace 0
-leaving test_backtrace 1
-leaving test_backtrace 2
-leaving test_backtrace 3
-leaving test_backtrace 4
-leaving test_backtrace 5
-Welcome to the JOS kernel monitor!
-Type 'help' for a list of commands.
-K>
-
-```
-
-Everything after '`Booting from Hard Disk...`' was printed by our skeletal JOS kernel; the `K>` is the prompt printed by the small _monitor_ , or interactive control program, that we've included in the kernel. If you used make qemu, these lines printed by the kernel will appear in both the regular shell window from which you ran QEMU and the QEMU display window. This is because for testing and lab grading purposes we have set up the JOS kernel to write its console output not only to the virtual VGA display (as seen in the QEMU window), but also to the simulated PC's virtual serial port, which QEMU in turn outputs to its own standard output. Likewise, the JOS kernel will take input from both the keyboard and the serial port, so you can give it commands in either the VGA display window or the terminal running QEMU. Alternatively, you can use the serial console without the virtual VGA by running make qemu-nox. This may be convenient if you are SSH'd into an Athena dialup. To quit qemu, type Ctrl+a x.
-
-There are only two commands you can give to the kernel monitor, `help` and `kerninfo`.
-
-```
-K> help
-help - display this list of commands
-kerninfo - display information about the kernel
-K> kerninfo
-Special kernel symbols:
- entry f010000c (virt) 0010000c (phys)
- etext f0101a75 (virt) 00101a75 (phys)
- edata f0112300 (virt) 00112300 (phys)
- end f0112960 (virt) 00112960 (phys)
-Kernel executable memory footprint: 75KB
-K>
-
-```
-
-The `help` command is obvious, and we will shortly discuss the meaning of what the `kerninfo` command prints. Although simple, it's important to note that this kernel monitor is running "directly" on the "raw (virtual) hardware" of the simulated PC. This means that you should be able to copy the contents of `obj/kern/kernel.img` onto the first few sectors of a _real_ hard disk, insert that hard disk into a real PC, turn it on, and see exactly the same thing on the PC's real screen as you did above in the QEMU window. (We don't recommend you do this on a real machine with useful information on its hard disk, though, because copying `kernel.img` onto the beginning of its hard disk will trash the master boot record and the beginning of the first partition, effectively causing everything previously on the hard disk to be lost!)
-
-##### The PC's Physical Address Space
-
-We will now dive into a bit more detail about how a PC starts up. A PC's physical address space is hard-wired to have the following general layout:
-
-```
-+------------------+ <- 0xFFFFFFFF (4GB)
-| 32-bit |
-| memory mapped |
-| devices |
-| |
-/\/\/\/\/\/\/\/\/\/\
-
-/\/\/\/\/\/\/\/\/\/\
-| |
-| Unused |
-| |
-+------------------+ <- depends on amount of RAM
-| |
-| |
-| Extended Memory |
-| |
-| |
-+------------------+ <- 0x00100000 (1MB)
-| BIOS ROM |
-+------------------+ <- 0x000F0000 (960KB)
-| 16-bit devices, |
-| expansion ROMs |
-+------------------+ <- 0x000C0000 (768KB)
-| VGA Display |
-+------------------+ <- 0x000A0000 (640KB)
-| |
-| Low Memory |
-| |
-+------------------+ <- 0x00000000
-
-```
-
-The first PCs, which were based on the 16-bit Intel 8088 processor, were only capable of addressing 1MB of physical memory. The physical address space of an early PC would therefore start at 0x00000000 but end at 0x000FFFFF instead of 0xFFFFFFFF. The 640KB area marked "Low Memory" was the _only_ random-access memory (RAM) that an early PC could use; in fact the very earliest PCs only could be configured with 16KB, 32KB, or 64KB of RAM!
-
-The 384KB area from 0x000A0000 through 0x000FFFFF was reserved by the hardware for special uses such as video display buffers and firmware held in non-volatile memory. The most important part of this reserved area is the Basic Input/Output System (BIOS), which occupies the 64KB region from 0x000F0000 through 0x000FFFFF. In early PCs the BIOS was held in true read-only memory (ROM), but current PCs store the BIOS in updateable flash memory. The BIOS is responsible for performing basic system initialization such as activating the video card and checking the amount of memory installed. After performing this initialization, the BIOS loads the operating system from some appropriate location such as floppy disk, hard disk, CD-ROM, or the network, and passes control of the machine to the operating system.
-
-When Intel finally "broke the one megabyte barrier" with the 80286 and 80386 processors, which supported 16MB and 4GB physical address spaces respectively, the PC architects nevertheless preserved the original layout for the low 1MB of physical address space in order to ensure backward compatibility with existing software. Modern PCs therefore have a "hole" in physical memory from 0x000A0000 to 0x00100000, dividing RAM into "low" or "conventional memory" (the first 640KB) and "extended memory" (everything else). In addition, some space at the very top of the PC's 32-bit physical address space, above all physical RAM, is now commonly reserved by the BIOS for use by 32-bit PCI devices.
-
-Recent x86 processors can support _more_ than 4GB of physical RAM, so RAM can extend further above 0xFFFFFFFF. In this case the BIOS must arrange to leave a _second_ hole in the system's RAM at the top of the 32-bit addressable region, to leave room for these 32-bit devices to be mapped. Because of design limitations JOS will use only the first 256MB of a PC's physical memory anyway, so for now we will pretend that all PCs have "only" a 32-bit physical address space. But dealing with complicated physical address spaces and other aspects of hardware organization that evolved over many years is one of the important practical challenges of OS development.
-
-##### The ROM BIOS
-
-In this portion of the lab, you'll use QEMU's debugging facilities to investigate how an IA-32 compatible computer boots.
-
-Open two terminal windows and cd both shells into your lab directory. In one, enter make qemu-gdb (or make qemu-nox-gdb). This starts up QEMU, but QEMU stops just before the processor executes the first instruction and waits for a debugging connection from GDB. In the second terminal, from the same directory you ran `make`, run make gdb. You should see something like this,
-
-```
-athena% make gdb
-GNU gdb (GDB) 6.8-debian
-Copyright (C) 2008 Free Software Foundation, Inc.
-License GPLv3+: GNU GPL version 3 or later
-This is free software: you are free to change and redistribute it.
-There is NO WARRANTY, to the extent permitted by law. Type "show copying"
-and "show warranty" for details.
-This GDB was configured as "i486-linux-gnu".
-+ target remote localhost:26000
-The target architecture is assumed to be i8086
-[f000:fff0] 0xffff0: ljmp $0xf000,$0xe05b
-0x0000fff0 in ?? ()
-+ symbol-file obj/kern/kernel
-(gdb)
-
-```
-
-We provided a `.gdbinit` file that set up GDB to debug the 16-bit code used during early boot and directed it to attach to the listening QEMU. (If it doesn't work, you may have to add an `add-auto-load-safe-path` in your `.gdbinit` in your home directory to convince `gdb` to process the `.gdbinit` we provided. `gdb` will tell you if you have to do this.)
-
-The following line:
-
-```
-[f000:fff0] 0xffff0: ljmp $0xf000,$0xe05b
-
-```
-
-is GDB's disassembly of the first instruction to be executed. From this output you can conclude a few things:
-
- * The IBM PC starts executing at physical address 0x000ffff0, which is at the very top of the 64KB area reserved for the ROM BIOS.
- * The PC starts executing with `CS = 0xf000` and `IP = 0xfff0`.
- * The first instruction to be executed is a `jmp` instruction, which jumps to the segmented address `CS = 0xf000` and `IP = 0xe05b`.
-
-
-
-Why does QEMU start like this? This is how Intel designed the 8088 processor, which IBM used in their original PC. Because the BIOS in a PC is "hard-wired" to the physical address range 0x000f0000-0x000fffff, this design ensures that the BIOS always gets control of the machine first after power-up or any system restart - which is crucial because on power-up there _is_ no other software anywhere in the machine's RAM that the processor could execute. The QEMU emulator comes with its own BIOS, which it places at this location in the processor's simulated physical address space. On processor reset, the (simulated) processor enters real mode and sets CS to 0xf000 and the IP to 0xfff0, so that execution begins at that (CS:IP) segment address. How does the segmented address 0xf000:fff0 turn into a physical address?
-
-To answer that we need to know a bit about real mode addressing. In real mode (the mode that PC starts off in), address translation works according to the formula: _physical address_ = 16 选题模板.txt 中文排版指北.md comic core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LCTT翻译规范.md LICENSE Makefile published README.md sign.md sources translated _segment_ \+ _offset_. So, when the PC sets CS to 0xf000 and IP to 0xfff0, the physical address referenced is:
-
-```
- 16 * 0xf000 + 0xfff0 # in hex multiplication by 16 is
- = 0xf0000 + 0xfff0 # easy--just append a 0.
- = 0xffff0
-
-```
-
-`0xffff0` is 16 bytes before the end of the BIOS (`0x100000`). Therefore we shouldn't be surprised that the first thing that the BIOS does is `jmp` backwards to an earlier location in the BIOS; after all how much could it accomplish in just 16 bytes?
-
-Exercise 2. Use GDB's si (Step Instruction) command to trace into the ROM BIOS for a few more instructions, and try to guess what it might be doing. You might want to look at [Phil Storrs I/O Ports Description][14], as well as other materials on the [6.828 reference materials page][8]. No need to figure out all the details - just the general idea of what the BIOS is doing first.
-
-When the BIOS runs, it sets up an interrupt descriptor table and initializes various devices such as the VGA display. This is where the "`Starting SeaBIOS`" message you see in the QEMU window comes from.
-
-After initializing the PCI bus and all the important devices the BIOS knows about, it searches for a bootable device such as a floppy, hard drive, or CD-ROM. Eventually, when it finds a bootable disk, the BIOS reads the _boot loader_ from the disk and transfers control to it.
-
-#### Part 2: The Boot Loader
-
-Floppy and hard disks for PCs are divided into 512 byte regions called _sectors_. A sector is the disk's minimum transfer granularity: each read or write operation must be one or more sectors in size and aligned on a sector boundary. If the disk is bootable, the first sector is called the _boot sector_ , since this is where the boot loader code resides. When the BIOS finds a bootable floppy or hard disk, it loads the 512-byte boot sector into memory at physical addresses 0x7c00 through 0x7dff, and then uses a `jmp` instruction to set the CS:IP to `0000:7c00`, passing control to the boot loader. Like the BIOS load address, these addresses are fairly arbitrary - but they are fixed and standardized for PCs.
-
-The ability to boot from a CD-ROM came much later during the evolution of the PC, and as a result the PC architects took the opportunity to rethink the boot process slightly. As a result, the way a modern BIOS boots from a CD-ROM is a bit more complicated (and more powerful). CD-ROMs use a sector size of 2048 bytes instead of 512, and the BIOS can load a much larger boot image from the disk into memory (not just one sector) before transferring control to it. For more information, see the ["El Torito" Bootable CD-ROM Format Specification][15].
-
-For 6.828, however, we will use the conventional hard drive boot mechanism, which means that our boot loader must fit into a measly 512 bytes. The boot loader consists of one assembly language source file, `boot/boot.S`, and one C source file, `boot/main.c` Look through these source files carefully and make sure you understand what's going on. The boot loader must perform two main functions:
-
- 1. First, the boot loader switches the processor from real mode to _32-bit protected mode_ , because it is only in this mode that software can access all the memory above 1MB in the processor's physical address space. Protected mode is described briefly in sections 1.2.7 and 1.2.8 of [PC Assembly Language][6], and in great detail in the Intel architecture manuals. At this point you only have to understand that translation of segmented addresses (segment:offset pairs) into physical addresses happens differently in protected mode, and that after the transition offsets are 32 bits instead of 16.
- 2. Second, the boot loader reads the kernel from the hard disk by directly accessing the IDE disk device registers via the x86's special I/O instructions. If you would like to understand better what the particular I/O instructions here mean, check out the "IDE hard drive controller" section on [the 6.828 reference page][8]. You will not need to learn much about programming specific devices in this class: writing device drivers is in practice a very important part of OS development, but from a conceptual or architectural viewpoint it is also one of the least interesting.
-
-
-
-After you understand the boot loader source code, look at the file `obj/boot/boot.asm`. This file is a disassembly of the boot loader that our GNUmakefile creates _after_ compiling the boot loader. This disassembly file makes it easy to see exactly where in physical memory all of the boot loader's code resides, and makes it easier to track what's happening while stepping through the boot loader in GDB. Likewise, `obj/kern/kernel.asm` contains a disassembly of the JOS kernel, which can often be useful for debugging.
-
-You can set address breakpoints in GDB with the `b` command. For example, b *0x7c00 sets a breakpoint at address 0x7C00. Once at a breakpoint, you can continue execution using the c and si commands: c causes QEMU to continue execution until the next breakpoint (or until you press Ctrl-C in GDB), and si _N_ steps through the instructions _`N`_ at a time.
-
-To examine instructions in memory (besides the immediate next one to be executed, which GDB prints automatically), you use the x/i command. This command has the syntax x/ _N_ i _ADDR_ , where _N_ is the number of consecutive instructions to disassemble and _ADDR_ is the memory address at which to start disassembling.
-
-Exercise 3. Take a look at the [lab tools guide][16], especially the section on GDB commands. Even if you're familiar with GDB, this includes some esoteric GDB commands that are useful for OS work.
-
-Set a breakpoint at address 0x7c00, which is where the boot sector will be loaded. Continue execution until that breakpoint. Trace through the code in `boot/boot.S`, using the source code and the disassembly file `obj/boot/boot.asm` to keep track of where you are. Also use the `x/i` command in GDB to disassemble sequences of instructions in the boot loader, and compare the original boot loader source code with both the disassembly in `obj/boot/boot.asm` and GDB.
-
-Trace into `bootmain()` in `boot/main.c`, and then into `readsect()`. Identify the exact assembly instructions that correspond to each of the statements in `readsect()`. Trace through the rest of `readsect()` and back out into `bootmain()`, and identify the begin and end of the `for` loop that reads the remaining sectors of the kernel from the disk. Find out what code will run when the loop is finished, set a breakpoint there, and continue to that breakpoint. Then step through the remainder of the boot loader.
-
-Be able to answer the following questions:
-
- * At what point does the processor start executing 32-bit code? What exactly causes the switch from 16- to 32-bit mode?
- * What is the _last_ instruction of the boot loader executed, and what is the _first_ instruction of the kernel it just loaded?
- * _Where_ is the first instruction of the kernel?
- * How does the boot loader decide how many sectors it must read in order to fetch the entire kernel from disk? Where does it find this information?
-
-
-
-##### Loading the Kernel
-
-We will now look in further detail at the C language portion of the boot loader, in `boot/main.c`. But before doing so, this is a good time to stop and review some of the basics of C programming.
-
-Exercise 4. Read about programming with pointers in C. The best reference for the C language is _The C Programming Language_ by Brian Kernighan and Dennis Ritchie (known as 'K &R'). We recommend that students purchase this book (here is an [Amazon Link][17]) or find one of [MIT's 7 copies][18].
-
-Read 5.1 (Pointers and Addresses) through 5.5 (Character Pointers and Functions) in K&R. Then download the code for [pointers.c][19], run it, and make sure you understand where all of the printed values come from. In particular, make sure you understand where the pointer addresses in printed lines 1 and 6 come from, how all the values in printed lines 2 through 4 get there, and why the values printed in line 5 are seemingly corrupted.
-
-There are other references on pointers in C (e.g., [A tutorial by Ted Jensen][20] that cites K&R heavily), though not as strongly recommended.
-
-_Warning:_ Unless you are already thoroughly versed in C, do not skip or even skim this reading exercise. If you do not really understand pointers in C, you will suffer untold pain and misery in subsequent labs, and then eventually come to understand them the hard way. Trust us; you don't want to find out what "the hard way" is.
-
-To make sense out of `boot/main.c` you'll need to know what an ELF binary is. When you compile and link a C program such as the JOS kernel, the compiler transforms each C source ('`.c`') file into an _object_ ('`.o`') file containing assembly language instructions encoded in the binary format expected by the hardware. The linker then combines all of the compiled object files into a single _binary image_ such as `obj/kern/kernel`, which in this case is a binary in the ELF format, which stands for "Executable and Linkable Format".
-
-Full information about this format is available in [the ELF specification][21] on [our reference page][8], but you will not need to delve very deeply into the details of this format in this class. Although as a whole the format is quite powerful and complex, most of the complex parts are for supporting dynamic loading of shared libraries, which we will not do in this class. The [Wikipedia page][22] has a short description.
-
-For purposes of 6.828, you can consider an ELF executable to be a header with loading information, followed by several _program sections_ , each of which is a contiguous chunk of code or data intended to be loaded into memory at a specified address. The boot loader does not modify the code or data; it loads it into memory and starts executing it.
-
-An ELF binary starts with a fixed-length _ELF header_ , followed by a variable-length _program header_ listing each of the program sections to be loaded. The C definitions for these ELF headers are in `inc/elf.h`. The program sections we're interested in are:
-
- * `.text`: The program's executable instructions.
- * `.rodata`: Read-only data, such as ASCII string constants produced by the C compiler. (We will not bother setting up the hardware to prohibit writing, however.)
- * `.data`: The data section holds the program's initialized data, such as global variables declared with initializers like `int x = 5;`.
-
-
-
-When the linker computes the memory layout of a program, it reserves space for _uninitialized_ global variables, such as `int x;`, in a section called `.bss` that immediately follows `.data` in memory. C requires that "uninitialized" global variables start with a value of zero. Thus there is no need to store contents for `.bss` in the ELF binary; instead, the linker records just the address and size of the `.bss` section. The loader or the program itself must arrange to zero the `.bss` section.
-
-Examine the full list of the names, sizes, and link addresses of all the sections in the kernel executable by typing:
-
-```
-athena% objdump -h obj/kern/kernel
-
-(If you compiled your own toolchain, you may need to use i386-jos-elf-objdump)
-
-```
-
-You will see many more sections than the ones we listed above, but the others are not important for our purposes. Most of the others are to hold debugging information, which is typically included in the program's executable file but not loaded into memory by the program loader.
-
-Take particular note of the "VMA" (or _link address_ ) and the "LMA" (or _load address_ ) of the `.text` section. The load address of a section is the memory address at which that section should be loaded into memory.
-
-The link address of a section is the memory address from which the section expects to execute. The linker encodes the link address in the binary in various ways, such as when the code needs the address of a global variable, with the result that a binary usually won't work if it is executing from an address that it is not linked for. (It is possible to generate _position-independent_ code that does not contain any such absolute addresses. This is used extensively by modern shared libraries, but it has performance and complexity costs, so we won't be using it in 6.828.)
-
-Typically, the link and load addresses are the same. For example, look at the `.text` section of the boot loader:
-
-```
-athena% objdump -h obj/boot/boot.out
-
-```
-
-The boot loader uses the ELF _program headers_ to decide how to load the sections. The program headers specify which parts of the ELF object to load into memory and the destination address each should occupy. You can inspect the program headers by typing:
-
-```
-athena% objdump -x obj/kern/kernel
-
-```
-
-The program headers are then listed under "Program Headers" in the output of objdump. The areas of the ELF object that need to be loaded into memory are those that are marked as "LOAD". Other information for each program header is given, such as the virtual address ("vaddr"), the physical address ("paddr"), and the size of the loaded area ("memsz" and "filesz").
-
-Back in boot/main.c, the `ph->p_pa` field of each program header contains the segment's destination physical address (in this case, it really is a physical address, though the ELF specification is vague on the actual meaning of this field).
-
-The BIOS loads the boot sector into memory starting at address 0x7c00, so this is the boot sector's load address. This is also where the boot sector executes from, so this is also its link address. We set the link address by passing `-Ttext 0x7C00` to the linker in `boot/Makefrag`, so the linker will produce the correct memory addresses in the generated code.
-
-Exercise 5. Trace through the first few instructions of the boot loader again and identify the first instruction that would "break" or otherwise do the wrong thing if you were to get the boot loader's link address wrong. Then change the link address in `boot/Makefrag` to something wrong, run make clean, recompile the lab with make, and trace into the boot loader again to see what happens. Don't forget to change the link address back and make clean again afterward!
-
-Look back at the load and link addresses for the kernel. Unlike the boot loader, these two addresses aren't the same: the kernel is telling the boot loader to load it into memory at a low address (1 megabyte), but it expects to execute from a high address. We'll dig in to how we make this work in the next section.
-
-Besides the section information, there is one more field in the ELF header that is important to us, named `e_entry`. This field holds the link address of the _entry point_ in the program: the memory address in the program's text section at which the program should begin executing. You can see the entry point:
-
-```
-athena% objdump -f obj/kern/kernel
-
-```
-
-You should now be able to understand the minimal ELF loader in `boot/main.c`. It reads each section of the kernel from disk into memory at the section's load address and then jumps to the kernel's entry point.
-
-Exercise 6. We can examine memory using GDB's x command. The [GDB manual][23] has full details, but for now, it is enough to know that the command x/ _N_ x _ADDR_ prints _`N`_ words of memory at _`ADDR`_. (Note that both '`x`'s in the command are lowercase.) _Warning_ : The size of a word is not a universal standard. In GNU assembly, a word is two bytes (the 'w' in xorw, which stands for word, means 2 bytes).
-
-Reset the machine (exit QEMU/GDB and start them again). Examine the 8 words of memory at 0x00100000 at the point the BIOS enters the boot loader, and then again at the point the boot loader enters the kernel. Why are they different? What is there at the second breakpoint? (You do not really need to use QEMU to answer this question. Just think.)
-
-#### Part 3: The Kernel
-
-We will now start to examine the minimal JOS kernel in a bit more detail. (And you will finally get to write some code!). Like the boot loader, the kernel begins with some assembly language code that sets things up so that C language code can execute properly.
-
-##### Using virtual memory to work around position dependence
-
-When you inspected the boot loader's link and load addresses above, they matched perfectly, but there was a (rather large) disparity between the _kernel's_ link address (as printed by objdump) and its load address. Go back and check both and make sure you can see what we're talking about. (Linking the kernel is more complicated than the boot loader, so the link and load addresses are at the top of `kern/kernel.ld`.)
-
-Operating system kernels often like to be linked and run at very high _virtual address_ , such as 0xf0100000, in order to leave the lower part of the processor's virtual address space for user programs to use. The reason for this arrangement will become clearer in the next lab.
-
-Many machines don't have any physical memory at address 0xf0100000, so we can't count on being able to store the kernel there. Instead, we will use the processor's memory management hardware to map virtual address 0xf0100000 (the link address at which the kernel code _expects_ to run) to physical address 0x00100000 (where the boot loader loaded the kernel into physical memory). This way, although the kernel's virtual address is high enough to leave plenty of address space for user processes, it will be loaded in physical memory at the 1MB point in the PC's RAM, just above the BIOS ROM. This approach requires that the PC have at least a few megabytes of physical memory (so that physical address 0x00100000 works), but this is likely to be true of any PC built after about 1990.
-
-In fact, in the next lab, we will map the _entire_ bottom 256MB of the PC's physical address space, from physical addresses 0x00000000 through 0x0fffffff, to virtual addresses 0xf0000000 through 0xffffffff respectively. You should now see why JOS can only use the first 256MB of physical memory.
-
-For now, we'll just map the first 4MB of physical memory, which will be enough to get us up and running. We do this using the hand-written, statically-initialized page directory and page table in `kern/entrypgdir.c`. For now, you don't have to understand the details of how this works, just the effect that it accomplishes. Up until `kern/entry.S` sets the `CR0_PG` flag, memory references are treated as physical addresses (strictly speaking, they're linear addresses, but boot/boot.S set up an identity mapping from linear addresses to physical addresses and we're never going to change that). Once `CR0_PG` is set, memory references are virtual addresses that get translated by the virtual memory hardware to physical addresses. `entry_pgdir` translates virtual addresses in the range 0xf0000000 through 0xf0400000 to physical addresses 0x00000000 through 0x00400000, as well as virtual addresses 0x00000000 through 0x00400000 to physical addresses 0x00000000 through 0x00400000. Any virtual address that is not in one of these two ranges will cause a hardware exception which, since we haven't set up interrupt handling yet, will cause QEMU to dump the machine state and exit (or endlessly reboot if you aren't using the 6.828-patched version of QEMU).
-
-Exercise 7. Use QEMU and GDB to trace into the JOS kernel and stop at the `movl %eax, %cr0`. Examine memory at 0x00100000 and at 0xf0100000. Now, single step over that instruction using the stepi GDB command. Again, examine memory at 0x00100000 and at 0xf0100000. Make sure you understand what just happened.
-
-What is the first instruction _after_ the new mapping is established that would fail to work properly if the mapping weren't in place? Comment out the `movl %eax, %cr0` in `kern/entry.S`, trace into it, and see if you were right.
-
-##### Formatted Printing to the Console
-
-Most people take functions like `printf()` for granted, sometimes even thinking of them as "primitives" of the C language. But in an OS kernel, we have to implement all I/O ourselves.
-
-Read through `kern/printf.c`, `lib/printfmt.c`, and `kern/console.c`, and make sure you understand their relationship. It will become clear in later labs why `printfmt.c` is located in the separate `lib` directory.
-
-Exercise 8. We have omitted a small fragment of code - the code necessary to print octal numbers using patterns of the form "%o". Find and fill in this code fragment.
-
-Be able to answer the following questions:
-
- 1. Explain the interface between `printf.c` and `console.c`. Specifically, what function does `console.c` export? How is this function used by `printf.c`?
-
- 2. Explain the following from `console.c`:
-```
- 1 if (crt_pos >= CRT_SIZE) {
- 2 int i;
- 3 memmove(crt_buf, crt_buf + CRT_COLS, (CRT_SIZE - CRT_COLS) 选题模板.txt 中文排版指北.md comic core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LCTT翻译规范.md LICENSE Makefile published README.md sign.md sources translated sizeof(uint16_t));
- 4 for (i = CRT_SIZE - CRT_COLS; i < CRT_SIZE; i++)
- 5 crt_buf[i] = 0x0700 | ' ';
- 6 crt_pos -= CRT_COLS;
- 7 }
-
-```
-
- 3. For the following questions you might wish to consult the notes for Lecture 2. These notes cover GCC's calling convention on the x86.
-
-Trace the execution of the following code step-by-step:
-```
- int x = 1, y = 3, z = 4;
- cprintf("x %d, y %x, z %d\n", x, y, z);
-
-```
-
- * In the call to `cprintf()`, to what does `fmt` point? To what does `ap` point?
- * List (in order of execution) each call to `cons_putc`, `va_arg`, and `vcprintf`. For `cons_putc`, list its argument as well. For `va_arg`, list what `ap` points to before and after the call. For `vcprintf` list the values of its two arguments.
- 4. Run the following code.
-```
- unsigned int i = 0x00646c72;
- cprintf("H%x Wo%s", 57616, &i);
-
-```
-
-What is the output? Explain how this output is arrived at in the step-by-step manner of the previous exercise. [Here's an ASCII table][24] that maps bytes to characters.
-
-The output depends on that fact that the x86 is little-endian. If the x86 were instead big-endian what would you set `i` to in order to yield the same output? Would you need to change `57616` to a different value?
-
-[Here's a description of little- and big-endian][25] and [a more whimsical description][26].
-
- 5. In the following code, what is going to be printed after `'y='`? (note: the answer is not a specific value.) Why does this happen?
-```
- cprintf("x=%d y=%d", 3);
-
-```
-
- 6. Let's say that GCC changed its calling convention so that it pushed arguments on the stack in declaration order, so that the last argument is pushed last. How would you have to change `cprintf` or its interface so that it would still be possible to pass it a variable number of arguments?
-
-
-
-
-Challenge Enhance the console to allow text to be printed in different colors. The traditional way to do this is to make it interpret [ANSI escape sequences][27] embedded in the text strings printed to the console, but you may use any mechanism you like. There is plenty of information on [the 6.828 reference page][8] and elsewhere on the web on programming the VGA display hardware. If you're feeling really adventurous, you could try switching the VGA hardware into a graphics mode and making the console draw text onto the graphical frame buffer.
-
-##### The Stack
-
-In the final exercise of this lab, we will explore in more detail the way the C language uses the stack on the x86, and in the process write a useful new kernel monitor function that prints a _backtrace_ of the stack: a list of the saved Instruction Pointer (IP) values from the nested `call` instructions that led to the current point of execution.
-
-Exercise 9. Determine where the kernel initializes its stack, and exactly where in memory its stack is located. How does the kernel reserve space for its stack? And at which "end" of this reserved area is the stack pointer initialized to point to?
-
-The x86 stack pointer (`esp` register) points to the lowest location on the stack that is currently in use. Everything _below_ that location in the region reserved for the stack is free. Pushing a value onto the stack involves decreasing the stack pointer and then writing the value to the place the stack pointer points to. Popping a value from the stack involves reading the value the stack pointer points to and then increasing the stack pointer. In 32-bit mode, the stack can only hold 32-bit values, and esp is always divisible by four. Various x86 instructions, such as `call`, are "hard-wired" to use the stack pointer register.
-
-The `ebp` (base pointer) register, in contrast, is associated with the stack primarily by software convention. On entry to a C function, the function's _prologue_ code normally saves the previous function's base pointer by pushing it onto the stack, and then copies the current `esp` value into `ebp` for the duration of the function. If all the functions in a program obey this convention, then at any given point during the program's execution, it is possible to trace back through the stack by following the chain of saved `ebp` pointers and determining exactly what nested sequence of function calls caused this particular point in the program to be reached. This capability can be particularly useful, for example, when a particular function causes an `assert` failure or `panic` because bad arguments were passed to it, but you aren't sure _who_ passed the bad arguments. A stack backtrace lets you find the offending function.
-
-Exercise 10. To become familiar with the C calling conventions on the x86, find the address of the `test_backtrace` function in `obj/kern/kernel.asm`, set a breakpoint there, and examine what happens each time it gets called after the kernel starts. How many 32-bit words does each recursive nesting level of `test_backtrace` push on the stack, and what are those words?
-
-Note that, for this exercise to work properly, you should be using the patched version of QEMU available on the [tools][4] page or on Athena. Otherwise, you'll have to manually translate all breakpoint and memory addresses to linear addresses.
-
-The above exercise should give you the information you need to implement a stack backtrace function, which you should call `mon_backtrace()`. A prototype for this function is already waiting for you in `kern/monitor.c`. You can do it entirely in C, but you may find the `read_ebp()` function in `inc/x86.h` useful. You'll also have to hook this new function into the kernel monitor's command list so that it can be invoked interactively by the user.
-
-The backtrace function should display a listing of function call frames in the following format:
-
-```
-Stack backtrace:
- ebp f0109e58 eip f0100a62 args 00000001 f0109e80 f0109e98 f0100ed2 00000031
- ebp f0109ed8 eip f01000d6 args 00000000 00000000 f0100058 f0109f28 00000061
- ...
-
-```
-
-Each line contains an `ebp`, `eip`, and `args`. The `ebp` value indicates the base pointer into the stack used by that function: i.e., the position of the stack pointer just after the function was entered and the function prologue code set up the base pointer. The listed `eip` value is the function's _return instruction pointer_ : the instruction address to which control will return when the function returns. The return instruction pointer typically points to the instruction after the `call` instruction (why?). Finally, the five hex values listed after `args` are the first five arguments to the function in question, which would have been pushed on the stack just before the function was called. If the function was called with fewer than five arguments, of course, then not all five of these values will be useful. (Why can't the backtrace code detect how many arguments there actually are? How could this limitation be fixed?)
-
-The first line printed reflects the _currently executing_ function, namely `mon_backtrace` itself, the second line reflects the function that called `mon_backtrace`, the third line reflects the function that called that one, and so on. You should print _all_ the outstanding stack frames. By studying `kern/entry.S` you'll find that there is an easy way to tell when to stop.
-
-Here are a few specific points you read about in K&R Chapter 5 that are worth remembering for the following exercise and for future labs.
-
- * If `int *p = (int*)100`, then `(int)p + 1` and `(int)(p + 1)` are different numbers: the first is `101` but the second is `104`. When adding an integer to a pointer, as in the second case, the integer is implicitly multiplied by the size of the object the pointer points to.
- * `p[i]` is defined to be the same as `*(p+i)`, referring to the i'th object in the memory pointed to by p. The above rule for addition helps this definition work when the objects are larger than one byte.
- * `&p[i]` is the same as `(p+i)`, yielding the address of the i'th object in the memory pointed to by p.
-
-
-
-Although most C programs never need to cast between pointers and integers, operating systems frequently do. Whenever you see an addition involving a memory address, ask yourself whether it is an integer addition or pointer addition and make sure the value being added is appropriately multiplied or not.
-
-Exercise 11. Implement the backtrace function as specified above. Use the same format as in the example, since otherwise the grading script will be confused. When you think you have it working right, run make grade to see if its output conforms to what our grading script expects, and fix it if it doesn't. _After_ you have handed in your Lab 1 code, you are welcome to change the output format of the backtrace function any way you like.
-
-If you use `read_ebp()`, note that GCC may generate "optimized" code that calls `read_ebp()` _before_ `mon_backtrace()`'s function prologue, which results in an incomplete stack trace (the stack frame of the most recent function call is missing). While we have tried to disable optimizations that cause this reordering, you may want to examine the assembly of `mon_backtrace()` and make sure the call to `read_ebp()` is happening after the function prologue.
-
-At this point, your backtrace function should give you the addresses of the function callers on the stack that lead to `mon_backtrace()` being executed. However, in practice you often want to know the function names corresponding to those addresses. For instance, you may want to know which functions could contain a bug that's causing your kernel to crash.
-
-To help you implement this functionality, we have provided the function `debuginfo_eip()`, which looks up `eip` in the symbol table and returns the debugging information for that address. This function is defined in `kern/kdebug.c`.
-
-Exercise 12. Modify your stack backtrace function to display, for each `eip`, the function name, source file name, and line number corresponding to that `eip`.
-
-In `debuginfo_eip`, where do `__STAB_*` come from? This question has a long answer; to help you to discover the answer, here are some things you might want to do:
-
- * look in the file `kern/kernel.ld` for `__STAB_*`
- * run objdump -h obj/kern/kernel
- * run objdump -G obj/kern/kernel
- * run gcc -pipe -nostdinc -O2 -fno-builtin -I. -MD -Wall -Wno-format -DJOS_KERNEL -gstabs -c -S kern/init.c, and look at init.s.
- * see if the bootloader loads the symbol table in memory as part of loading the kernel binary
-
-
-
-Complete the implementation of `debuginfo_eip` by inserting the call to `stab_binsearch` to find the line number for an address.
-
-Add a `backtrace` command to the kernel monitor, and extend your implementation of `mon_backtrace` to call `debuginfo_eip` and print a line for each stack frame of the form:
-
-```
-K> backtrace
-Stack backtrace:
- ebp f010ff78 eip f01008ae args 00000001 f010ff8c 00000000 f0110580 00000000
- kern/monitor.c:143: monitor+106
- ebp f010ffd8 eip f0100193 args 00000000 00001aac 00000660 00000000 00000000
- kern/init.c:49: i386_init+59
- ebp f010fff8 eip f010003d args 00000000 00000000 0000ffff 10cf9a00 0000ffff
- kern/entry.S:70: +0
-K>
-
-```
-
-Each line gives the file name and line within that file of the stack frame's `eip`, followed by the name of the function and the offset of the `eip` from the first instruction of the function (e.g., `monitor+106` means the return `eip` is 106 bytes past the beginning of `monitor`).
-
-Be sure to print the file and function names on a separate line, to avoid confusing the grading script.
-
-Tip: printf format strings provide an easy, albeit obscure, way to print non-null-terminated strings like those in STABS tables. `printf("%.*s", length, string)` prints at most `length` characters of `string`. Take a look at the printf man page to find out why this works.
-
-You may find that some functions are missing from the backtrace. For example, you will probably see a call to `monitor()` but not to `runcmd()`. This is because the compiler in-lines some function calls. Other optimizations may cause you to see unexpected line numbers. If you get rid of the `-O2` from `GNUMakefile`, the backtraces may make more sense (but your kernel will run more slowly).
-
-**This completes the lab.** In the `lab` directory, commit your changes with git commit and type make handin to submit your code.
-
---------------------------------------------------------------------------------
-
-via: https://pdos.csail.mit.edu/6.828/2018/labs/lab1/
-
-作者:[csail.mit][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:
-[b]: https://github.com/lujun9972
-[1]: http://www.git-scm.com/
-[2]: http://www.kernel.org/pub/software/scm/git/docs/user-manual.html
-[3]: http://eagain.net/articles/git-for-computer-scientists/
-[4]: https://pdos.csail.mit.edu/6.828/2018/tools.html
-[5]: https://6828.scripts.mit.edu/2018/handin.py/
-[6]: https://pdos.csail.mit.edu/6.828/2018/readings/pcasm-book.pdf
-[7]: http://www.delorie.com/djgpp/doc/brennan/brennan_att_inline_djgpp.html
-[8]: https://pdos.csail.mit.edu/6.828/2018/reference.html
-[9]: https://pdos.csail.mit.edu/6.828/2018/readings/i386/toc.htm
-[10]: http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html
-[11]: http://developer.amd.com/resources/developer-guides-manuals/
-[12]: http://www.qemu.org/
-[13]: http://www.gnu.org/software/gdb/
-[14]: http://web.archive.org/web/20040404164813/members.iweb.net.au/~pstorr/pcbook/book2/book2.htm
-[15]: https://pdos.csail.mit.edu/6.828/2018/readings/boot-cdrom.pdf
-[16]: https://pdos.csail.mit.edu/6.828/2018/labguide.html
-[17]: http://www.amazon.com/C-Programming-Language-2nd/dp/0131103628/sr=8-1/qid=1157812738/ref=pd_bbs_1/104-1502762-1803102?ie=UTF8&s=books
-[18]: http://library.mit.edu/F/AI9Y4SJ2L5ELEE2TAQUAAR44XV5RTTQHE47P9MKP5GQDLR9A8X-10422?func=item-global&doc_library=MIT01&doc_number=000355242&year=&volume=&sub_library=
-[19]: https://pdos.csail.mit.edu/6.828/2018/labs/lab1/pointers.c
-[20]: https://pdos.csail.mit.edu/6.828/2018/readings/pointers.pdf
-[21]: https://pdos.csail.mit.edu/6.828/2018/readings/elf.pdf
-[22]: http://en.wikipedia.org/wiki/Executable_and_Linkable_Format
-[23]: https://sourceware.org/gdb/current/onlinedocs/gdb/Memory.html
-[24]: http://web.cs.mun.ca/~michael/c/ascii-table.html
-[25]: http://www.webopedia.com/TERM/b/big_endian.html
-[26]: http://www.networksorcery.com/enp/ien/ien137.txt
-[27]: http://rrbrandt.dee.ufcg.edu.br/en/docs/ansi/
diff --git a/sources/tech/20180914 Convert files at the command line with Pandoc.md b/sources/tech/20180914 Convert files at the command line with Pandoc.md
deleted file mode 100644
index e2ae10bdfa..0000000000
--- a/sources/tech/20180914 Convert files at the command line with Pandoc.md
+++ /dev/null
@@ -1,396 +0,0 @@
-Translating by jlztan
-
-Convert files at the command line with Pandoc
-======
-
-This guide shows you how to use Pandoc to convert your documents into many different file formats
-
-
-
-Pandoc is a command-line tool for converting files from one markup language to another. Markup languages use tags to annotate sections of a document. Commonly used markup languages include Markdown, ReStructuredText, HTML, LaTex, ePub, and Microsoft Word DOCX.
-
-In plain English, [Pandoc][1] allows you to convert a bunch of files from one markup language into another one. Typical examples include converting a Markdown file into a presentation, LaTeX, PDF, or even ePub.
-
-This article will explain how to produce documentation in multiple formats from a single markup language (in this case Markdown) using Pandoc. It will guide you through Pandoc installation, show how to create several types of documents, and offer tips on how to write documentation that is easy to port to other formats. It will also explain the value of using meta-information files to create a separation between the content and the meta-information (e.g., author name, template used, bibliographic style, etc.) of your documentation.
-
-### Installation and requirements
-
-Pandoc is installed by default in most Linux distributions. This tutorial uses pandoc-2.2.3.2 and pandoc-citeproc-0.14.3. If you don't intend to generate PDFs, those two packages are enough. However, I recommend installing texlive as well, so you have the option to generate PDFs.
-
-To install these programs on Linux, type the following on the command line:
-
-```
-sudo apt-get install pandoc pandoc-citeproc texlive
-```
-
-You can find [installation instructions][2] for other platforms on Pandoc's website.
-
-I highly recommend installing [pandoc][3][-crossref][3], a "filter for numbering figures, equations, tables, and cross-references to them." The easiest option is to download a [prebuilt executable][4], but you can install it from Haskell's package manager, cabal, by typing:
-
-```
-cabal update
-cabal install pandoc-crossref
-```
-
-Consult pandoc-crossref's GitHub repository if you need additional Haskell [installation information][5].
-
-### Some examples
-
-I'll demonstrate how Pandoc works by explaining how to produce three types of documents:
-
- * A website from a LaTeX file containing math formulas
- * A Reveal.js slideshow from a Markdown file
- * A contract agreement document that mixes Markdown and LaTeX
-
-
-
-#### Create a website with math formulas
-
-One of the ways Pandoc excels is displaying math formulas in different output file formats. For instance, let's generate a website from a LaTeX document (named math.tex) containing some math symbols (written in LaTeX).
-
-The math.tex document looks like:
-
-```
-% Pandoc math demos
-
-$a^2 + b^2 = c^2$
-
-$v(t) = v_0 + \frac{1}{2}at^2$
-
-$\gamma = \frac{1}{\sqrt{1 - v^2/c^2}}$
-
-$\exists x \forall y (Rxy \equiv Ryx)$
-
-$p \wedge q \models p$
-
-$\Box\diamond p\equiv\diamond p$
-
-$\int_{0}^{1} x dx = \left[ \frac{1}{2}x^2 \right]_{0}^{1} = \frac{1}{2}$
-
-$e^x = \sum_{n=0}^\infty \frac{x^n}{n!} = \lim_{n\rightarrow\infty} (1+x/n)^n$
-```
-
-Convert the LaTeX document into a website named mathMathML.html by entering the following command:
-
-```
-pandoc math.tex -s --mathml -o mathMathML.html
-```
-
-The flag **-s** tells Pandoc to generate a standalone website (instead of a fragment, so it will include the head and body HTML tags), and the **–mathml** flag forces Pandoc to convert the math in LaTeX to MathML, which can be rendered by modern browsers.
-
-
-
-Take a look at the [website result][6] and the [code][7]; the code repository contains a Makefile to make things even simpler.
-
-#### Make a Reveal.js slideshow
-
-It's easy to generate simple presentations from a Markdown file using Pandoc. The slides contain top-level slides and nested slides underneath. The presentation can be controlled from the keyboard, and you can jump from one top-level slide to the next top-level slide or show the nested slides on a per-top-level basis. This structure is typical in HTML-based presentation frameworks.
-
-Let's create a slide document named SLIDES (see the [code repository][8]). First, add the slides' meta-information (e.g., title, author, and date) prepended by the **%** symbol:
-
-```
-% Case Study
-% Kiko Fernandez Reyes
-% Sept 27, 2017
-```
-
-This meta-information also creates the first slide. To add more slides, declare top-level slides using Markdown heading H1 (line 5 in the example below, [heading 1 in Markdown][9] , designated by).
-
-For example, if we want to create a presentation with the title Case Study that starts with a top-level slide titled Wine Management System, write:
-
-```
-% Case Study
-% Kiko Fernandez Reyes
-% Sept 27, 2017
-
-# Wine Management System
-```
-
-To put content (such as slides that explain a new management system and its implementation) inside this top-level section, use a Markdown header H2. Let's add two more slides (lines 7 and 14 below, [heading 2 in Markdown][9], designated by **##** ):
-
- * The first second-level slide has the title Idea and shows an image of the Swiss flag
- * The second second-level slide has the title Implementation
-
-
-
-```
-% Case Study
-% Kiko Fernandez Reyes
-% Sept 27, 2017
-
-# Wine Management System
-
-## Idea
-
-## Implementation
-```
-
-We now have a top-level slide ( **# Wine Management System** ) that contains two slides ( **## Idea** and **## Implementation** ).
-
-Let's put some content in these two slides using incremental bulleted lists by creating a Markdown list prepended by the symbol **>**. Continuing from above, add two items in the first slide (lines 9–10 below) and five items in the second slide (lines 16–20):
-
-```
-% Case Study
-% Kiko Fernandez Reyes
-% Sept 27, 2017
-
-# Wine Management System
-
-## Idea
-
->- Swiss love their **wine** and cheese
->- Create a *simple* wine tracker system
-
-
-
-## Implementation
-
->- Bottles have a RFID tag
->- RFID reader (emits and read signal)
->- **Raspberry Pi**
->- **Server (online shop)**
->- Mobile app
-```
-
-We added an image of the Matterhorn mountain. Your slides can be improved by using plain Markdown or adding plain HTML.
-
-To generate the slides, Pandoc needs to point to the Reveal.js library, so it must be in the same folder as the SLIDES file. The command to generate the slides is:
-
-```
-pandoc -t revealjs -s --self-contained SLIDES \
--V theme=white -V slideNumber=true -o index.html
-```
-
-
-
-The above Pandoc command uses the following flags:
-
- * **-t revealjs** specifies we are going to output a **revealjs** presentation
- * **-s** tells Pandoc to generate a standalone document
- * **\--self-contained** produces HTML with no external dependencies
- * **-V** sets the following variables:
-– **theme=white** sets the theme of the slideshow to **white**
-– **slideNumber=true** shows the slide number
- * **-o index.html** generates the slides in the file named **index.html**
-
-
-
-To make things simpler and avoid typing this long command, create the following Makefile:
-
-```
-all: generate
-
-generate:
- pandoc -t revealjs -s --self-contained SLIDES \
- -V theme=white -V slideNumber=true -o index.html
-
-clean: index.html
- rm index.html
-
-.PHONY: all clean generate
-```
-
-You can find all the code in [this repository][8].
-
-#### Make a multi-format contract
-
-Let's say you are preparing a document and (as things are nowadays) some people want it in Microsoft Word format, others use free software and would like an ODT, and others need a PDF. You do not have to use OpenOffice nor LibreOffice to generate the DOCX or PDF file. You can create your document in Markdown (with some bits of LaTeX if you need advanced formatting) and generate any of these file types.
-
-As before, begin by declaring the document's meta-information (title, author, and date):
-
-```
-% Contract Agreement for Software X
-% Kiko Fernandez-Reyes
-% August 28th, 2018
-```
-
-Then write the document in Markdown (and add LaTeX if you require advanced formatting). For example, create a table that needs fixed separation space (declared in LaTeX with **\hspace{3cm}** ) and a line where a client and a contractor should sign (declared in LaTeX with **\hrulefill** ). After that, add a table written in Markdown.
-
-Here's what the document will look like:
-
-
-
-The code to create this document is:
-
-```
-% Contract Agreement for Software X
-% Kiko Fernandez-Reyes
-% August 28th, 2018
-
-...
-
-### Work Order
-
-\begin{table}[h]
-\begin{tabular}{ccc}
-The Contractor & \hspace{3cm} & The Customer \\
-& & \\
-& & \\
-\hrulefill & \hspace{3cm} & \hrulefill \\
-%
-Name & \hspace{3cm} & Name \\
-& & \\
-& & \\
-\hrulefill & \hspace{3cm} & \hrulefill \\
-...
-\end{tabular}
-\end{table}
-
-\vspace{1cm}
-
-+--------------------------------------------|----------|-------------+
-| Type of Service | Cost | Total |
-+:===========================================+=========:+:===========:+
-| Game Engine | 70.0 | 70.0 |
-| | | |
-+--------------------------------------------|----------|-------------+
-| | | |
-+--------------------------------------------|----------|-------------+
-| Extra: Comply with defined API functions | 10.0 | 10.0 |
-| and expected returned format | | |
-+--------------------------------------------|----------|-------------+
-| | | |
-+--------------------------------------------|----------|-------------+
-| **Total Cost** | | **80.0** |
-+--------------------------------------------|----------|-------------+
-```
-
-To generate the three different output formats needed for this document, write a Makefile:
-
-```
-DOCS=contract-agreement.md
-
-all: $(DOCS)
- pandoc -s $(DOCS) -o $(DOCS:md=pdf)
- pandoc -s $(DOCS) -o $(DOCS:md=docx)
- pandoc -s $(DOCS) -o $(DOCS:md=odt)
-
-clean:
- rm *.pdf *.docx *.odt
-
-.PHONY: all clean
-```
-
-Lines 4–7 contain the commands to generate the different outputs.
-
-If you have several Markdown files and want to merge them into one document, issue a command with the files in the order you want them to appear. For example, when writing this article, I created three documents: an introduction document, three examples, and some advanced uses. The following tells Pandoc to merge these files together in the specified order and produce a PDF named document.pdf.
-
-```
-pandoc -s introduction.md examples.md advanced-uses.md -o document.pdf
-```
-
-### Templates and meta-information
-
-Writing a complex document is no easy task. You need to stick to a set of rules that are independent from your content, such as using a specific template, writing an abstract, embedding specific fonts, and maybe even declaring keywords. All of this has nothing to do with your content: simply put, it is meta-information.
-
-Pandoc uses templates to generate different output formats. There is a template for LaTeX, another for ePub, etc. These templates have unfulfilled variables that are set with the meta-information given to Pandoc. To find out what meta-information is available in a Pandoc template, type:
-
-```
-pandoc -D FORMAT
-```
-
-For example, the template for LaTeX would be:
-
-```
-pandoc -D latex
-```
-
-Which outputs something along these lines:
-
-```
-$if(title)$
-\title{$title$$if(thanks)$\thanks{$thanks$}$endif$}
-$endif$
-$if(subtitle)$
-\providecommand{\subtitle}[1]{}
-\subtitle{$subtitle$}
-$endif$
-$if(author)$
-\author{$for(author)$$author$$sep$ \and $endfor$}
-$endif$
-$if(institute)$
-\providecommand{\institute}[1]{}
-\institute{$for(institute)$$institute$$sep$ \and $endfor$}
-$endif$
-\date{$date$}
-$if(beamer)$
-$if(titlegraphic)$
-\titlegraphic{\includegraphics{$titlegraphic$}}
-$endif$
-$if(logo)$
-\logo{\includegraphics{$logo$}}
-$endif$
-$endif$
-
-\begin{document}
-```
-
-As you can see, there are **title** , **thanks** , **author** , **subtitle** , and **institute** template variables (and many others are available). These are easily set using YAML metablocks. In lines 1–5 of the example below, we declare a YAML metablock and set some of those variables (using the contract agreement example above):
-
-```
----
-title: Contract Agreement for Software X
-author: Kiko Fernandez-Reyes
-date: August 28th, 2018
----
-
-(continue writing document as in the previous example)
-```
-
-This works like a charm and is equivalent to the previous code:
-
-```
-% Contract Agreement for Software X
-% Kiko Fernandez-Reyes
-% August 28th, 2018
-```
-
-However, this ties the meta-information to the content; i.e., Pandoc will always use this information to output files in the new format. If you know you need to produce multiple file formats, you better be careful. For example, what if you need to produce the contract in ePub and in HTML, and the ePub and HTML need specific and different styling rules?
-
-Let's consider the cases:
-
- * If you simply try to embed the YAML variable **css: style-epub.css** , you would be excluding the one from the HTML version. This does not work.
- * Duplicating the document is obviously not a good solution either, as changes in one version would not be in sync with the other copy.
- * You can add variables to the Pandoc command line as follows:
-
-
-
-```
-pandoc -s -V css=style-epub.css document.md document.epub
-pandoc -s -V css=style-html.css document.md document.html
-```
-
-My opinion is that it is easy to overlook these variables from the command line, especially when you need to set tens of these (which can happen in complex documents). Now, if you put them all together under the same roof (a meta.yaml file), you only need to update or create a new meta-information file to produce the desired output. You would then write:
-
-```
-pandoc -s meta-pub.yaml document.md document.epub
-pandoc -s meta-html.yaml document.md document.html
-```
-
-This is a much cleaner version, and you can update all the meta-information from a single file without ever having to update the content of your document.
-
-### Wrapping up
-
-With these basic examples, I have shown how Pandoc can do a really good job at converting Markdown documents into other formats.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/9/intro-pandoc
-
-作者:[Kiko Fernandez-Reyes][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://opensource.com/users/kikofernandez
-[1]: https://pandoc.org/
-[2]: http://pandoc.org/installing.html
-[3]: https://hackage.haskell.org/package/pandoc-crossref
-[4]: https://github.com/lierdakil/pandoc-crossref/releases/tag/v0.3.2.1
-[5]: https://github.com/lierdakil/pandoc-crossref#installation
-[6]: http://pandoc.org/demo/mathMathML.html
-[7]: https://github.com/kikofernandez/pandoc-examples/tree/master/math
-[8]: https://github.com/kikofernandez/pandoc-examples/tree/master/slides
-[9]: https://daringfireball.net/projects/markdown/syntax#header
diff --git a/sources/tech/20180927 Lab 2- Memory Management.md b/sources/tech/20180927 Lab 2- Memory Management.md
deleted file mode 100644
index 386bf6ceaf..0000000000
--- a/sources/tech/20180927 Lab 2- Memory Management.md
+++ /dev/null
@@ -1,272 +0,0 @@
-Lab 2: Memory Management
-======
-### Lab 2: Memory Management
-
-#### Introduction
-
-In this lab, you will write the memory management code for your operating system. Memory management has two components.
-
-The first component is a physical memory allocator for the kernel, so that the kernel can allocate memory and later free it. Your allocator will operate in units of 4096 bytes, called _pages_. Your task will be to maintain data structures that record which physical pages are free and which are allocated, and how many processes are sharing each allocated page. You will also write the routines to allocate and free pages of memory.
-
-The second component of memory management is _virtual memory_ , which maps the virtual addresses used by kernel and user software to addresses in physical memory. The x86 hardware's memory management unit (MMU) performs the mapping when instructions use memory, consulting a set of page tables. You will modify JOS to set up the MMU's page tables according to a specification we provide.
-
-##### Getting started
-
-In this and future labs you will progressively build up your kernel. We will also provide you with some additional source. To fetch that source, use Git to commit changes you've made since handing in lab 1 (if any), fetch the latest version of the course repository, and then create a local branch called `lab2` based on our lab2 branch, `origin/lab2`:
-
-```
- athena% cd ~/6.828/lab
- athena% add git
- athena% git pull
- Already up-to-date.
- athena% git checkout -b lab2 origin/lab2
- Branch lab2 set up to track remote branch refs/remotes/origin/lab2.
- Switched to a new branch "lab2"
- athena%
-```
-
-The git checkout -b command shown above actually does two things: it first creates a local branch `lab2` that is based on the `origin/lab2` branch provided by the course staff, and second, it changes the contents of your `lab` directory to reflect the files stored on the `lab2` branch. Git allows switching between existing branches using git checkout _branch-name_ , though you should commit any outstanding changes on one branch before switching to a different one.
-
-You will now need to merge the changes you made in your `lab1` branch into the `lab2` branch, as follows:
-
-```
- athena% git merge lab1
- Merge made by recursive.
- kern/kdebug.c | 11 +++++++++--
- kern/monitor.c | 19 +++++++++++++++++++
- lib/printfmt.c | 7 +++----
- 3 files changed, 31 insertions(+), 6 deletions(-)
- athena%
-```
-
-In some cases, Git may not be able to figure out how to merge your changes with the new lab assignment (e.g. if you modified some of the code that is changed in the second lab assignment). In that case, the git merge command will tell you which files are _conflicted_ , and you should first resolve the conflict (by editing the relevant files) and then commit the resulting files with git commit -a.
-
-Lab 2 contains the following new source files, which you should browse through:
-
- * `inc/memlayout.h`
- * `kern/pmap.c`
- * `kern/pmap.h`
- * `kern/kclock.h`
- * `kern/kclock.c`
-
-
-
-`memlayout.h` describes the layout of the virtual address space that you must implement by modifying `pmap.c`. `memlayout.h` and `pmap.h` define the `PageInfo` structure that you'll use to keep track of which pages of physical memory are free. `kclock.c` and `kclock.h` manipulate the PC's battery-backed clock and CMOS RAM hardware, in which the BIOS records the amount of physical memory the PC contains, among other things. The code in `pmap.c` needs to read this device hardware in order to figure out how much physical memory there is, but that part of the code is done for you: you do not need to know the details of how the CMOS hardware works.
-
-Pay particular attention to `memlayout.h` and `pmap.h`, since this lab requires you to use and understand many of the definitions they contain. You may want to review `inc/mmu.h`, too, as it also contains a number of definitions that will be useful for this lab.
-
-Before beginning the lab, don't forget to add -f 6.828 to get the 6.828 version of QEMU.
-
-##### Lab Requirements
-
-In this lab and subsequent labs, do all of the regular exercises described in the lab and _at least one_ challenge problem. (Some challenge problems are more challenging than others, of course!) Additionally, write up brief answers to the questions posed in the lab and a short (e.g., one or two paragraph) description of what you did to solve your chosen challenge problem. If you implement more than one challenge problem, you only need to describe one of them in the write-up, though of course you are welcome to do more. Place the write-up in a file called `answers-lab2.txt` in the top level of your `lab` directory before handing in your work.
-
-##### Hand-In Procedure
-
-When you are ready to hand in your lab code and write-up, add your `answers-lab2.txt` to the Git repository, commit your changes, and then run make handin.
-
-```
- athena% git add answers-lab2.txt
- athena% git commit -am "my answer to lab2"
- [lab2 a823de9] my answer to lab2
- 4 files changed, 87 insertions(+), 10 deletions(-)
- athena% make handin
-```
-
-As before, we will be grading your solutions with a grading program. You can run make grade in the `lab` directory to test your kernel with the grading program. You may change any of the kernel source and header files you need to in order to complete the lab, but needless to say you must not change or otherwise subvert the grading code.
-
-#### Part 1: Physical Page Management
-
-The operating system must keep track of which parts of physical RAM are free and which are currently in use. JOS manages the PC's physical memory with _page granularity_ so that it can use the MMU to map and protect each piece of allocated memory.
-
-You'll now write the physical page allocator. It keeps track of which pages are free with a linked list of `struct PageInfo` objects (which, unlike xv6, are not embedded in the free pages themselves), each corresponding to a physical page. You need to write the physical page allocator before you can write the rest of the virtual memory implementation, because your page table management code will need to allocate physical memory in which to store page tables.
-
-Exercise 1. In the file `kern/pmap.c`, you must implement code for the following functions (probably in the order given).
-
-`boot_alloc()`
-`mem_init()` (only up to the call to `check_page_free_list(1)`)
-`page_init()`
-`page_alloc()`
-`page_free()`
-
-`check_page_free_list()` and `check_page_alloc()` test your physical page allocator. You should boot JOS and see whether `check_page_alloc()` reports success. Fix your code so that it passes. You may find it helpful to add your own `assert()`s to verify that your assumptions are correct.
-
-This lab, and all the 6.828 labs, will require you to do a bit of detective work to figure out exactly what you need to do. This assignment does not describe all the details of the code you'll have to add to JOS. Look for comments in the parts of the JOS source that you have to modify; those comments often contain specifications and hints. You will also need to look at related parts of JOS, at the Intel manuals, and perhaps at your 6.004 or 6.033 notes.
-
-#### Part 2: Virtual Memory
-
-Before doing anything else, familiarize yourself with the x86's protected-mode memory management architecture: namely _segmentation_ and _page translation_.
-
-Exercise 2. Look at chapters 5 and 6 of the [Intel 80386 Reference Manual][1], if you haven't done so already. Read the sections about page translation and page-based protection closely (5.2 and 6.4). We recommend that you also skim the sections about segmentation; while JOS uses the paging hardware for virtual memory and protection, segment translation and segment-based protection cannot be disabled on the x86, so you will need a basic understanding of it.
-
-##### Virtual, Linear, and Physical Addresses
-
-In x86 terminology, a _virtual address_ consists of a segment selector and an offset within the segment. A _linear address_ is what you get after segment translation but before page translation. A _physical address_ is what you finally get after both segment and page translation and what ultimately goes out on the hardware bus to your RAM.
-
-```
- Selector +--------------+ +-----------+
- ---------->| | | |
- | Segmentation | | Paging |
-Software | |-------->| |----------> RAM
- Offset | Mechanism | | Mechanism |
- ---------->| | | |
- +--------------+ +-----------+
- Virtual Linear Physical
-
-```
-
-A C pointer is the "offset" component of the virtual address. In `boot/boot.S`, we installed a Global Descriptor Table (GDT) that effectively disabled segment translation by setting all segment base addresses to 0 and limits to `0xffffffff`. Hence the "selector" has no effect and the linear address always equals the offset of the virtual address. In lab 3, we'll have to interact a little more with segmentation to set up privilege levels, but as for memory translation, we can ignore segmentation throughout the JOS labs and focus solely on page translation.
-
-Recall that in part 3 of lab 1, we installed a simple page table so that the kernel could run at its link address of 0xf0100000, even though it is actually loaded in physical memory just above the ROM BIOS at 0x00100000. This page table mapped only 4MB of memory. In the virtual address space layout you are going to set up for JOS in this lab, we'll expand this to map the first 256MB of physical memory starting at virtual address 0xf0000000 and to map a number of other regions of the virtual address space.
-
-Exercise 3. While GDB can only access QEMU's memory by virtual address, it's often useful to be able to inspect physical memory while setting up virtual memory. Review the QEMU [monitor commands][2] from the lab tools guide, especially the `xp` command, which lets you inspect physical memory. To access the QEMU monitor, press Ctrl-a c in the terminal (the same binding returns to the serial console).
-
-Use the xp command in the QEMU monitor and the x command in GDB to inspect memory at corresponding physical and virtual addresses and make sure you see the same data.
-
-Our patched version of QEMU provides an info pg command that may also prove useful: it shows a compact but detailed representation of the current page tables, including all mapped memory ranges, permissions, and flags. Stock QEMU also provides an info mem command that shows an overview of which ranges of virtual addresses are mapped and with what permissions.
-
-From code executing on the CPU, once we're in protected mode (which we entered first thing in `boot/boot.S`), there's no way to directly use a linear or physical address. _All_ memory references are interpreted as virtual addresses and translated by the MMU, which means all pointers in C are virtual addresses.
-
-The JOS kernel often needs to manipulate addresses as opaque values or as integers, without dereferencing them, for example in the physical memory allocator. Sometimes these are virtual addresses, and sometimes they are physical addresses. To help document the code, the JOS source distinguishes the two cases: the type `uintptr_t` represents opaque virtual addresses, and `physaddr_t` represents physical addresses. Both these types are really just synonyms for 32-bit integers (`uint32_t`), so the compiler won't stop you from assigning one type to another! Since they are integer types (not pointers), the compiler _will_ complain if you try to dereference them.
-
-The JOS kernel can dereference a `uintptr_t` by first casting it to a pointer type. In contrast, the kernel can't sensibly dereference a physical address, since the MMU translates all memory references. If you cast a `physaddr_t` to a pointer and dereference it, you may be able to load and store to the resulting address (the hardware will interpret it as a virtual address), but you probably won't get the memory location you intended.
-
-To summarize:
-
-C typeAddress type `T*` Virtual `uintptr_t` Virtual `physaddr_t` Physical
-
-Question
-
- 1. Assuming that the following JOS kernel code is correct, what type should variable `x` have, `uintptr_t` or `physaddr_t`?
-
-```
- mystery_t x;
- char* value = return_a_pointer();
- *value = 10;
- x = (mystery_t) value;
-
-```
-
-
-
-
-The JOS kernel sometimes needs to read or modify memory for which it knows only the physical address. For example, adding a mapping to a page table may require allocating physical memory to store a page directory and then initializing that memory. However, the kernel cannot bypass virtual address translation and thus cannot directly load and store to physical addresses. One reason JOS remaps all of physical memory starting from physical address 0 at virtual address 0xf0000000 is to help the kernel read and write memory for which it knows just the physical address. In order to translate a physical address into a virtual address that the kernel can actually read and write, the kernel must add 0xf0000000 to the physical address to find its corresponding virtual address in the remapped region. You should use `KADDR(pa)` to do that addition.
-
-The JOS kernel also sometimes needs to be able to find a physical address given the virtual address of the memory in which a kernel data structure is stored. Kernel global variables and memory allocated by `boot_alloc()` are in the region where the kernel was loaded, starting at 0xf0000000, the very region where we mapped all of physical memory. Thus, to turn a virtual address in this region into a physical address, the kernel can simply subtract 0xf0000000. You should use `PADDR(va)` to do that subtraction.
-
-##### Reference counting
-
-In future labs you will often have the same physical page mapped at multiple virtual addresses simultaneously (or in the address spaces of multiple environments). You will keep a count of the number of references to each physical page in the `pp_ref` field of the `struct PageInfo` corresponding to the physical page. When this count goes to zero for a physical page, that page can be freed because it is no longer used. In general, this count should be equal to the number of times the physical page appears below `UTOP` in all page tables (the mappings above `UTOP` are mostly set up at boot time by the kernel and should never be freed, so there's no need to reference count them). We'll also use it to keep track of the number of pointers we keep to the page directory pages and, in turn, of the number of references the page directories have to page table pages.
-
-Be careful when using `page_alloc`. The page it returns will always have a reference count of 0, so `pp_ref` should be incremented as soon as you've done something with the returned page (like inserting it into a page table). Sometimes this is handled by other functions (for example, `page_insert`) and sometimes the function calling `page_alloc` must do it directly.
-
-##### Page Table Management
-
-Now you'll write a set of routines to manage page tables: to insert and remove linear-to-physical mappings, and to create page table pages when needed.
-
-Exercise 4. In the file `kern/pmap.c`, you must implement code for the following functions.
-
-```
-
- pgdir_walk()
- boot_map_region()
- page_lookup()
- page_remove()
- page_insert()
-
-
-```
-
-`check_page()`, called from `mem_init()`, tests your page table management routines. You should make sure it reports success before proceeding.
-
-#### Part 3: Kernel Address Space
-
-JOS divides the processor's 32-bit linear address space into two parts. User environments (processes), which we will begin loading and running in lab 3, will have control over the layout and contents of the lower part, while the kernel always maintains complete control over the upper part. The dividing line is defined somewhat arbitrarily by the symbol `ULIM` in `inc/memlayout.h`, reserving approximately 256MB of virtual address space for the kernel. This explains why we needed to give the kernel such a high link address in lab 1: otherwise there would not be enough room in the kernel's virtual address space to map in a user environment below it at the same time.
-
-You'll find it helpful to refer to the JOS memory layout diagram in `inc/memlayout.h` both for this part and for later labs.
-
-##### Permissions and Fault Isolation
-
-Since kernel and user memory are both present in each environment's address space, we will have to use permission bits in our x86 page tables to allow user code access only to the user part of the address space. Otherwise bugs in user code might overwrite kernel data, causing a crash or more subtle malfunction; user code might also be able to steal other environments' private data. Note that the writable permission bit (`PTE_W`) affects both user and kernel code!
-
-The user environment will have no permission to any of the memory above `ULIM`, while the kernel will be able to read and write this memory. For the address range `[UTOP,ULIM)`, both the kernel and the user environment have the same permission: they can read but not write this address range. This range of address is used to expose certain kernel data structures read-only to the user environment. Lastly, the address space below `UTOP` is for the user environment to use; the user environment will set permissions for accessing this memory.
-
-##### Initializing the Kernel Address Space
-
-Now you'll set up the address space above `UTOP`: the kernel part of the address space. `inc/memlayout.h` shows the layout you should use. You'll use the functions you just wrote to set up the appropriate linear to physical mappings.
-
-Exercise 5. Fill in the missing code in `mem_init()` after the call to `check_page()`.
-
-Your code should now pass the `check_kern_pgdir()` and `check_page_installed_pgdir()` checks.
-
-Question
-
- 2. What entries (rows) in the page directory have been filled in at this point? What addresses do they map and where do they point? In other words, fill out this table as much as possible:
- | Entry | Base Virtual Address | Points to (logically): |
- |-------|----------------------|---------------------------------------|
- | 1023 | ? | Page table for top 4MB of phys memory |
- | 1022 | ? | ? |
- | . | ? | ? |
- | . | ? | ? |
- | . | ? | ? |
- | 2 | 0x00800000 | ? |
- | 1 | 0x00400000 | ? |
- | 0 | 0x00000000 | [see next question] |
- 3. We have placed the kernel and user environment in the same address space. Why will user programs not be able to read or write the kernel's memory? What specific mechanisms protect the kernel memory?
- 4. What is the maximum amount of physical memory that this operating system can support? Why?
- 5. How much space overhead is there for managing memory, if we actually had the maximum amount of physical memory? How is this overhead broken down?
- 6. Revisit the page table setup in `kern/entry.S` and `kern/entrypgdir.c`. Immediately after we turn on paging, EIP is still a low number (a little over 1MB). At what point do we transition to running at an EIP above KERNBASE? What makes it possible for us to continue executing at a low EIP between when we enable paging and when we begin running at an EIP above KERNBASE? Why is this transition necessary?
-
-
-```
-Challenge! We consumed many physical pages to hold the page tables for the KERNBASE mapping. Do a more space-efficient job using the PTE_PS ("Page Size") bit in the page directory entries. This bit was _not_ supported in the original 80386, but is supported on more recent x86 processors. You will therefore have to refer to [Volume 3 of the current Intel manuals][3]. Make sure you design the kernel to use this optimization only on processors that support it!
-```
-
-```
-Challenge! Extend the JOS kernel monitor with commands to:
-
- * Display in a useful and easy-to-read format all of the physical page mappings (or lack thereof) that apply to a particular range of virtual/linear addresses in the currently active address space. For example, you might enter `'showmappings 0x3000 0x5000'` to display the physical page mappings and corresponding permission bits that apply to the pages at virtual addresses 0x3000, 0x4000, and 0x5000.
- * Explicitly set, clear, or change the permissions of any mapping in the current address space.
- * Dump the contents of a range of memory given either a virtual or physical address range. Be sure the dump code behaves correctly when the range extends across page boundaries!
- * Do anything else that you think might be useful later for debugging the kernel. (There's a good chance it will be!)
-```
-
-
-##### Address Space Layout Alternatives
-
-The address space layout we use in JOS is not the only one possible. An operating system might map the kernel at low linear addresses while leaving the _upper_ part of the linear address space for user processes. x86 kernels generally do not take this approach, however, because one of the x86's backward-compatibility modes, known as _virtual 8086 mode_ , is "hard-wired" in the processor to use the bottom part of the linear address space, and thus cannot be used at all if the kernel is mapped there.
-
-It is even possible, though much more difficult, to design the kernel so as not to have to reserve _any_ fixed portion of the processor's linear or virtual address space for itself, but instead effectively to allow user-level processes unrestricted use of the _entire_ 4GB of virtual address space - while still fully protecting the kernel from these processes and protecting different processes from each other!
-
-```
-Challenge! Each user-level environment maps the kernel. Change JOS so that the kernel has its own page table and so that a user-level environment runs with a minimal number of kernel pages mapped. That is, each user-level environment maps just enough pages mapped so that the user-level environment can enter and leave the kernel correctly. You also have to come up with a plan for the kernel to read/write arguments to system calls.
-```
-
-```
-Challenge! Write up an outline of how a kernel could be designed to allow user environments unrestricted use of the full 4GB virtual and linear address space. Hint: do the previous challenge exercise first, which reduces the kernel to a few mappings in a user environment. Hint: the technique is sometimes known as " _follow the bouncing kernel_. " In your design, be sure to address exactly what has to happen when the processor transitions between kernel and user modes, and how the kernel would accomplish such transitions. Also describe how the kernel would access physical memory and I/O devices in this scheme, and how the kernel would access a user environment's virtual address space during system calls and the like. Finally, think about and describe the advantages and disadvantages of such a scheme in terms of flexibility, performance, kernel complexity, and other factors you can think of.
-```
-
-```
-Challenge! Since our JOS kernel's memory management system only allocates and frees memory on page granularity, we do not have anything comparable to a general-purpose `malloc`/`free` facility that we can use within the kernel. This could be a problem if we want to support certain types of I/O devices that require _physically contiguous_ buffers larger than 4KB in size, or if we want user-level environments, and not just the kernel, to be able to allocate and map 4MB _superpages_ for maximum processor efficiency. (See the earlier challenge problem about PTE_PS.)
-
-Generalize the kernel's memory allocation system to support pages of a variety of power-of-two allocation unit sizes from 4KB up to some reasonable maximum of your choice. Be sure you have some way to divide larger allocation units into smaller ones on demand, and to coalesce multiple small allocation units back into larger units when possible. Think about the issues that might arise in such a system.
-```
-
-**This completes the lab.** Make sure you pass all of the make grade tests and don't forget to write up your answers to the questions and a description of your challenge exercise solution in `answers-lab2.txt`. Commit your changes (including adding `answers-lab2.txt`) and type make handin in the `lab` directory to hand in your lab.
-
---------------------------------------------------------------------------------
-
-via: https://pdos.csail.mit.edu/6.828/2018/labs/lab2/
-
-作者:[csail.mit][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://pdos.csail.mit.edu
-[b]: https://github.com/lujun9972
-[1]: https://pdos.csail.mit.edu/6.828/2018/readings/i386/toc.htm
-[2]: https://pdos.csail.mit.edu/6.828/2018/labguide.html#qemu
-[3]: https://pdos.csail.mit.edu/6.828/2018/readings/ia32/IA32-3A.pdf
diff --git a/sources/tech/20180928 Quiet log noise with Python and machine learning.md b/sources/tech/20180928 Quiet log noise with Python and machine learning.md
index 79894775ed..f1fe2f1b7f 100644
--- a/sources/tech/20180928 Quiet log noise with Python and machine learning.md
+++ b/sources/tech/20180928 Quiet log noise with Python and machine learning.md
@@ -1,5 +1,3 @@
-translating by Flowsnow
-
Quiet log noise with Python and machine learning
======
diff --git a/sources/tech/20181001 Turn your book into a website and an ePub using Pandoc.md b/sources/tech/20181001 Turn your book into a website and an ePub using Pandoc.md
deleted file mode 100644
index bd79cb3c04..0000000000
--- a/sources/tech/20181001 Turn your book into a website and an ePub using Pandoc.md
+++ /dev/null
@@ -1,263 +0,0 @@
-Turn your book into a website and an ePub using Pandoc
-======
-Write once, publish twice using Markdown and Pandoc.
-
-
-
-Pandoc is a command-line tool for converting files from one markup language to another. In my [introduction to Pandoc][1], I explained how to convert text written in Markdown into a website, a slideshow, and a PDF.
-
-In this follow-up article, I'll dive deeper into [Pandoc][2], showing how to produce a website and an ePub book from the same Markdown source file. I'll use my upcoming e-book, [GRASP Principles for the Object-Oriented Mind][3], which I created using this process, as an example.
-
-First I will explain the file structure used for the book, then how to use Pandoc to generate a website and deploy it in GitHub. Finally, I demonstrate how to generate its companion ePub book.
-
-You can find the code in my [Programming Fight Club][4] GitHub repository.
-
-### Setting up the writing structure
-
-I do all of my writing in Markdown syntax. You can also use HTML, but the more HTML you introduce the highest risk that problems arise when Pandoc converts Markdown to an ePub document. My books follow the one-chapter-per-file pattern. Declare chapters using the Markdown heading H1 ( **#** ). You can put more than one chapter in each file, but putting them in separate files makes it easier to find content and do updates later.
-
-The meta-information follows a similar pattern: each output format has its own meta-information file. Meta-information files define information about your documents, such as text to add to your HTML or the license of your ePub. I store all of my Markdown documents in a folder named parts (this is important for the Makefile that generates the website and ePub). As an example, let's take the table of contents, the preface, and the about chapters (divided into the files toc.md, preface.md, and about.md) and, for clarity, we will leave out the remaining chapters.
-
-My about file might begin like:
-
-```
-# About this book {-}
-
-## Who should read this book {-}
-
-Before creating a complex software system one needs to create a solid foundation.
-General Responsibility Assignment Software Principles (GRASP) are guidelines to assign
-responsibilities to software classes in object-oriented programming.
-```
-
-Once the chapters are finished, the next step is to add meta-information to setup the format for the website and the ePub.
-
-### Generating the website
-
-#### Create the HTML meta-information file
-
-The meta-information file (web-metadata.yaml) for my website is a simple YAML file that contains information about the author, title, rights, content for the **< head>** tag, and content for the beginning and end of the HTML file.
-
-I recommend (at minimum) including the following fields in the web-metadata.yaml file:
-
-```
----
-title: GRASP principles for the Object-oriented mind
-author: Kiko Fernandez-Reyes
-rights: 2017 Kiko Fernandez-Reyes, CC-BY-NC-SA 4.0 International
-header-includes:
-- |
- \```{=html}
-
-
- \```
-include-before:
-- |
- \```{=html}
-
- \```
----
-```
-
-Some variables to note:
-
- * The **header-includes** variable contains HTML that will be embedded inside the **< head>** tag.
- * The line after calling a variable must be **\- |**. The next line must begin with triple backquotes that are aligned with the **|** or Pandoc will reject it. **{=html}** tells Pandoc that this is raw text and should not be processed as Markdown. (For this to work, you need to check that the **raw_attribute** extension in Pandoc is enabled. To check, type **pandoc --list-extensions | grep raw** and make sure the returned list contains an item named **+raw_html** ; the plus sign indicates it is enabled.)
- * The variable **include-before** adds some HTML at the beginning of your website, and I ask readers to consider spreading the word or buying me a coffee.
- * The **include-after** variable appends raw HTML at the end of the website and shows my book's license.
-
-
-
-These are only some of the fields available; take a look at the template variables in HTML (my article [introduction to Pandoc][1] covered this for LaTeX but the process is the same for HTML) to learn about others.
-
-#### Split the website into chapters
-
-The website can be generated as a whole, resulting in a long page with all the content, or split into chapters, which I think is easier to read. I'll explain how to divide the website into chapters so the reader doesn't get intimidated by a long website.
-
-To make the website easy to deploy on GitHub Pages, we need to create a root folder called docs (which is the root folder that GitHub Pages uses by default to render a website). Then we need to create folders for each chapter under docs, place the HTML chapters in their own folders, and the file content in a file named index.html.
-
-For example, the about.md file is converted to a file named index.html that is placed in a folder named about (about/index.html). This way, when users type **http:// /about/**, the index.html file from the folder about will be displayed in their browser.
-
-The following Makefile does all of this:
-
-```
-# Your book files
-DEPENDENCIES= toc preface about
-
-# Placement of your HTML files
-DOCS=docs
-
-all: web
-
-web: setup $(DEPENDENCIES)
- @cp $(DOCS)/toc/index.html $(DOCS)
-
-
-# Creation and copy of stylesheet and images into
-# the assets folder. This is important to deploy the
-# website to Github Pages.
-setup:
- @mkdir -p $(DOCS)
- @cp -r assets $(DOCS)
-
-
-# Creation of folder and index.html file on a
-# per-chapter basis
-
-$(DEPENDENCIES):
- @mkdir -p $(DOCS)/$@
- @pandoc -s --toc web-metadata.yaml parts/$@.md \
- -c /assets/pandoc.css -o $(DOCS)/$@/index.html
-
-clean:
- @rm -rf $(DOCS)
-
-.PHONY: all clean web setup
-```
-
-The option **-c /assets/pandoc.css** declares which CSS stylesheet to use; it will be fetched from **/assets/pandoc.css**. In other words, inside the **< head>** HTML tag, Pandoc adds the following line:
-
-```
-
-```
-
-To generate the website, type:
-
-```
-make
-```
-
-The root folder should contain now the following structure and files:
-
-```
-.---parts
-| |--- toc.md
-| |--- preface.md
-| |--- about.md
-|
-|---docs
- |--- assets/
- |--- index.html
- |--- toc
- | |--- index.html
- |
- |--- preface
- | |--- index.html
- |
- |--- about
- |--- index.html
-
-```
-
-#### Deploy the website
-
-To deploy the website on GitHub, follow these steps:
-
- 1. Create a new repository
- 2. Push your content to the repository
- 3. Go to the GitHub Pages section in the repository's Settings and select the option for GitHub to use the content from the Master branch
-
-
-
-You can get more details on the [GitHub Pages][5] site.
-
-Check out [my book's website][6], generated using this process, to see the result.
-
-### Generating the ePub book
-
-#### Create the ePub meta-information file
-
-The ePub meta-information file, epub-meta.yaml, is similar to the HTML meta-information file. The main difference is that ePub offers other template variables, such as **publisher** and **cover-image**. Your ePub book's stylesheet will probably differ from your website's; mine uses one named epub.css.
-
-```
----
-title: 'GRASP principles for the Object-oriented Mind'
-publisher: 'Programming Language Fight Club'
-author: Kiko Fernandez-Reyes
-rights: 2017 Kiko Fernandez-Reyes, CC-BY-NC-SA 4.0 International
-cover-image: assets/cover.png
-stylesheet: assets/epub.css
-...
-```
-
-Add the following content to the previous Makefile:
-
-```
-epub:
- @pandoc -s --toc epub-meta.yaml \
- $(addprefix parts/, $(DEPENDENCIES:=.md)) -o $(DOCS)/assets/book.epub
-```
-
-The command for the ePub target takes all the dependencies from the HTML version (your chapter names), appends to them the Markdown extension, and prepends them with the path to the folder chapters' so Pandoc knows how to process them. For example, if **$(DEPENDENCIES)** was only **preface about** , then the Makefile would call:
-
-```
-@pandoc -s --toc epub-meta.yaml \
-parts/preface.md parts/about.md -o $(DOCS)/assets/book.epub
-```
-
-Pandoc would take these two chapters, combine them, generate an ePub, and place the book under the Assets folder.
-
-Here's an [example][7] of an ePub created using this process.
-
-### Summarizing the process
-
-The process to create a website and an ePub from a Markdown file isn't difficult, but there are a lot of details. The following outline may make it easier for you to follow.
-
- * HTML book:
- * Write chapters in Markdown
- * Add metadata
- * Create a Makefile to glue pieces together
- * Set up GitHub Pages
- * Deploy
- * ePub book:
- * Reuse chapters from previous work
- * Add new metadata file
- * Create a Makefile to glue pieces together
- * Set up GitHub Pages
- * Deploy
-
-
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/10/book-to-website-epub-using-pandoc
-
-作者:[Kiko Fernandez-Reyes][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://opensource.com/users/kikofernandez
-[1]: https://opensource.com/article/18/9/intro-pandoc
-[2]: https://pandoc.org/
-[3]: https://www.programmingfightclub.com/
-[4]: https://github.com/kikofernandez/programmingfightclub
-[5]: https://pages.github.com/
-[6]: https://www.programmingfightclub.com/grasp-principles/
-[7]: https://github.com/kikofernandez/programmingfightclub/raw/master/docs/web_assets/demo.epub
diff --git a/sources/tech/20181002 Greg Kroah-Hartman Explains How the Kernel Community Is Securing Linux.md b/sources/tech/20181002 Greg Kroah-Hartman Explains How the Kernel Community Is Securing Linux.md
deleted file mode 100644
index 31788a67b2..0000000000
--- a/sources/tech/20181002 Greg Kroah-Hartman Explains How the Kernel Community Is Securing Linux.md
+++ /dev/null
@@ -1,75 +0,0 @@
-qhwdw is translating
-
-
-Greg Kroah-Hartman Explains How the Kernel Community Is Securing Linux
-============================================================
-
-
-
-Kernel maintainer Greg Kroah-Hartman talks about how the kernel community is hardening Linux against vulnerabilities.[Creative Commons Zero][2]
-
-As Linux adoption expands, it’s increasingly important for the kernel community to improve the security of the world’s most widely used technology. Security is vital not only for enterprise customers, it’s also important for consumers, as 80 percent of mobile devices are powered by Linux. In this article, Linux kernel maintainer Greg Kroah-Hartman provides a glimpse into how the kernel community deals with vulnerabilities.
-
-### There will be bugs
-
-
-
-
-Greg Kroah-Hartman[The Linux Foundation][1]
-
-As Linus Torvalds once said, most security holes are bugs, and bugs are part of the software development process. As long as the software is being written, there will be bugs.
-
-“A bug is a bug. We don’t know if a bug is a security bug or not. There is a famous bug that I fixed and then three years later Red Hat realized it was a security hole,” said Kroah-Hartman.
-
-There is not much the kernel community can do to eliminate bugs, but it can do more testing to find them. The kernel community now has its own security team that’s made up of kernel developers who know the core of the kernel.
-
-“When we get a report, we involve the domain owner to fix the issue. In some cases it’s the same people, so we made them part of the security team to speed things up,” Kroah Hartman said. But he also stressed that all parts of the kernel have to be aware of these security issues because kernel is a trusted environment and they have to protect it.
-
-“Once we fix things, we can put them in our stack analysis rules so that they are never reintroduced,” he said.
-
-Besides fixing bugs, the community also continues to add hardening to the kernel. “We have realized that we need to have mitigations. We need hardening,” said Kroah-Hartman.
-
-Huge efforts have been made by Kees Cook and others to take the hardening features that have been traditionally outside of the kernel and merge or adapt them for the kernel. With every kernel released, Cook provides a summary of all the new hardening features. But hardening the kernel is not enough, vendors have to enable the new features and take advantage of them. That’s not happening.
-
-Kroah-Hartman [releases a stable kernel every week][5], and companies pick one to support for a longer period so that device manufacturers can take advantage of it. However, Kroah-Hartman has observed that, aside from the Google Pixel, most Android phones don’t include the additional hardening features, meaning all those phones are vulnerable. “People need to enable this stuff,” he said.
-
-“I went out and bought all the top of the line phones based on kernel 4.4 to see which one actually updated. I found only one company that updated their kernel,” he said. “I'm working through the whole supply chain trying to solve that problem because it's a tough problem. There are many different groups involved -- the SoC manufacturers, the carriers, and so on. The point is that they have to push the kernel that we create out to people.”
-
-The good news is that unlike with consumer electronics, the big vendors like Red Hat and SUSE keep the kernel updated even in the enterprise environment. Modern systems with containers, pods, and virtualization make this even easier. It’s effortless to update and reboot with no downtime. It is, in fact, easier to keep things secure than it used to be.
-
-### Meltdown and Spectre
-
-No security discussion is complete without the mention of Meltdown and Spectre. The kernel community is still working on fixes as new flaws are discovered. However, Intel has changed its approach in light of these events.
-
-“They are reworking on how they approach security bugs and how they work with the community because they know they did it wrong,” Kroah-Hartman said. “The kernel has fixes for almost all of the big Spectre issues, but there is going to be a long tail of minor things.”
-
-The good news is that these Intel vulnerabilities proved that things are getting better for the kernel community. “We are doing more testing. With the latest round of security patches, we worked on our own for four months before releasing them to the world because we were embargoed. But once they hit the real world, it made us realize how much we rely on the infrastructure we have built over the years to do this kind of testing, which ensures that we don’t have bugs before they hit other people,” he said. “So things are certainly getting better.”
-
-The increasing focus on security is also creating more job opportunities for talented people. Since security is an area that gets eyeballs, those who want to build a career in kernel space, security is a good place to get started with.
-
-“If there are people who want a job to do this type of work, we have plenty of companies who would love to hire them. I know some people who have started off fixing bugs and then got hired,” Kroah-Hartman said.
-
-You can hear more in the video below:
-
-[视频](https://youtu.be/jkGVabyMh1I)
-
- _Check out the schedule of talks for Open Source Summit Europe and sign up to receive updates:_
-
---------------------------------------------------------------------------------
-
-via: https://www.linux.com/blog/2018/10/greg-kroah-hartman-explains-how-kernel-community-securing-linux-0
-
-作者:[SWAPNIL BHARTIYA][a]
-选题:[oska874][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://www.linux.com/users/arnieswap
-[b]:https://github.com/oska874
-[1]:https://www.linux.com/licenses/category/linux-foundation
-[2]:https://www.linux.com/licenses/category/creative-commons-zero
-[3]:https://www.linux.com/files/images/greg-k-hpng
-[4]:https://www.linux.com/files/images/kernel-securityjpg-0
-[5]:https://www.kernel.org/category/releases.html
diff --git a/sources/tech/20181004 Archiving web sites.md b/sources/tech/20181004 Archiving web sites.md
deleted file mode 100644
index 558c057913..0000000000
--- a/sources/tech/20181004 Archiving web sites.md
+++ /dev/null
@@ -1,119 +0,0 @@
-Archiving web sites
-======
-
-I recently took a deep dive into web site archival for friends who were worried about losing control over the hosting of their work online in the face of poor system administration or hostile removal. This makes web site archival an essential instrument in the toolbox of any system administrator. As it turns out, some sites are much harder to archive than others. This article goes through the process of archiving traditional web sites and shows how it falls short when confronted with the latest fashions in the single-page applications that are bloating the modern web.
-
-### Converting simple sites
-
-The days of handcrafted HTML web sites are long gone. Now web sites are dynamic and built on the fly using the latest JavaScript, PHP, or Python framework. As a result, the sites are more fragile: a database crash, spurious upgrade, or unpatched vulnerability might lose data. In my previous life as web developer, I had to come to terms with the idea that customers expect web sites to basically work forever. This expectation matches poorly with "move fast and break things" attitude of web development. Working with the [Drupal][2] content-management system (CMS) was particularly challenging in that regard as major upgrades deliberately break compatibility with third-party modules, which implies a costly upgrade process that clients could seldom afford. The solution was to archive those sites: take a living, dynamic web site and turn it into plain HTML files that any web server can serve forever. This process is useful for your own dynamic sites but also for third-party sites that are outside of your control and you might want to safeguard.
-
-For simple or static sites, the venerable [Wget][3] program works well. The incantation to mirror a full web site, however, is byzantine:
-
-```
- $ nice wget --mirror --execute robots=off --no-verbose --convert-links \
- --backup-converted --page-requisites --adjust-extension \
- --base=./ --directory-prefix=./ --span-hosts \
- --domains=www.example.com,example.com http://www.example.com/
-
-```
-
-The above downloads the content of the web page, but also crawls everything within the specified domains. Before you run this against your favorite site, consider the impact such a crawl might have on the site. The above command line deliberately ignores [`robots.txt`][] rules, as is now [common practice for archivists][4], and hammer the website as fast as it can. Most crawlers have options to pause between hits and limit bandwidth usage to avoid overwhelming the target site.
-
-The above command will also fetch "page requisites" like style sheets (CSS), images, and scripts. The downloaded page contents are modified so that links point to the local copy as well. Any web server can host the resulting file set, which results in a static copy of the original web site.
-
-That is, when things go well. Anyone who has ever worked with a computer knows that things seldom go according to plan; all sorts of things can make the procedure derail in interesting ways. For example, it was trendy for a while to have calendar blocks in web sites. A CMS would generate those on the fly and make crawlers go into an infinite loop trying to retrieve all of the pages. Crafty archivers can resort to regular expressions (e.g. Wget has a `--reject-regex` option) to ignore problematic resources. Another option, if the administration interface for the web site is accessible, is to disable calendars, login forms, comment forms, and other dynamic areas. Once the site becomes static, those will stop working anyway, so it makes sense to remove such clutter from the original site as well.
-
-### JavaScript doom
-
-Unfortunately, some web sites are built with much more than pure HTML. In single-page sites, for example, the web browser builds the content itself by executing a small JavaScript program. A simple user agent like Wget will struggle to reconstruct a meaningful static copy of those sites as it does not support JavaScript at all. In theory, web sites should be using [progressive enhancement][5] to have content and functionality available without JavaScript but those directives are rarely followed, as anyone using plugins like [NoScript][6] or [uMatrix][7] will confirm.
-
-Traditional archival methods sometimes fail in the dumbest way. When trying to build an offsite backup of a local newspaper ([pamplemousse.ca][8]), I found that WordPress adds query strings (e.g. `?ver=1.12.4`) at the end of JavaScript includes. This confuses content-type detection in the web servers that serve the archive, which rely on the file extension to send the right `Content-Type` header. When such an archive is loaded in a web browser, it fails to load scripts, which breaks dynamic websites.
-
-As the web moves toward using the browser as a virtual machine to run arbitrary code, archival methods relying on pure HTML parsing need to adapt. The solution for such problems is to record (and replay) the HTTP headers delivered by the server during the crawl and indeed professional archivists use just such an approach.
-
-### Creating and displaying WARC files
-
-At the [Internet Archive][9], Brewster Kahle and Mike Burner designed the [ARC][10] (for "ARChive") file format in 1996 to provide a way to aggregate the millions of small files produced by their archival efforts. The format was eventually standardized as the WARC ("Web ARChive") [specification][11] that was released as an ISO standard in 2009 and revised in 2017. The standardization effort was led by the [International Internet Preservation Consortium][12] (IIPC), which is an "international organization of libraries and other organizations established to coordinate efforts to preserve internet content for the future", according to Wikipedia; it includes members such as the US Library of Congress and the Internet Archive. The latter uses the WARC format internally in its Java-based [Heritrix crawler][13].
-
-A WARC file aggregates multiple resources like HTTP headers, file contents, and other metadata in a single compressed archive. Conveniently, Wget actually supports the file format with the `--warc` parameter. Unfortunately, web browsers cannot render WARC files directly, so a viewer or some conversion is necessary to access the archive. The simplest such viewer I have found is [pywb][14], a Python package that runs a simple webserver to offer a Wayback-Machine-like interface to browse the contents of WARC files. The following set of commands will render a WARC file on `http://localhost:8080/`:
-
-```
- $ pip install pywb
- $ wb-manager init example
- $ wb-manager add example crawl.warc.gz
- $ wayback
-
-```
-
-This tool was, incidentally, built by the folks behind the [Webrecorder][15] service, which can use a web browser to save dynamic page contents.
-
-Unfortunately, pywb has trouble loading WARC files generated by Wget because it [followed][16] an [inconsistency in the 1.0 specification][17], which was [fixed in the 1.1 specification][18]. Until Wget or pywb fix those problems, WARC files produced by Wget are not reliable enough for my uses, so I have looked at other alternatives. A crawler that got my attention is simply called [crawl][19]. Here is how it is invoked:
-
-```
- $ crawl https://example.com/
-
-```
-
-(It does say "very simple" in the README.) The program does support some command-line options, but most of its defaults are sane: it will fetch page requirements from other domains (unless the `-exclude-related` flag is used), but does not recurse out of the domain. By default, it fires up ten parallel connections to the remote site, a setting that can be changed with the `-c` flag. But, best of all, the resulting WARC files load perfectly in pywb.
-
-### Future work and alternatives
-
-There are plenty more [resources][20] for using WARC files. In particular, there's a Wget drop-in replacement called [Wpull][21] that is specifically designed for archiving web sites. It has experimental support for [PhantomJS][22] and [youtube-dl][23] integration that should allow downloading more complex JavaScript sites and streaming multimedia, respectively. The software is the basis for an elaborate archival tool called [ArchiveBot][24], which is used by the "loose collective of rogue archivists, programmers, writers and loudmouths" at [ArchiveTeam][25] in its struggle to "save the history before it's lost forever". It seems that PhantomJS integration does not work as well as the team wants, so ArchiveTeam also uses a rag-tag bunch of other tools to mirror more complex sites. For example, [snscrape][26] will crawl a social media profile to generate a list of pages to send into ArchiveBot. Another tool the team employs is [crocoite][27], which uses the Chrome browser in headless mode to archive JavaScript-heavy sites.
-
-This article would also not be complete without a nod to the [HTTrack][28] project, the "website copier". Working similarly to Wget, HTTrack creates local copies of remote web sites but unfortunately does not support WARC output. Its interactive aspects might be of more interest to novice users unfamiliar with the command line.
-
-In the same vein, during my research I found a full rewrite of Wget called [Wget2][29] that has support for multi-threaded operation, which might make it faster than its predecessor. It is [missing some features][30] from Wget, however, most notably reject patterns, WARC output, and FTP support but adds RSS, DNS caching, and improved TLS support.
-
-Finally, my personal dream for these kinds of tools would be to have them integrated with my existing bookmark system. I currently keep interesting links in [Wallabag][31], a self-hosted "read it later" service designed as a free-software alternative to [Pocket][32] (now owned by Mozilla). But Wallabag, by design, creates only a "readable" version of the article instead of a full copy. In some cases, the "readable version" is actually [unreadable][33] and Wallabag sometimes [fails to parse the article][34]. Instead, other tools like [bookmark-archiver][35] or [reminiscence][36] save a screenshot of the page along with full HTML but, unfortunately, no WARC file that would allow an even more faithful replay.
-
-The sad truth of my experiences with mirrors and archival is that data dies. Fortunately, amateur archivists have tools at their disposal to keep interesting content alive online. For those who do not want to go through that trouble, the Internet Archive seems to be here to stay and Archive Team is obviously [working on a backup of the Internet Archive itself][37].
-
---------------------------------------------------------------------------------
-
-via: https://anarc.at/blog/2018-10-04-archiving-web-sites/
-
-作者:[Anarcat][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://anarc.at
-[1]: https://anarc.at/blog
-[2]: https://drupal.org
-[3]: https://www.gnu.org/software/wget/
-[4]: https://blog.archive.org/2017/04/17/robots-txt-meant-for-search-engines-dont-work-well-for-web-archives/
-[5]: https://en.wikipedia.org/wiki/Progressive_enhancement
-[6]: https://noscript.net/
-[7]: https://github.com/gorhill/uMatrix
-[8]: https://pamplemousse.ca/
-[9]: https://archive.org
-[10]: http://www.archive.org/web/researcher/ArcFileFormat.php
-[11]: https://iipc.github.io/warc-specifications/
-[12]: https://en.wikipedia.org/wiki/International_Internet_Preservation_Consortium
-[13]: https://github.com/internetarchive/heritrix3/wiki
-[14]: https://github.com/webrecorder/pywb
-[15]: https://webrecorder.io/
-[16]: https://github.com/webrecorder/pywb/issues/294
-[17]: https://github.com/iipc/warc-specifications/issues/23
-[18]: https://github.com/iipc/warc-specifications/pull/24
-[19]: https://git.autistici.org/ale/crawl/
-[20]: https://archiveteam.org/index.php?title=The_WARC_Ecosystem
-[21]: https://github.com/chfoo/wpull
-[22]: http://phantomjs.org/
-[23]: http://rg3.github.io/youtube-dl/
-[24]: https://www.archiveteam.org/index.php?title=ArchiveBot
-[25]: https://archiveteam.org/
-[26]: https://github.com/JustAnotherArchivist/snscrape
-[27]: https://github.com/PromyLOPh/crocoite
-[28]: http://www.httrack.com/
-[29]: https://gitlab.com/gnuwget/wget2
-[30]: https://gitlab.com/gnuwget/wget2/wikis/home
-[31]: https://wallabag.org/
-[32]: https://getpocket.com/
-[33]: https://github.com/wallabag/wallabag/issues/2825
-[34]: https://github.com/wallabag/wallabag/issues/2914
-[35]: https://pirate.github.io/bookmark-archiver/
-[36]: https://github.com/kanishka-linux/reminiscence
-[37]: http://iabak.archiveteam.org
diff --git a/sources/tech/20181004 Functional programming in Python- Immutable data structures.md b/sources/tech/20181004 Functional programming in Python- Immutable data structures.md
deleted file mode 100644
index e6050d52f9..0000000000
--- a/sources/tech/20181004 Functional programming in Python- Immutable data structures.md
+++ /dev/null
@@ -1,191 +0,0 @@
-Translating by Ryze-Borgia
-Functional programming in Python: Immutable data structures
-======
-Immutability can help us better understand our code. Here's how to achieve it without sacrificing performance.
-
-
-
-In this two-part series, I will discuss how to import ideas from the functional programming methodology into Python in order to have the best of both worlds.
-
-This first post will explore how immutable data structures can help. The second part will explore higher-level functional programming concepts in Python using the **toolz** library.
-
-Why functional programming? Because mutation is hard to reason about. If you are already convinced that mutation is problematic, great. If you're not convinced, you will be by the end of this post.
-
-Let's begin by considering squares and rectangles. If we think in terms of interfaces, neglecting implementation details, are squares a subtype of rectangles?
-
-The definition of a subtype rests on the [Liskov substitution principle][1]. In order to be a subtype, it must be able to do everything the supertype does.
-
-How would we define an interface for a rectangle?
-
-```
-from zope.interface import Interface
-
-class IRectangle(Interface):
- def get_length(self):
- """Squares can do that"""
- def get_width(self):
- """Squares can do that"""
- def set_dimensions(self, length, width):
- """Uh oh"""
-```
-
-If this is the definition, then squares cannot be a subtype of rectangles; they cannot respond to a `set_dimensions` method if the length and width are different.
-
-A different approach is to choose to make rectangles immutable.
-
-```
-class IRectangle(Interface):
- def get_length(self):
- """Squares can do that"""
- def get_width(self):
- """Squares can do that"""
- def with_dimensions(self, length, width):
- """Returns a new rectangle"""
-```
-
-Now, a square can be a rectangle. It can return a new rectangle (which would not usually be a square) when `with_dimensions` is called, but it would not stop being a square.
-
-This might seem like an academic problem—until we consider that squares and rectangles are, in a sense, a container for their sides. After we understand this example, the more realistic case this comes into play with is more traditional containers. For example, consider random-access arrays.
-
-We have `ISquare` and `IRectangle`, and `ISquare` is a subtype of `IRectangle`.
-
-We want to put rectangles in a random-access array:
-
-```
-class IArrayOfRectangles(Interface):
- def get_element(self, i):
- """Returns Rectangle"""
- def set_element(self, i, rectangle):
- """'rectangle' can be any IRectangle"""
-```
-
-We want to put squares in a random-access array too:
-
-```
-class IArrayOfSquare(Interface):
- def get_element(self, i):
- """Returns Square"""
- def set_element(self, i, square):
- """'square' can be any ISquare"""
-```
-
-Even though `ISquare` is a subtype of `IRectangle`, no array can implement both `IArrayOfSquare` and `IArrayOfRectangle`.
-
-Why not? Assume `bucket` implements both.
-
-```
->>> rectangle = make_rectangle(3, 4)
->>> bucket.set_element(0, rectangle) # This is allowed by IArrayOfRectangle
->>> thing = bucket.get_element(0) # That has to be a square by IArrayOfSquare
->>> assert thing.height == thing.width
-Traceback (most recent call last):
- File "", line 1, in
-AssertionError
-```
-
-Being unable to implement both means that neither is a subtype of the other, even though `ISquare` is a subtype of `IRectangle`. The problem is the `set_element` method: If we had a read-only array, `IArrayOfSquare` would be a subtype of `IArrayOfRectangle`.
-
-Mutability, in both the mutable `IRectangle` interface and the mutable `IArrayOf*` interfaces, has made thinking about types and subtypes much more difficult—and giving up on the ability to mutate meant that the intuitive relationships we expected to have between the types actually hold.
-
-Mutation can also have non-local effects. This happens when a shared object between two places is mutated by one. The classic example is one thread mutating a shared object with another thread, but even in a single-threaded program, sharing between places that are far apart is easy. Consider that in Python, most objects are reachable from many places: as a module global, or in a stack trace, or as a class attribute.
-
-If we cannot constrain the sharing, we might think about constraining the mutability.
-
-Here is an immutable rectangle, taking advantage of the [attrs][2] library:
-
-```
-@attr.s(frozen=True)
-class Rectange(object):
- length = attr.ib()
- width = attr.ib()
- @classmethod
- def with_dimensions(cls, length, width):
- return cls(length, width)
-```
-
-Here is a square:
-
-```
-@attr.s(frozen=True)
-class Square(object):
- side = attr.ib()
- @classmethod
- def with_dimensions(cls, length, width):
- return Rectangle(length, width)
-```
-
-Using the `frozen` argument, we can easily have `attrs`-created classes be immutable. All the hard work of writing `__setitem__` correctly has been done by others and is completely invisible to us.
-
-It is still easy to modify objects; it's just nigh impossible to mutate them.
-
-```
-too_long = Rectangle(100, 4)
-reasonable = attr.evolve(too_long, length=10)
-```
-
-The [Pyrsistent][3] package allows us to have immutable containers.
-
-```
-# Vector of integers
-a = pyrsistent.v(1, 2, 3)
-# Not a vector of integers
-b = a.set(1, "hello")
-```
-
-While `b` is not a vector of integers, nothing will ever stop `a` from being one.
-
-What if `a` was a million elements long? Is `b` going to copy 999,999 of them? Pyrsistent comes with "big O" performance guarantees: All operations take `O(log n)` time. It also comes with an optional C extension to improve performance beyond the big O.
-
-For modifying nested objects, it comes with a concept of "transformers:"
-
-```
-blog = pyrsistent.m(
- title="My blog",
- links=pyrsistent.v("github", "twitter"),
- posts=pyrsistent.v(
- pyrsistent.m(title="no updates",
- content="I'm busy"),
- pyrsistent.m(title="still no updates",
- content="still busy")))
-new_blog = blog.transform(["posts", 1, "content"],
- "pretty busy")
-```
-
-`new_blog` will now be the immutable equivalent of
-
-```
-{'links': ['github', 'twitter'],
- 'posts': [{'content': "I'm busy",
- 'title': 'no updates'},
- {'content': 'pretty busy',
- 'title': 'still no updates'}],
- 'title': 'My blog'}
-```
-
-But `blog` is still the same. This means anyone who had a reference to the old object has not been affected: The transformation had only local effects.
-
-This is useful when sharing is rampant. For example, consider default arguments:
-
-```
-def silly_sum(a, b, extra=v(1, 2)):
- extra = extra.extend([a, b])
- return sum(extra)
-```
-
-In this post, we have learned why immutability can be useful for thinking about our code, and how to achieve it without an extravagant performance price. Next time, we will learn how immutable objects allow us to use powerful programming constructs.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/10/functional-programming-python-immutable-data-structures
-
-作者:[Moshe Zadka][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://opensource.com/users/moshez
-[1]: https://en.wikipedia.org/wiki/Liskov_substitution_principle
-[2]: https://www.attrs.org/en/stable/
-[3]: https://pyrsistent.readthedocs.io/en/latest/
diff --git a/sources/tech/20181005 Terminalizer - A Tool To Record Your Terminal And Generate Animated Gif Images.md b/sources/tech/20181005 Terminalizer - A Tool To Record Your Terminal And Generate Animated Gif Images.md
deleted file mode 100644
index 7b77a9cf73..0000000000
--- a/sources/tech/20181005 Terminalizer - A Tool To Record Your Terminal And Generate Animated Gif Images.md
+++ /dev/null
@@ -1,173 +0,0 @@
-thecyanbird translating
-
-Terminalizer – A Tool To Record Your Terminal And Generate Animated Gif Images
-======
-This is know topic for most of us and i don’t want to give you the detailed information about this flow. Also, we had written many article under this topics.
-
-Script command is the one of the standard command to record Linux terminal sessions. Today we are going to discuss about same kind of tool called Terminalizer.
-
-This tool will help us to record the users terminal activity, also will help us to identify other useful information from the output.
-
-### What Is Terminalizer
-
-Terminalizer allow users to record their terminal activity and allow them to generate animated gif images. It’s highly customizable CLI tool that user can share a link for an online player, web player for a recording file.
-
-**Suggested Read :**
-**(#)** [Script – A Simple Command To Record Your Terminal Session Activity][1]
-**(#)** [Automatically Record/Capture All Users Terminal Sessions Activity In Linux][2]
-**(#)** [Teleconsole – A Tool To Share Your Terminal Session Instantly To Anyone In Seconds][3]
-**(#)** [tmate – Instantly Share Your Terminal Session To Anyone In Seconds][4]
-**(#)** [Peek – Create a Animated GIF Recorder in Linux][5]
-**(#)** [Kgif – A Simple Shell Script to Create a Gif File from Active Window][6]
-**(#)** [Gifine – Quickly Create An Animated GIF Video In Ubuntu/Debian][7]
-
-There is no distribution official package to install this utility and we can easily install it by using Node.js.
-
-### How To Install Noje.js in Linux
-
-Node.js can be installed in multiple ways. Here, we are going to teach you the standard method.
-
-For Ubuntu/LinuxMint use [APT-GET Command][8] or [APT Command][9] to install Node.js
-
-```
-$ curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
-$ sudo apt-get install -y nodejs
-
-```
-
-For Debian use [APT-GET Command][8] or [APT Command][9] to install Node.js
-
-```
-# curl -sL https://deb.nodesource.com/setup_8.x | bash -
-# apt-get install -y nodejs
-
-```
-
-For **`RHEL/CentOS`** , use [YUM Command][10] to install tmux.
-
-```
-$ sudo curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -
-$ sudo yum install epel-release
-$ sudo yum -y install nodejs
-
-```
-
-For **`Fedora`** , use [DNF Command][11] to install tmux.
-
-```
-$ sudo dnf install nodejs
-
-```
-
-For **`Arch Linux`** , use [Pacman Command][12] to install tmux.
-
-```
-$ sudo pacman -S nodejs npm
-
-```
-
-For **`openSUSE`** , use [Zypper Command][13] to install tmux.
-
-```
-$ sudo zypper in nodejs6
-
-```
-
-### How to Install Terminalizer
-
-As you have already installed prerequisite package called Node.js, now it’s time to install Terminalizer on your system. Simple run the below npm command to install Terminalizer.
-
-```
-$ sudo npm install -g terminalizer
-
-```
-
-### How to Use Terminalizer
-
-To record your session activity using Terminalizer, just run the following Terminalizer command. Once you started the recording then play around it and finally hit `CTRL+D` to exit and save the recording.
-
-```
-# terminalizer record 2g-session
-
-defaultConfigPath
-The recording session is started
-Press CTRL+D to exit and save the recording
-
-```
-
-This will save your recording session as a YAML file, in this case my filename would be 2g-session-activity.yml.
-![][15]
-
-Just type few commands to verify this and finally hit `CTRL+D` to exit the current capture. When you hit `CTRL+D` on the terminal and you will be getting the below output.
-
-```
-# logout
-Successfully Recorded
-The recording data is saved into the file:
-/home/daygeek/2g-session.yml
-You can edit the file and even change the configurations.
-
-```
-
-![][16]
-
-### How to Play the Recorded File
-
-Use the below command format to paly your recorded YAML file. Make sure, you have to input your recorded file instead of us.
-
-```
-# terminalizer play 2g-session
-
-```
-
-Render a recording file as an animated gif image.
-
-```
-# terminalizer render 2g-session
-
-```
-
-`Note:` Below two commands are not implemented yet in the current version and will be available in the next version.
-
-If you would like to share your recording to others then upload a recording file and get a link for an online player and share it.
-
-```
-terminalizer share 2g-session
-
-```
-
-Generate a web player for a recording file
-
-```
-# terminalizer generate 2g-session
-
-```
-
---------------------------------------------------------------------------------
-
-via: https://www.2daygeek.com/terminalizer-a-tool-to-record-your-terminal-and-generate-animated-gif-images/
-
-作者:[Prakash Subramanian][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://www.2daygeek.com/author/prakash/
-[1]: https://www.2daygeek.com/script-command-record-save-your-terminal-session-activity-linux/
-[2]: https://www.2daygeek.com/automatically-record-all-users-terminal-sessions-activity-linux-script-command/
-[3]: https://www.2daygeek.com/teleconsole-share-terminal-session-instantly-to-anyone-in-seconds/
-[4]: https://www.2daygeek.com/tmate-instantly-share-your-terminal-session-to-anyone-in-seconds/
-[5]: https://www.2daygeek.com/peek-create-animated-gif-screen-recorder-capture-arch-linux-mint-fedora-ubuntu/
-[6]: https://www.2daygeek.com/kgif-create-animated-gif-file-active-window-screen-recorder-capture-arch-linux-mint-fedora-ubuntu-debian-opensuse-centos/
-[7]: https://www.2daygeek.com/gifine-create-animated-gif-vedio-recorder-linux-mint-debian-ubuntu/
-[8]: https://www.2daygeek.com/apt-get-apt-cache-command-examples-manage-packages-debian-ubuntu-systems/
-[9]: https://www.2daygeek.com/apt-command-examples-manage-packages-debian-ubuntu-systems/
-[10]: https://www.2daygeek.com/yum-command-examples-manage-packages-rhel-centos-systems/
-[11]: https://www.2daygeek.com/dnf-command-examples-manage-packages-fedora-system/
-[12]: https://www.2daygeek.com/pacman-command-examples-manage-packages-arch-linux-system/
-[13]: https://www.2daygeek.com/zypper-command-examples-manage-packages-opensuse-system/
-[14]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
-[15]: https://www.2daygeek.com/wp-content/uploads/2018/10/terminalizer-record-2g-session-1.gif
-[16]: https://www.2daygeek.com/wp-content/uploads/2018/10/terminalizer-play-2g-session.gif
diff --git a/sources/tech/20181006 LinuxBoot for Servers - Enter Open Source, Goodbye Proprietary UEFI.md b/sources/tech/20181006 LinuxBoot for Servers - Enter Open Source, Goodbye Proprietary UEFI.md
deleted file mode 100644
index de0a4260db..0000000000
--- a/sources/tech/20181006 LinuxBoot for Servers - Enter Open Source, Goodbye Proprietary UEFI.md
+++ /dev/null
@@ -1,126 +0,0 @@
-qhwdw is translating
-
-LinuxBoot for Servers: Enter Open Source, Goodbye Proprietary UEFI
-============================================================
-
-[LinuxBoot][13] is an Open Source [alternative][14] to Proprietary [UEFI][15] firmware. It was released last year and is now being increasingly preferred by leading hardware manufacturers as default firmware. Last year, LinuxBoot was warmly [welcomed][16]into the Open Source family by The Linux Foundation.
-
-This project was an initiative by Ron Minnich, author of LinuxBIOS and lead of [coreboot][17] at Google, in January 2017.
-
-Google, Facebook, [Horizon Computing Solutions][18], and [Two Sigma][19] collaborated together to develop the [LinuxBoot project][20] (formerly called [NERF][21]) for server machines based on Linux.
-
-Its openness allows Server users to easily customize their own boot scripts, fix issues, build their own [runtimes][22] and [reflash their firmware][23] with their own keys. They do not need to wait for vendor updates.
-
-Following is a video of [Ubuntu Xenial][24] booting for the first time with NERF BIOS:
-
-[视频](https://youtu.be/HBkZAN3xkJg)
-
-Let’s talk about some other advantages by comparing it to UEFI in terms of Server hardware.
-
-### Advantages of LinuxBoot over UEFI
-
-
-
-Here are some of the major advantages of LinuxBoot over UEFI:
-
-### Significantly faster startup
-
-It can boot up Server boards in less than twenty seconds, versus multiple minutes on UEFI.
-
-### Significantly more flexible
-
-LinuxBoot can make use of any devices, filesystems and protocols that Linux supports.
-
-### Potentially more secure
-
-Linux device drivers and filesystems have significantly more scrutiny than through UEFI.
-
-We can argue that UEFI is partly open with [EDK II][25] and LinuxBoot is partly closed. But it has been [addressed][26] that even such EDK II code does not have the proper level of inspection and correctness as the [Linux Kernel][27] goes through, while there is a huge amount of other Closed Source components within UEFI development.
-
-On the other hand, LinuxBoot has a significantly smaller amount of binaries with only a few hundred KB, compared to the 32 MB of UEFI binaries.
-
-To be precise, LinuxBoot fits a whole lot better into the [Trusted Computing Base][28], unlike UEFI.
-
-[Suggested readBest Free and Open Source Alternatives to Adobe Products for Linux][29]
-
-LinuxBoot has a [kexec][30] based bootloader which does not support startup on Windows/non-Linux kernels, but that is insignificant since most clouds are Linux-based Servers.
-
-### LinuxBoot adoption
-
-In 2011, the [Open Compute Project][31] was started by [Facebook][32] who [open-sourced][33] designs of some of their Servers, built to make its data centers more efficient. LinuxBoot has been tested on a few Open Compute Hardware listed as under:
-
-* Winterfell
-
-* Leopard
-
-* Tioga Pass
-
-More [OCP][34] hardware are described [here][35] in brief. The OCP Foundation runs a dedicated project on firmware through [Open System Firmware][36].
-
-Some other devices that support LinuxBoot are:
-
-* [QEMU][9] emulated [Q35][10] systems
-
-* [Intel S2600wf][11]
-
-* [Dell R630][12]
-
-Last month end, [Equus Compute Solutions][37] [announced][38] the release of its [WHITEBOX OPEN™][39] M2660 and M2760 Servers, as a part of their custom, cost-optimized Open-Hardware Servers and storage platforms. Both of them support LinuxBoot to customize the Server BIOS for flexibility, improved security, and create a blazingly fast booting experience.
-
-### What do you think of LinuxBoot?
-
-LinuxBoot is quite well documented [on GitHub][40]. Do you like the features that set it apart from UEFI? Would you prefer using LinuxBoot rather than UEFI for starting up Servers, owing to the former’s open-ended development and future? Let us know in the comments below.
-
---------------------------------------------------------------------------------
-
-via: https://itsfoss.com/linuxboot-uefi/
-
-作者:[ Avimanyu Bandyopadhyay][a]
-选题:[oska874][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://itsfoss.com/author/avimanyu/
-[b]:https://github.com/oska874
-[1]:https://itsfoss.com/linuxboot-uefi/#
-[2]:https://itsfoss.com/linuxboot-uefi/#
-[3]:https://itsfoss.com/linuxboot-uefi/#
-[4]:https://itsfoss.com/linuxboot-uefi/#
-[5]:https://itsfoss.com/linuxboot-uefi/#
-[6]:https://itsfoss.com/linuxboot-uefi/#
-[7]:https://itsfoss.com/author/avimanyu/
-[8]:https://itsfoss.com/linuxboot-uefi/#comments
-[9]:https://en.wikipedia.org/wiki/QEMU
-[10]:https://wiki.qemu.org/Features/Q35
-[11]:https://trmm.net/S2600
-[12]:https://trmm.net/NERF#Installing_on_a_Dell_R630
-[13]:https://www.linuxboot.org/
-[14]:https://www.phoronix.com/scan.php?page=news_item&px=LinuxBoot-OSFC-2018-State
-[15]:https://itsfoss.com/check-uefi-or-bios/
-[16]:https://www.linuxfoundation.org/blog/2018/01/system-startup-gets-a-boost-with-new-linuxboot-project/
-[17]:https://en.wikipedia.org/wiki/Coreboot
-[18]:http://www.horizon-computing.com/
-[19]:https://www.twosigma.com/
-[20]:https://trmm.net/LinuxBoot_34c3
-[21]:https://trmm.net/NERF
-[22]:https://trmm.net/LinuxBoot_34c3#Runtimes
-[23]:http://www.tech-faq.com/flashing-firmware.html
-[24]:https://itsfoss.com/features-ubuntu-1604/
-[25]:https://www.tianocore.org/
-[26]:https://media.ccc.de/v/34c3-9056-bringing_linux_back_to_server_boot_roms_with_nerf_and_heads
-[27]:https://medium.com/@bhumikagoyal/linux-kernel-development-cycle-52b4c55be06e
-[28]:https://en.wikipedia.org/wiki/Trusted_computing_base
-[29]:https://itsfoss.com/adobe-alternatives-linux/
-[30]:https://en.wikipedia.org/wiki/Kexec
-[31]:https://en.wikipedia.org/wiki/Open_Compute_Project
-[32]:https://github.com/facebook
-[33]:https://github.com/opencomputeproject
-[34]:https://www.networkworld.com/article/3266293/lan-wan/what-is-the-open-compute-project.html
-[35]:http://hyperscaleit.com/ocp-server-hardware/
-[36]:https://www.opencompute.org/projects/open-system-firmware
-[37]:https://www.equuscs.com/
-[38]:http://www.dcvelocity.com/products/Software_-_Systems/20180924-equus-compute-solutions-introduces-whitebox-open-m2660-and-m2760-servers/
-[39]:https://www.equuscs.com/servers/whitebox-open/
-[40]:https://github.com/linuxboot/linuxboot
diff --git a/sources/tech/20181011 Exploring the Linux kernel- The secrets of Kconfig-kbuild.md b/sources/tech/20181011 Exploring the Linux kernel- The secrets of Kconfig-kbuild.md
index f2885b177c..8ee4f34897 100644
--- a/sources/tech/20181011 Exploring the Linux kernel- The secrets of Kconfig-kbuild.md
+++ b/sources/tech/20181011 Exploring the Linux kernel- The secrets of Kconfig-kbuild.md
@@ -1,4 +1,3 @@
-translating by leemeans
Exploring the Linux kernel: The secrets of Kconfig/kbuild
======
Dive into understanding how the Linux config/build system works.
diff --git a/sources/tech/20181016 Final JOS project.md b/sources/tech/20181016 Final JOS project.md
deleted file mode 100644
index 401235d20d..0000000000
--- a/sources/tech/20181016 Final JOS project.md
+++ /dev/null
@@ -1,120 +0,0 @@
-Translating by qhwdw
-Final JOS project
-======
-Piazza Discussion Due, November 2, 2018 Proposals Due, November 8, 2018 Code repository Due, December 6, 2018 Check-off and in-class demos, Week of December 10, 2018
-
-### Introduction
-
-For the final project you have two options:
-
-* Work on your own and do [lab 6][1], including one challenge exercise in lab 6\. (You are free, of course, to extend lab 6, or any part of JOS, further in interesting ways, but it isn't required.)
-
-* Work in a team of one, two or three, on a project of your choice that involves your JOS. This project must be of the same scope as lab 6 or larger (if you are working in a team).
-
-The goal is to have fun and explore more advanced O/S topics; you don't have to do novel research.
-
-If you are doing your own project, we'll grade you on how much you got working, how elegant your design is, how well you can explain it, and how interesting and creative your solution is. We do realize that time is limited, so we don't expect you to re-write Linux by the end of the semester. Try to make sure your goals are reasonable; perhaps set a minimum goal that's definitely achievable (e.g., something of the scale of lab 6) and a more ambitious goal if things go well.
-
-If you are doing lab 6, we will grade you on whether you pass the tests and the challenge exercise.
-
-### Deliverables
-
-```
-Nov 3: Piazza discussion and form groups of 1, 2, or 3 (depending on which final project option you are choosing). Use the lab7 tag/folder on Piazza. Discuss ideas with others in comments on their Piazza posting. Use these postings to help find other students interested in similar ideas for forming a group. Course staff will provide feedback on project ideas on Piazza; if you'd like more detailed feedback, come chat with us in person.
-```
-
-```
-Nov 9: Submit a proposal at [the submission website][19], just a paragraph or two. The proposal should include your group members list, the problem you want to address, how you plan to address it, and what are you proposing to specifically design and implement. (If you are doing lab 6, there is nothing to do for this deliverable.)
-```
-
-```
-Dec 7: submit source code along with a brief write-up. Put the write-up under the top-level source directory with the name "README.pdf". Since some of you will be working in groups for this lab assignment, you may want to use git to share your project code between group members. You will need to decide on whose source code you will use as a starting point for your group project. Make sure to create a branch for your final project, and name it lab7\. (If you do lab 6, follow the lab 6 submission instructions.)
-```
-
-```
-Week of Dec 11: short in-class demonstration. Prepare a short in-class demo of your JOS project. We will provide a projector that you can use to demonstrate your project. Depending on the number of groups and the kinds of projects that each group chooses, we may decide to limit the total number of presentations, and some groups might end up not presenting in class.
-```
-
-```
-Week of Dec 11: check-off with TAs. Demo your project to the TAs so that we can ask you some questions and find out in more detail what you did.
-```
-
-### Project ideas
-
-If you are not doing lab 6, here's a list of ideas to get you started thinking. But, you should feel free to pursue your own ideas. Some of the ideas are starting points and by themselves not of the scope of lab 6, and others are likely to be much of larger scope.
-
-* Build a virtual machine monitor that can run multiple guests (for example, multiple instances of JOS), using [x86 VM support][2].
-
-* Do something useful with the hardware protection of Intel SGX. [Here is a recent paper using Intel SGX][3].
-
-* Make the JOS file system support writing, file creation, logging for durability, etc., perhaps taking ideas from Linux EXT3.
-
-* Use file system ideas from [Soft updates][4], [WAFL][5], ZFS, or another advanced file system.
-
-* Add snapshots to a file system, so that a user can look at the file system as it appeared at various points in the past. You'll probably want to use some kind of copy-on-write for disk storage to keep space consumption down.
-
-* Build a [distributed shared memory][6] (DSM) system, so that you can run multi-threaded shared memory parallel programs on a cluster of machines, using paging to give the appearance of real shared memory. When a thread tries to access a page that's on another machine, the page fault will give the DSM system a chance to fetch the page over the network from whatever machine currently stores it.
-
-* Allow processes to migrate from one machine to another over the network. You'll need to do something about the various pieces of a process's state, but since much state in JOS is in user-space it may be easier than process migration on Linux.
-
-* Implement [paging][7] to disk in JOS, so that processes can be bigger than RAM. Extend your pager with swapping.
-
-* Implement [mmap()][8] of files for JOS.
-
-* Use [xfi][9] to sandbox code within a process.
-
-* Support x86 [2MB or 4MB pages][10].
-
-* Modify JOS to have kernel-supported threads inside processes. See [in-class uthread assignment][11] to get started. Implementing scheduler activations would be one way to do this project.
-
-* Use fine-grained locking or lock-free concurrency in JOS in the kernel or in the file server (after making it multithreaded). The linux kernel uses [read copy update][12] to be able to perform read operations without holding locks. Explore RCU by implementing it in JOS and use it to support a name cache with lock-free reads.
-
-* Implement ideas from the [Exokernel papers][13], for example the packet filter.
-
-* Make JOS have soft real-time behavior. You will have to identify some application for which this is useful.
-
-* Make JOS run on 64-bit CPUs. This includes redoing the virtual memory system to use 4-level pages tables. See [reference page][14] for some documentation.
-
-* Port JOS to a different microprocessor. The [osdev wiki][15] may be helpful.
-
-* A window system for JOS, including graphics driver and mouse. See [reference page][16] for some documentation. [sqrt(x)][17] is an example JOS window system (and writeup).
-
-* Implement [dune][18] to export privileged hardware instructions to user-space applications in JOS.
-
-* Write a user-level debugger; add strace-like functionality; hardware register profiling (e.g. Oprofile); call-traces
-
-* Binary emulation for (static) Linux executables
-
-
---------------------------------------------------------------------------------
-
-via: https://pdos.csail.mit.edu/6.828/2018/labs/lab7/
-
-作者:[csail.mit][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://pdos.csail.mit.edu
-[b]: https://github.com/lujun9972
-[1]: https://pdos.csail.mit.edu/6.828/2018/labs/lab6/index.html
-[2]: http://www.intel.com/technology/itj/2006/v10i3/1-hardware/3-software.htm
-[3]: https://www.usenix.org/system/files/conference/osdi14/osdi14-paper-baumann.pdf
-[4]: http://www.ece.cmu.edu/~ganger/papers/osdi94.pdf
-[5]: https://ng.gnunet.org/sites/default/files/10.1.1.40.3691.pdf
-[6]: http://www.cdf.toronto.edu/~csc469h/fall/handouts/nitzberg91.pdf
-[7]: http://en.wikipedia.org/wiki/Paging
-[8]: http://en.wikipedia.org/wiki/Mmap
-[9]: http://static.usenix.org/event/osdi06/tech/erlingsson.html
-[10]: http://en.wikipedia.org/wiki/Page_(computer_memory)
-[11]: http://pdos.csail.mit.edu/6.828/2018/homework/xv6-uthread.html
-[12]: http://en.wikipedia.org/wiki/Read-copy-update
-[13]: http://pdos.csail.mit.edu/6.828/2018/readings/engler95exokernel.pdf
-[14]: http://pdos.csail.mit.edu/6.828/2018/reference.html
-[15]: http://wiki.osdev.org/Main_Page
-[16]: http://pdos.csail.mit.edu/6.828/2018/reference.html
-[17]: http://web.mit.edu/amdragon/www/pubs/sqrtx-6.828.html
-[18]: https://www.usenix.org/system/files/conference/osdi12/osdi12-final-117.pdf
-[19]: https://6828.scripts.mit.edu/2018/handin.py/
diff --git a/sources/tech/20181016 Lab 6- Network Driver.md b/sources/tech/20181016 Lab 6- Network Driver.md
deleted file mode 100644
index b9b9172b42..0000000000
--- a/sources/tech/20181016 Lab 6- Network Driver.md
+++ /dev/null
@@ -1,512 +0,0 @@
-Translating by qhwdw
-Lab 6: Network Driver
-======
-### Lab 6: Network Driver (default final project)
-
-**Due on Thursday, December 6, 2018
-**
-
-### Introduction
-
-This lab is the default final project that you can do on your own.
-
-Now that you have a file system, no self respecting OS should go without a network stack. In this the lab you are going to write a driver for a network interface card. The card will be based on the Intel 82540EM chip, also known as the E1000.
-
-##### Getting Started
-
-Use Git to commit your Lab 5 source (if you haven't already), fetch the latest version of the course repository, and then create a local branch called `lab6` based on our lab6 branch, `origin/lab6`:
-
-```
- athena% cd ~/6.828/lab
- athena% add git
- athena% git commit -am 'my solution to lab5'
- nothing to commit (working directory clean)
- athena% git pull
- Already up-to-date.
- athena% git checkout -b lab6 origin/lab6
- Branch lab6 set up to track remote branch refs/remotes/origin/lab6.
- Switched to a new branch "lab6"
- athena% git merge lab5
- Merge made by recursive.
- fs/fs.c | 42 +++++++++++++++++++
- 1 files changed, 42 insertions(+), 0 deletions(-)
- athena%
-```
-
-The network card driver, however, will not be enough to get your OS hooked up to the Internet. In the new lab6 code, we have provided you with a network stack and a network server. As in previous labs, use git to grab the code for this lab, merge in your own code, and explore the contents of the new `net/` directory, as well as the new files in `kern/`.
-
-In addition to writing the driver, you will need to create a system call interface to give access to your driver. You will implement missing network server code to transfer packets between the network stack and your driver. You will also tie everything together by finishing a web server. With the new web server you will be able to serve files from your file system.
-
-Much of the kernel device driver code you will have to write yourself from scratch. This lab provides much less guidance than previous labs: there are no skeleton files, no system call interfaces written in stone, and many design decisions are left up to you. For this reason, we recommend that you read the entire assignment write up before starting any individual exercises. Many students find this lab more difficult than previous labs, so please plan your time accordingly.
-
-##### Lab Requirements
-
-As before, you will need to do all of the regular exercises described in the lab and _at least one_ challenge problem. Write up brief answers to the questions posed in the lab and a description of your challenge exercise in `answers-lab6.txt`.
-
-#### QEMU's virtual network
-
-We will be using QEMU's user mode network stack since it requires no administrative privileges to run. QEMU's documentation has more about user-net [here][1]. We've updated the makefile to enable QEMU's user-mode network stack and the virtual E1000 network card.
-
-By default, QEMU provides a virtual router running on IP 10.0.2.2 and will assign JOS the IP address 10.0.2.15. To keep things simple, we hard-code these defaults into the network server in `net/ns.h`.
-
-While QEMU's virtual network allows JOS to make arbitrary connections out to the Internet, JOS's 10.0.2.15 address has no meaning outside the virtual network running inside QEMU (that is, QEMU acts as a NAT), so we can't connect directly to servers running inside JOS, even from the host running QEMU. To address this, we configure QEMU to run a server on some port on the _host_ machine that simply connects through to some port in JOS and shuttles data back and forth between your real host and the virtual network.
-
-You will run JOS servers on ports 7 (echo) and 80 (http). To avoid collisions on shared Athena machines, the makefile generates forwarding ports for these based on your user ID. To find out what ports QEMU is forwarding to on your development host, run make which-ports. For convenience, the makefile also provides make nc-7 and make nc-80, which allow you to interact directly with servers running on these ports in your terminal. (These targets only connect to a running QEMU instance; you must start QEMU itself separately.)
-
-##### Packet Inspection
-
-The makefile also configures QEMU's network stack to record all incoming and outgoing packets to `qemu.pcap` in your lab directory.
-
-To get a hex/ASCII dump of captured packets use `tcpdump` like this:
-
-```
- tcpdump -XXnr qemu.pcap
-```
-
-Alternatively, you can use [Wireshark][2] to graphically inspect the pcap file. Wireshark also knows how to decode and inspect hundreds of network protocols. If you're on Athena, you'll have to use Wireshark's predecessor, ethereal, which is in the sipbnet locker.
-
-##### Debugging the E1000
-
-We are very lucky to be using emulated hardware. Since the E1000 is running in software, the emulated E1000 can report to us, in a user readable format, its internal state and any problems it encounters. Normally, such a luxury would not be available to a driver developer writing with bare metal.
-
-The E1000 can produce a lot of debug output, so you have to enable specific logging channels. Some channels you might find useful are:
-
-| Flag | Meaning |
-| --------- | ---------------------------------------------------|
-| tx | Log packet transmit operations |
-| txerr | Log transmit ring errors |
-| rx | Log changes to RCTL |
-| rxfilter | Log filtering of incoming packets |
-| rxerr | Log receive ring errors |
-| unknown | Log reads and writes of unknown registers |
-| eeprom | Log reads from the EEPROM |
-| interrupt | Log interrupts and changes to interrupt registers. |
-
-To enable "tx" and "txerr" logging, for example, use make E1000_DEBUG=tx,txerr ....
-
-Note: `E1000_DEBUG` flags only work in the 6.828 version of QEMU.
-
-You can take debugging using software emulated hardware one step further. If you are ever stuck and do not understand why the E1000 is not responding the way you would expect, you can look at QEMU's E1000 implementation in `hw/e1000.c`.
-
-#### The Network Server
-
-Writing a network stack from scratch is hard work. Instead, we will be using lwIP, an open source lightweight TCP/IP protocol suite that among many things includes a network stack. You can find more information on lwIP [here][3]. In this assignment, as far as we are concerned, lwIP is a black box that implements a BSD socket interface and has a packet input port and packet output port.
-
-The network server is actually a combination of four environments:
-
- * core network server environment (includes socket call dispatcher and lwIP)
- * input environment
- * output environment
- * timer environment
-
-
-
-The following diagram shows the different environments and their relationships. The diagram shows the entire system including the device driver, which will be covered later. In this lab, you will implement the parts highlighted in green.
-
-![Network server architecture][4]
-
-##### The Core Network Server Environment
-
-The core network server environment is composed of the socket call dispatcher and lwIP itself. The socket call dispatcher works exactly like the file server. User environments use stubs (found in `lib/nsipc.c`) to send IPC messages to the core network environment. If you look at `lib/nsipc.c` you will see that we find the core network server the same way we found the file server: `i386_init` created the NS environment with NS_TYPE_NS, so we scan `envs`, looking for this special environment type. For each user environment IPC, the dispatcher in the network server calls the appropriate BSD socket interface function provided by lwIP on behalf of the user.
-
-Regular user environments do not use the `nsipc_*` calls directly. Instead, they use the functions in `lib/sockets.c`, which provides a file descriptor-based sockets API. Thus, user environments refer to sockets via file descriptors, just like how they referred to on-disk files. A number of operations (`connect`, `accept`, etc.) are specific to sockets, but `read`, `write`, and `close` go through the normal file descriptor device-dispatch code in `lib/fd.c`. Much like how the file server maintained internal unique ID's for all open files, lwIP also generates unique ID's for all open sockets. In both the file server and the network server, we use information stored in `struct Fd` to map per-environment file descriptors to these unique ID spaces.
-
-Even though it may seem that the IPC dispatchers of the file server and network server act the same, there is a key difference. BSD socket calls like `accept` and `recv` can block indefinitely. If the dispatcher were to let lwIP execute one of these blocking calls, the dispatcher would also block and there could only be one outstanding network call at a time for the whole system. Since this is unacceptable, the network server uses user-level threading to avoid blocking the entire server environment. For every incoming IPC message, the dispatcher creates a thread and processes the request in the newly created thread. If the thread blocks, then only that thread is put to sleep while other threads continue to run.
-
-In addition to the core network environment there are three helper environments. Besides accepting messages from user applications, the core network environment's dispatcher also accepts messages from the input and timer environments.
-
-##### The Output Environment
-
-When servicing user environment socket calls, lwIP will generate packets for the network card to transmit. LwIP will send each packet to be transmitted to the output helper environment using the `NSREQ_OUTPUT` IPC message with the packet attached in the page argument of the IPC message. The output environment is responsible for accepting these messages and forwarding the packet on to the device driver via the system call interface that you will soon create.
-
-##### The Input Environment
-
-Packets received by the network card need to be injected into lwIP. For every packet received by the device driver, the input environment pulls the packet out of kernel space (using kernel system calls that you will implement) and sends the packet to the core server environment using the `NSREQ_INPUT` IPC message.
-
-The packet input functionality is separated from the core network environment because JOS makes it hard to simultaneously accept IPC messages and poll or wait for a packet from the device driver. We do not have a `select` system call in JOS that would allow environments to monitor multiple input sources to identify which input is ready to be processed.
-
-If you take a look at `net/input.c` and `net/output.c` you will see that both need to be implemented. This is mainly because the implementation depends on your system call interface. You will write the code for the two helper environments after you implement the driver and system call interface.
-
-##### The Timer Environment
-
-The timer environment periodically sends messages of type `NSREQ_TIMER` to the core network server notifying it that a timer has expired. The timer messages from this thread are used by lwIP to implement various network timeouts.
-
-### Part A: Initialization and transmitting packets
-
-Your kernel does not have a notion of time, so we need to add it. There is currently a clock interrupt that is generated by the hardware every 10ms. On every clock interrupt we can increment a variable to indicate that time has advanced by 10ms. This is implemented in `kern/time.c`, but is not yet fully integrated into your kernel.
-
-```
-Exercise 1. Add a call to `time_tick` for every clock interrupt in `kern/trap.c`. Implement `sys_time_msec` and add it to `syscall` in `kern/syscall.c` so that user space has access to the time.
-```
-
-Use make INIT_CFLAGS=-DTEST_NO_NS run-testtime to test your time code. You should see the environment count down from 5 in 1 second intervals. The "-DTEST_NO_NS" disables starting the network server environment because it will panic at this point in the lab.
-
-#### The Network Interface Card
-
-Writing a driver requires knowing in depth the hardware and the interface presented to the software. The lab text will provide a high-level overview of how to interface with the E1000, but you'll need to make extensive use of Intel's manual while writing your driver.
-
-```
-Exercise 2. Browse Intel's [Software Developer's Manual][5] for the E1000. This manual covers several closely related Ethernet controllers. QEMU emulates the 82540EM.
-
-You should skim over chapter 2 now to get a feel for the device. To write your driver, you'll need to be familiar with chapters 3 and 14, as well as 4.1 (though not 4.1's subsections). You'll also need to use chapter 13 as reference. The other chapters mostly cover components of the E1000 that your driver won't have to interact with. Don't worry about the details right now; just get a feel for how the document is structured so you can find things later.
-
-While reading the manual, keep in mind that the E1000 is a sophisticated device with many advanced features. A working E1000 driver only needs a fraction of the features and interfaces that the NIC provides. Think carefully about the easiest way to interface with the card. We strongly recommend that you get a basic driver working before taking advantage of the advanced features.
-```
-
-##### PCI Interface
-
-The E1000 is a PCI device, which means it plugs into the PCI bus on the motherboard. The PCI bus has address, data, and interrupt lines, and allows the CPU to communicate with PCI devices and PCI devices to read and write memory. A PCI device needs to be discovered and initialized before it can be used. Discovery is the process of walking the PCI bus looking for attached devices. Initialization is the process of allocating I/O and memory space as well as negotiating the IRQ line for the device to use.
-
-We have provided you with PCI code in `kern/pci.c`. To perform PCI initialization during boot, the PCI code walks the PCI bus looking for devices. When it finds a device, it reads its vendor ID and device ID and uses these two values as a key to search the `pci_attach_vendor` array. The array is composed of `struct pci_driver` entries like this:
-
-```
- struct pci_driver {
- uint32_t key1, key2;
- int (*attachfn) (struct pci_func *pcif);
- };
-```
-
-If the discovered device's vendor ID and device ID match an entry in the array, the PCI code calls that entry's `attachfn` to perform device initialization. (Devices can also be identified by class, which is what the other driver table in `kern/pci.c` is for.)
-
-The attach function is passed a _PCI function_ to initialize. A PCI card can expose multiple functions, though the E1000 exposes only one. Here is how we represent a PCI function in JOS:
-
-```
- struct pci_func {
- struct pci_bus *bus;
-
- uint32_t dev;
- uint32_t func;
-
- uint32_t dev_id;
- uint32_t dev_class;
-
- uint32_t reg_base[6];
- uint32_t reg_size[6];
- uint8_t irq_line;
- };
-```
-
-The above structure reflects some of the entries found in Table 4-1 of Section 4.1 of the developer manual. The last three entries of `struct pci_func` are of particular interest to us, as they record the negotiated memory, I/O, and interrupt resources for the device. The `reg_base` and `reg_size` arrays contain information for up to six Base Address Registers or BARs. `reg_base` stores the base memory addresses for memory-mapped I/O regions (or base I/O ports for I/O port resources), `reg_size` contains the size in bytes or number of I/O ports for the corresponding base values from `reg_base`, and `irq_line` contains the IRQ line assigned to the device for interrupts. The specific meanings of the E1000 BARs are given in the second half of table 4-2.
-
-When the attach function of a device is called, the device has been found but not yet _enabled_. This means that the PCI code has not yet determined the resources allocated to the device, such as address space and an IRQ line, and, thus, the last three elements of the `struct pci_func` structure are not yet filled in. The attach function should call `pci_func_enable`, which will enable the device, negotiate these resources, and fill in the `struct pci_func`.
-
-```
-Exercise 3. Implement an attach function to initialize the E1000. Add an entry to the `pci_attach_vendor` array in `kern/pci.c` to trigger your function if a matching PCI device is found (be sure to put it before the `{0, 0, 0}` entry that mark the end of the table). You can find the vendor ID and device ID of the 82540EM that QEMU emulates in section 5.2. You should also see these listed when JOS scans the PCI bus while booting.
-
-For now, just enable the E1000 device via `pci_func_enable`. We'll add more initialization throughout the lab.
-
-We have provided the `kern/e1000.c` and `kern/e1000.h` files for you so that you do not need to mess with the build system. They are currently blank; you need to fill them in for this exercise. You may also need to include the `e1000.h` file in other places in the kernel.
-
-When you boot your kernel, you should see it print that the PCI function of the E1000 card was enabled. Your code should now pass the `pci attach` test of make grade.
-```
-
-##### Memory-mapped I/O
-
-Software communicates with the E1000 via _memory-mapped I/O_ (MMIO). You've seen this twice before in JOS: both the CGA console and the LAPIC are devices that you control and query by writing to and reading from "memory". But these reads and writes don't go to DRAM; they go directly to these devices.
-
-`pci_func_enable` negotiates an MMIO region with the E1000 and stores its base and size in BAR 0 (that is, `reg_base[0]` and `reg_size[0]`). This is a range of _physical memory addresses_ assigned to the device, which means you'll have to do something to access it via virtual addresses. Since MMIO regions are assigned very high physical addresses (typically above 3GB), you can't use `KADDR` to access it because of JOS's 256MB limit. Thus, you'll have to create a new memory mapping. We'll use the area above MMIOBASE (your `mmio_map_region` from lab 4 will make sure we don't overwrite the mapping used by the LAPIC). Since PCI device initialization happens before JOS creates user environments, you can create the mapping in `kern_pgdir` and it will always be available.
-
-```
-Exercise 4. In your attach function, create a virtual memory mapping for the E1000's BAR 0 by calling `mmio_map_region` (which you wrote in lab 4 to support memory-mapping the LAPIC).
-
-You'll want to record the location of this mapping in a variable so you can later access the registers you just mapped. Take a look at the `lapic` variable in `kern/lapic.c` for an example of one way to do this. If you do use a pointer to the device register mapping, be sure to declare it `volatile`; otherwise, the compiler is allowed to cache values and reorder accesses to this memory.
-
-To test your mapping, try printing out the device status register (section 13.4.2). This is a 4 byte register that starts at byte 8 of the register space. You should get `0x80080783`, which indicates a full duplex link is up at 1000 MB/s, among other things.
-```
-
-Hint: You'll need a lot of constants, like the locations of registers and values of bit masks. Trying to copy these out of the developer's manual is error-prone and mistakes can lead to painful debugging sessions. We recommend instead using QEMU's [`e1000_hw.h`][6] header as a guideline. We don't recommend copying it in verbatim, because it defines far more than you actually need and may not define things in the way you need, but it's a good starting point.
-
-##### DMA
-
-You could imagine transmitting and receiving packets by writing and reading from the E1000's registers, but this would be slow and would require the E1000 to buffer packet data internally. Instead, the E1000 uses _Direct Memory Access_ or DMA to read and write packet data directly from memory without involving the CPU. The driver is responsible for allocating memory for the transmit and receive queues, setting up DMA descriptors, and configuring the E1000 with the location of these queues, but everything after that is asynchronous. To transmit a packet, the driver copies it into the next DMA descriptor in the transmit queue and informs the E1000 that another packet is available; the E1000 will copy the data out of the descriptor when there is time to send the packet. Likewise, when the E1000 receives a packet, it copies it into the next DMA descriptor in the receive queue, which the driver can read from at its next opportunity.
-
-The receive and transmit queues are very similar at a high level. Both consist of a sequence of _descriptors_. While the exact structure of these descriptors varies, each descriptor contains some flags and the physical address of a buffer containing packet data (either packet data for the card to send, or a buffer allocated by the OS for the card to write a received packet to).
-
-The queues are implemented as circular arrays, meaning that when the card or the driver reach the end of the array, it wraps back around to the beginning. Both have a _head pointer_ and a _tail pointer_ and the contents of the queue are the descriptors between these two pointers. The hardware always consumes descriptors from the head and moves the head pointer, while the driver always add descriptors to the tail and moves the tail pointer. The descriptors in the transmit queue represent packets waiting to be sent (hence, in the steady state, the transmit queue is empty). For the receive queue, the descriptors in the queue are free descriptors that the card can receive packets into (hence, in the steady state, the receive queue consists of all available receive descriptors). Correctly updating the tail register without confusing the E1000 is tricky; be careful!
-
-The pointers to these arrays as well as the addresses of the packet buffers in the descriptors must all be _physical addresses_ because hardware performs DMA directly to and from physical RAM without going through the MMU.
-
-#### Transmitting Packets
-
-The transmit and receive functions of the E1000 are basically independent of each other, so we can work on one at a time. We'll attack transmitting packets first simply because we can't test receive without transmitting an "I'm here!" packet first.
-
-First, you'll have to initialize the card to transmit, following the steps described in section 14.5 (you don't have to worry about the subsections). The first step of transmit initialization is setting up the transmit queue. The precise structure of the queue is described in section 3.4 and the structure of the descriptors is described in section 3.3.3. We won't be using the TCP offload features of the E1000, so you can focus on the "legacy transmit descriptor format." You should read those sections now and familiarize yourself with these structures.
-
-##### C Structures
-
-You'll find it convenient to use C `struct`s to describe the E1000's structures. As you've seen with structures like the `struct Trapframe`, C `struct`s let you precisely layout data in memory. C can insert padding between fields, but the E1000's structures are laid out such that this shouldn't be a problem. If you do encounter field alignment problems, look into GCC's "packed" attribute.
-
-As an example, consider the legacy transmit descriptor given in table 3-8 of the manual and reproduced here:
-
-```
- 63 48 47 40 39 32 31 24 23 16 15 0
- +---------------------------------------------------------------+
- | Buffer address |
- +---------------|-------|-------|-------|-------|---------------+
- | Special | CSS | Status| Cmd | CSO | Length |
- +---------------|-------|-------|-------|-------|---------------+
-```
-
-The first byte of the structure starts at the top right, so to convert this into a C struct, read from right to left, top to bottom. If you squint at it right, you'll see that all of the fields even fit nicely into a standard-size types:
-
-```
- struct tx_desc
- {
- uint64_t addr;
- uint16_t length;
- uint8_t cso;
- uint8_t cmd;
- uint8_t status;
- uint8_t css;
- uint16_t special;
- };
-```
-
-Your driver will have to reserve memory for the transmit descriptor array and the packet buffers pointed to by the transmit descriptors. There are several ways to do this, ranging from dynamically allocating pages to simply declaring them in global variables. Whatever you choose, keep in mind that the E1000 accesses physical memory directly, which means any buffer it accesses must be contiguous in physical memory.
-
-There are also multiple ways to handle the packet buffers. The simplest, which we recommend starting with, is to reserve space for a packet buffer for each descriptor during driver initialization and simply copy packet data into and out of these pre-allocated buffers. The maximum size of an Ethernet packet is 1518 bytes, which bounds how big these buffers need to be. More sophisticated drivers could dynamically allocate packet buffers (e.g., to reduce memory overhead when network usage is low) or even pass buffers directly provided by user space (a technique known as "zero copy"), but it's good to start simple.
-
-```
-Exercise 5. Perform the initialization steps described in section 14.5 (but not its subsections). Use section 13 as a reference for the registers the initialization process refers to and sections 3.3.3 and 3.4 for reference to the transmit descriptors and transmit descriptor array.
-
-Be mindful of the alignment requirements on the transmit descriptor array and the restrictions on length of this array. Since TDLEN must be 128-byte aligned and each transmit descriptor is 16 bytes, your transmit descriptor array will need some multiple of 8 transmit descriptors. However, don't use more than 64 descriptors or our tests won't be able to test transmit ring overflow.
-
-For the TCTL.COLD, you can assume full-duplex operation. For TIPG, refer to the default values described in table 13-77 of section 13.4.34 for the IEEE 802.3 standard IPG (don't use the values in the table in section 14.5).
-```
-
-Try running make E1000_DEBUG=TXERR,TX qemu. If you are using the course qemu, you should see an "e1000: tx disabled" message when you set the TDT register (since this happens before you set TCTL.EN) and no further "e1000" messages.
-
-Now that transmit is initialized, you'll have to write the code to transmit a packet and make it accessible to user space via a system call. To transmit a packet, you have to add it to the tail of the transmit queue, which means copying the packet data into the next packet buffer and then updating the TDT (transmit descriptor tail) register to inform the card that there's another packet in the transmit queue. (Note that TDT is an _index_ into the transmit descriptor array, not a byte offset; the documentation isn't very clear about this.)
-
-However, the transmit queue is only so big. What happens if the card has fallen behind transmitting packets and the transmit queue is full? In order to detect this condition, you'll need some feedback from the E1000. Unfortunately, you can't just use the TDH (transmit descriptor head) register; the documentation explicitly states that reading this register from software is unreliable. However, if you set the RS bit in the command field of a transmit descriptor, then, when the card has transmitted the packet in that descriptor, the card will set the DD bit in the status field of the descriptor. If a descriptor's DD bit is set, you know it's safe to recycle that descriptor and use it to transmit another packet.
-
-What if the user calls your transmit system call, but the DD bit of the next descriptor isn't set, indicating that the transmit queue is full? You'll have to decide what to do in this situation. You could simply drop the packet. Network protocols are resilient to this, but if you drop a large burst of packets, the protocol may not recover. You could instead tell the user environment that it has to retry, much like you did for `sys_ipc_try_send`. This has the advantage of pushing back on the environment generating the data.
-
-```
-Exercise 6. Write a function to transmit a packet by checking that the next descriptor is free, copying the packet data into the next descriptor, and updating TDT. Make sure you handle the transmit queue being full.
-```
-
-Now would be a good time to test your packet transmit code. Try transmitting just a few packets by directly calling your transmit function from the kernel. You don't have to create packets that conform to any particular network protocol in order to test this. Run make E1000_DEBUG=TXERR,TX qemu to run your test. You should see something like
-
-```
- e1000: index 0: 0x271f00 : 9000002a 0
- ...
-```
-
-as you transmit packets. Each line gives the index in the transmit array, the buffer address of that transmit descriptor, the cmd/CSO/length fields, and the special/CSS/status fields. If QEMU doesn't print the values you expected from your transmit descriptor, check that you're filling in the right descriptor and that you configured TDBAL and TDBAH correctly. If you get "e1000: TDH wraparound @0, TDT x, TDLEN y" messages, that means the E1000 ran all the way through the transmit queue without stopping (if QEMU didn't check this, it would enter an infinite loop), which probably means you aren't manipulating TDT correctly. If you get lots of "e1000: tx disabled" messages, then you didn't set the transmit control register right.
-
-Once QEMU runs, you can then run tcpdump -XXnr qemu.pcap to see the packet data that you transmitted. If you saw the expected "e1000: index" messages from QEMU, but your packet capture is empty, double check that you filled in every necessary field and bit in your transmit descriptors (the E1000 probably went through your transmit descriptors, but didn't think it had to send anything).
-
-```
-Exercise 7. Add a system call that lets you transmit packets from user space. The exact interface is up to you. Don't forget to check any pointers passed to the kernel from user space.
-```
-
-#### Transmitting Packets: Network Server
-
-Now that you have a system call interface to the transmit side of your device driver, it's time to send packets. The output helper environment's goal is to do the following in a loop: accept `NSREQ_OUTPUT` IPC messages from the core network server and send the packets accompanying these IPC message to the network device driver using the system call you added above. The `NSREQ_OUTPUT` IPC's are sent by the `low_level_output` function in `net/lwip/jos/jif/jif.c`, which glues the lwIP stack to JOS's network system. Each IPC will include a page consisting of a `union Nsipc` with the packet in its `struct jif_pkt pkt` field (see `inc/ns.h`). `struct jif_pkt` looks like
-
-```
- struct jif_pkt {
- int jp_len;
- char jp_data[0];
- };
-```
-
-`jp_len` represents the length of the packet. All subsequent bytes on the IPC page are dedicated to the packet contents. Using a zero-length array like `jp_data` at the end of a struct is a common C trick (some would say abomination) for representing buffers without pre-determined lengths. Since C doesn't do array bounds checking, as long as you ensure there's enough unused memory following the struct, you can use `jp_data` as if it were an array of any size.
-
-Be aware of the interaction between the device driver, the output environment and the core network server when there is no more space in the device driver's transmit queue. The core network server sends packets to the output environment using IPC. If the output environment is suspended due to a send packet system call because the driver has no more buffer space for new packets, the core network server will block waiting for the output server to accept the IPC call.
-
-```
-Exercise 8. Implement `net/output.c`.
-```
-
-You can use `net/testoutput.c` to test your output code without involving the whole network server. Try running make E1000_DEBUG=TXERR,TX run-net_testoutput. You should see something like
-
-```
- Transmitting packet 0
- e1000: index 0: 0x271f00 : 9000009 0
- Transmitting packet 1
- e1000: index 1: 0x2724ee : 9000009 0
- ...
-```
-
-and tcpdump -XXnr qemu.pcap should output
-
-
-```
- reading from file qemu.pcap, link-type EN10MB (Ethernet)
- -5:00:00.600186 [|ether]
- 0x0000: 5061 636b 6574 2030 30 Packet.00
- -5:00:00.610080 [|ether]
- 0x0000: 5061 636b 6574 2030 31 Packet.01
- ...
-```
-
-To test with a larger packet count, try make E1000_DEBUG=TXERR,TX NET_CFLAGS=-DTESTOUTPUT_COUNT=100 run-net_testoutput. If this overflows your transmit ring, double check that you're handling the DD status bit correctly and that you've told the hardware to set the DD status bit (using the RS command bit).
-
-Your code should pass the `testoutput` tests of make grade.
-
-```
-Question
-
- 1. How did you structure your transmit implementation? In particular, what do you do if the transmit ring is full?
-```
-
-
-### Part B: Receiving packets and the web server
-
-#### Receiving Packets
-
-Just like you did for transmitting packets, you'll have to configure the E1000 to receive packets and provide a receive descriptor queue and receive descriptors. Section 3.2 describes how packet reception works, including the receive queue structure and receive descriptors, and the initialization process is detailed in section 14.4.
-
-```
-Exercise 9. Read section 3.2. You can ignore anything about interrupts and checksum offloading (you can return to these sections if you decide to use these features later), and you don't have to be concerned with the details of thresholds and how the card's internal caches work.
-```
-
-The receive queue is very similar to the transmit queue, except that it consists of empty packet buffers waiting to be filled with incoming packets. Hence, when the network is idle, the transmit queue is empty (because all packets have been sent), but the receive queue is full (of empty packet buffers).
-
-When the E1000 receives a packet, it first checks if it matches the card's configured filters (for example, to see if the packet is addressed to this E1000's MAC address) and ignores the packet if it doesn't match any filters. Otherwise, the E1000 tries to retrieve the next receive descriptor from the head of the receive queue. If the head (RDH) has caught up with the tail (RDT), then the receive queue is out of free descriptors, so the card drops the packet. If there is a free receive descriptor, it copies the packet data into the buffer pointed to by the descriptor, sets the descriptor's DD (Descriptor Done) and EOP (End of Packet) status bits, and increments the RDH.
-
-If the E1000 receives a packet that is larger than the packet buffer in one receive descriptor, it will retrieve as many descriptors as necessary from the receive queue to store the entire contents of the packet. To indicate that this has happened, it will set the DD status bit on all of these descriptors, but only set the EOP status bit on the last of these descriptors. You can either deal with this possibility in your driver, or simply configure the card to not accept "long packets" (also known as _jumbo frames_ ) and make sure your receive buffers are large enough to store the largest possible standard Ethernet packet (1518 bytes).
-
-```
-Exercise 10. Set up the receive queue and configure the E1000 by following the process in section 14.4. You don't have to support "long packets" or multicast. For now, don't configure the card to use interrupts; you can change that later if you decide to use receive interrupts. Also, configure the E1000 to strip the Ethernet CRC, since the grade script expects it to be stripped.
-
-By default, the card will filter out _all_ packets. You have to configure the Receive Address Registers (RAL and RAH) with the card's own MAC address in order to accept packets addressed to that card. You can simply hard-code QEMU's default MAC address of 52:54:00:12:34:56 (we already hard-code this in lwIP, so doing it here too doesn't make things any worse). Be very careful with the byte order; MAC addresses are written from lowest-order byte to highest-order byte, so 52:54:00:12 are the low-order 32 bits of the MAC address and 34:56 are the high-order 16 bits.
-
-The E1000 only supports a specific set of receive buffer sizes (given in the description of RCTL.BSIZE in 13.4.22). If you make your receive packet buffers large enough and disable long packets, you won't have to worry about packets spanning multiple receive buffers. Also, remember that, just like for transmit, the receive queue and the packet buffers must be contiguous in physical memory.
-
-You should use at least 128 receive descriptors
-```
-
-You can do a basic test of receive functionality now, even without writing the code to receive packets. Run make E1000_DEBUG=TX,TXERR,RX,RXERR,RXFILTER run-net_testinput. `testinput` will transmit an ARP (Address Resolution Protocol) announcement packet (using your packet transmitting system call), which QEMU will automatically reply to. Even though your driver can't receive this reply yet, you should see a "e1000: unicast match[0]: 52:54:00:12:34:56" message, indicating that a packet was received by the E1000 and matched the configured receive filter. If you see a "e1000: unicast mismatch: 52:54:00:12:34:56" message instead, the E1000 filtered out the packet, which means you probably didn't configure RAL and RAH correctly. Make sure you got the byte ordering right and didn't forget to set the "Address Valid" bit in RAH. If you don't get any "e1000" messages, you probably didn't enable receive correctly.
-
-Now you're ready to implement receiving packets. To receive a packet, your driver will have to keep track of which descriptor it expects to hold the next received packet (hint: depending on your design, there's probably already a register in the E1000 keeping track of this). Similar to transmit, the documentation states that the RDH register cannot be reliably read from software, so in order to determine if a packet has been delivered to this descriptor's packet buffer, you'll have to read the DD status bit in the descriptor. If the DD bit is set, you can copy the packet data out of that descriptor's packet buffer and then tell the card that the descriptor is free by updating the queue's tail index, RDT.
-
-If the DD bit isn't set, then no packet has been received. This is the receive-side equivalent of when the transmit queue was full, and there are several things you can do in this situation. You can simply return a "try again" error and require the caller to retry. While this approach works well for full transmit queues because that's a transient condition, it is less justifiable for empty receive queues because the receive queue may remain empty for long stretches of time. A second approach is to suspend the calling environment until there are packets in the receive queue to process. This tactic is very similar to `sys_ipc_recv`. Just like in the IPC case, since we have only one kernel stack per CPU, as soon as we leave the kernel the state on the stack will be lost. We need to set a flag indicating that an environment has been suspended by receive queue underflow and record the system call arguments. The drawback of this approach is complexity: the E1000 must be instructed to generate receive interrupts and the driver must handle them in order to resume the environment blocked waiting for a packet.
-
-```
-Exercise 11. Write a function to receive a packet from the E1000 and expose it to user space by adding a system call. Make sure you handle the receive queue being empty.
-```
-
-```
-Challenge! If the transmit queue is full or the receive queue is empty, the environment and your driver may spend a significant amount of CPU cycles polling, waiting for a descriptor. The E1000 can generate an interrupt once it is finished with a transmit or receive descriptor, avoiding the need for polling. Modify your driver so that processing the both the transmit and receive queues is interrupt driven instead of polling.
-
-Note that, once an interrupt is asserted, it will remain asserted until the driver clears the interrupt. In your interrupt handler make sure to clear the interrupt as soon as you handle it. If you don't, after returning from your interrupt handler, the CPU will jump back into it again. In addition to clearing the interrupts on the E1000 card, interrupts also need to be cleared on the LAPIC. Use `lapic_eoi` to do so.
-```
-
-#### Receiving Packets: Network Server
-
-In the network server input environment, you will need to use your new receive system call to receive packets and pass them to the core network server environment using the `NSREQ_INPUT` IPC message. These IPC input message should have a page attached with a `union Nsipc` with its `struct jif_pkt pkt` field filled in with the packet received from the network.
-
-```
-Exercise 12. Implement `net/input.c`.
-```
-
-Run `testinput` again with make E1000_DEBUG=TX,TXERR,RX,RXERR,RXFILTER run-net_testinput. You should see
-
-```
- Sending ARP announcement...
- Waiting for packets...
- e1000: index 0: 0x26dea0 : 900002a 0
- e1000: unicast match[0]: 52:54:00:12:34:56
- input: 0000 5254 0012 3456 5255 0a00 0202 0806 0001
- input: 0010 0800 0604 0002 5255 0a00 0202 0a00 0202
- input: 0020 5254 0012 3456 0a00 020f 0000 0000 0000
- input: 0030 0000 0000 0000 0000 0000 0000 0000 0000
-```
-
-The lines beginning with "input:" are a hexdump of QEMU's ARP reply.
-
-Your code should pass the `testinput` tests of make grade. Note that there's no way to test packet receiving without sending at least one ARP packet to inform QEMU of JOS' IP address, so bugs in your transmitting code can cause this test to fail.
-
-To more thoroughly test your networking code, we have provided a daemon called `echosrv` that sets up an echo server running on port 7 that will echo back anything sent over a TCP connection. Use make E1000_DEBUG=TX,TXERR,RX,RXERR,RXFILTER run-echosrv to start the echo server in one terminal and make nc-7 in another to connect to it. Every line you type should be echoed back by the server. Every time the emulated E1000 receives a packet, QEMU should print something like the following to the console:
-
-```
- e1000: unicast match[0]: 52:54:00:12:34:56
- e1000: index 2: 0x26ea7c : 9000036 0
- e1000: index 3: 0x26f06a : 9000039 0
- e1000: unicast match[0]: 52:54:00:12:34:56
-```
-
-At this point, you should also be able to pass the `echosrv` test.
-
-```
-Question
-
- 2. How did you structure your receive implementation? In particular, what do you do if the receive queue is empty and a user environment requests the next incoming packet?
-```
-
-
-```
-Challenge! Read about the EEPROM in the developer's manual and write the code to load the E1000's MAC address out of the EEPROM. Currently, QEMU's default MAC address is hard-coded into both your receive initialization and lwIP. Fix your initialization to use the MAC address you read from the EEPROM, add a system call to pass the MAC address to lwIP, and modify lwIP to the MAC address read from the card. Test your change by configuring QEMU to use a different MAC address.
-```
-
-```
-Challenge! Modify your E1000 driver to be "zero copy." Currently, packet data has to be copied from user-space buffers to transmit packet buffers and from receive packet buffers back to user-space buffers. A zero copy driver avoids this by having user space and the E1000 share packet buffer memory directly. There are many different approaches to this, including mapping the kernel-allocated structures into user space or passing user-provided buffers directly to the E1000. Regardless of your approach, be careful how you reuse buffers so that you don't introduce races between user-space code and the E1000.
-```
-
-```
-Challenge! Take the zero copy concept all the way into lwIP.
-
-A typical packet is composed of many headers. The user sends data to be transmitted to lwIP in one buffer. The TCP layer wants to add a TCP header, the IP layer an IP header and the MAC layer an Ethernet header. Even though there are many parts to a packet, right now the parts need to be joined together so that the device driver can send the final packet.
-
-The E1000's transmit descriptor design is well-suited to collecting pieces of a packet scattered throughout memory, like the packet fragments created inside lwIP. If you enqueue multiple transmit descriptors, but only set the EOP command bit on the last one, then the E1000 will internally concatenate the packet buffers from these descriptors and only transmit the concatenated buffer when it reaches the EOP-marked descriptor. As a result, the individual packet pieces never need to be joined together in memory.
-
-Change your driver to be able to send packets composed of many buffers without copying and modify lwIP to avoid merging the packet pieces as it does right now.
-```
-
-```
-Challenge! Augment your system call interface to service more than one user environment. This will prove useful if there are multiple network stacks (and multiple network servers) each with their own IP address running in user mode. The receive system call will need to decide to which environment it needs to forward each incoming packet.
-
-Note that the current interface cannot tell the difference between two packets and if multiple environments call the packet receive system call, each respective environment will get a subset of the incoming packets and that subset may include packets that are not destined to the calling environment.
-
-Sections 2.2 and 3 in [this][7] Exokernel paper have an in-depth explanation of the problem and a method of addressing it in a kernel like JOS. Use the paper to help you get a grip on the problem, chances are you do not need a solution as complex as presented in the paper.
-```
-
-#### The Web Server
-
-A web server in its simplest form sends the contents of a file to the requesting client. We have provided skeleton code for a very simple web server in `user/httpd.c`. The skeleton code deals with incoming connections and parses the headers.
-
-```
-Exercise 13. The web server is missing the code that deals with sending the contents of a file back to the client. Finish the web server by implementing `send_file` and `send_data`.
-```
-
-Once you've finished the web server, start the webserver (make run-httpd-nox) and point your favorite browser at http:// _host_ : _port_ /index.html, where _host_ is the name of the computer running QEMU (If you're running QEMU on athena use `hostname.mit.edu` (hostname is the output of the `hostname` command on athena, or `localhost` if you're running the web browser and QEMU on the same computer) and _port_ is the port number reported for the web server by make which-ports . You should see a web page served by the HTTP server running inside JOS.
-
-At this point, you should score 105/105 on make grade.
-
-```
-Challenge! Add a simple chat server to JOS, where multiple people can connect to the server and anything that any user types is transmitted to the other users. To do this, you will have to find a way to communicate with multiple sockets at once _and_ to send and receive on the same socket at the same time. There are multiple ways to go about this. lwIP provides a MSG_DONTWAIT flag for recv (see `lwip_recvfrom` in `net/lwip/api/sockets.c`), so you could constantly loop through all open sockets, polling them for data. Note that, while `recv` flags are supported by the network server IPC, they aren't accessible via the regular `read` function, so you'll need a way to pass the flags. A more efficient approach is to start one or more environments for each connection and to use IPC to coordinate them. Conveniently, the lwIP socket ID found in the struct Fd for a socket is global (not per-environment), so, for example, the child of a `fork` inherits its parents sockets. Or, an environment can even send on another environment's socket simply by constructing an Fd containing the right socket ID.
-```
-
-```
-Question
-
- 3. What does the web page served by JOS's web server say?
- 4. How long approximately did it take you to do this lab?
-```
-
-
-**This completes the lab.** As usual, don't forget to run make grade and to write up your answers and a description of your challenge exercise solution. Before handing in, use git status and git diff to examine your changes and don't forget to git add answers-lab6.txt. When you're ready, commit your changes with git commit -am 'my solutions to lab 6', then make handin and follow the directions.
-
---------------------------------------------------------------------------------
-
-via: https://pdos.csail.mit.edu/6.828/2018/labs/lab6/
-
-作者:[csail.mit][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://pdos.csail.mit.edu
-[b]: https://github.com/lujun9972
-[1]: http://wiki.qemu.org/download/qemu-doc.html#Using-the-user-mode-network-stack
-[2]: http://www.wireshark.org/
-[3]: http://www.sics.se/~adam/lwip/
-[4]: https://pdos.csail.mit.edu/6.828/2018/labs/lab6/ns.png
-[5]: https://pdos.csail.mit.edu/6.828/2018/readings/hardware/8254x_GBe_SDM.pdf
-[6]: https://pdos.csail.mit.edu/6.828/2018/labs/lab6/e1000_hw.h
-[7]: http://pdos.csail.mit.edu/papers/exo:tocs.pdf
diff --git a/sources/tech/20181025 Monitoring database health and behavior- Which metrics matter.md b/sources/tech/20181025 Monitoring database health and behavior- Which metrics matter.md
deleted file mode 100644
index 520f08342b..0000000000
--- a/sources/tech/20181025 Monitoring database health and behavior- Which metrics matter.md
+++ /dev/null
@@ -1,82 +0,0 @@
-Monitoring database health and behavior: Which metrics matter?
-======
-Monitoring your database can be overwhelming or seem not important. Here's how to do it right.
-
-
-We don’t talk about our databases enough. In this age of instrumentation, we monitor our applications, our infrastructure, and even our users, but we sometimes forget that our database deserves monitoring, too. That’s largely because most databases do their job so well that we simply trust them to do it. Trust is great, but confirmation of our assumptions is even better.
-
-
-
-### Why monitor your databases?
-
-There are plenty of reasons to monitor your databases, most of which are the same reasons you'd monitor any other part of your systems: Knowing what’s going on in the various components of your applications makes you a better-informed developer who makes smarter decisions.
-
-
-
-More specifically, databases are great indicators of system health and behavior. Odd behavior in the database can point to problem areas in your applications. Alternately, when there’s odd behavior in your application, you can use database metrics to help expedite the debugging process.
-
-### The problem
-
-The slightest investigation reveals one problem with monitoring databases: Databases have a lot of metrics. "A lot" is an understatement—if you were Scrooge McDuck, you could swim through all of the metrics available. If this were Wrestlemania, the metrics would be folding chairs. Monitoring them all doesn’t seem practical, so how do you decide which metrics to monitor?
-
-
-
-### The solution
-
-The best way to start monitoring databases is to identify some foundational, database-agnostic metrics. These metrics create a great start to understanding the lives of your databases.
-
-### Throughput: How much is the database doing?
-
-The easiest way to start monitoring a database is to track the number of requests the database receives. We have high expectations for our databases; we expect them to store data reliably and handle all of the queries we throw at them, which could be one massive query a day or millions of queries from users all day long. Throughput can tell you which of those is true.
-
-You can also group requests by type (reads, writes, server-side, client-side, etc.) to begin analyzing the traffic.
-
-### Execution time: How long does it take the database to do its job?
-
-This metric seems obvious, but it often gets overlooked. You don’t just want to know how many requests the database received, but also how long the database spent on each request. It’s important to approach execution time with context, though: What's slow for a time-series database like InfluxDB isn’t the same as what's slow for a relational database like MySQL. Slow in InfluxDB might mean milliseconds, whereas MySQL’s default value for its `SLOW_QUERY` variable is ten seconds.
-
-
-
-Monitoring execution time is not the same thing as improving execution time, so beware of the temptation to spend time on optimizations if you have other problems in your app to fix.
-
-### Concurrency: How many jobs is the database doing at the same time?
-
-Once you know how many requests the database is handling and how long each one takes, you need to add a layer of complexity to start getting real value from these metrics.
-
-If the database receives ten requests and each one takes ten seconds to complete, is the database busy for 100 seconds, ten seconds—or somewhere in between? The number of concurrent tasks changes the way the database’s resources are used. When you consider things like the number of connections and threads, you’ll start to get a fuller picture of your database metrics.
-
-Concurrency can also affect latency, which includes not only the time it takes for the task to be completed (execution time) but also the time the task needs to wait before it’s handled.
-
-### Utilization: What percentage of the time was the database busy?
-
-Utilization is a culmination of throughput, execution time, and concurrency to determine how often the database was available—or alternatively, how often the database was too busy to respond to a request.
-
-
-
-This metric is particularly useful for determining the overall health and performance of your database. If it’s available to respond to requests only 80% of the time, you can reallocate resources, work on optimization, or otherwise make changes to get closer to high availability.
-
-### The good news
-
-It can seem overwhelming to monitor and analyze, especially because most of us aren’t database experts and we may not have time to devote to understanding these metrics. But the good news is that most of this work is already done for us. Many databases have an internal performance database (Postgres: pg_stats, CouchDB: Runtime_Statistics, InfluxDB: _internal, etc.), which is designed by database engineers to monitor the metrics that matter for that particular database. You can see things as broad as the number of slow queries or as detailed as the average microseconds each event in the database takes.
-
-### Conclusion
-
-Databases create enough metrics to keep us all busy for a long time, and while the internal performance databases are full of useful information, it’s not always clear which metrics you should care about. Start with throughput, execution time, concurrency, and utilization, which provide enough information for you to start understanding the patterns in your database.
-
-
-
-Are you monitoring your databases? Which metrics have you found to be useful? Tell me about it!
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/10/database-metrics-matter
-
-作者:[Katy Farmer][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://opensource.com/users/thekatertot
-[b]: https://github.com/lujun9972
diff --git a/sources/tech/20181026 An Overview of Android Pie.md b/sources/tech/20181026 An Overview of Android Pie.md
deleted file mode 100644
index 9fa365327f..0000000000
--- a/sources/tech/20181026 An Overview of Android Pie.md
+++ /dev/null
@@ -1,138 +0,0 @@
-An Overview of Android Pie
-======
-
-
-
-Let’s talk about Android for a moment. Yes, I know it’s only Linux by way of a modified kernel, but what isn’t these days? And seeing as how the developers of Android have released what many (including yours truly) believe to be the most significant evolution of the platform to date, there’s plenty to talk about. Of course, before we get into that, it does need to be mentioned (and most of you will already know this) that the whole of Android isn’t open source. Although much of it is, when you get into the bits that connect to Google services, things start to close up. One major service is the Google Play Store, a functionality that is very much proprietary. But this isn’t about how much of Android is open or closed, this is about Pie.
-Delicious, nutritious … efficient and battery-saving Pie.
-
-I’ve been working with Android Pie on my Essential PH-1 daily driver (a phone that I really love, but understand how shaky the ground is under the company). After using Android Pie for a while now, I can safely say you want it. It’s that good. But what about the ninth release of Android makes it so special? Let’s dig in and find out. Our focus will be on the aspects that affect users, not developers, so I won’t dive deep into the underlying works.
-
-### Gesture-Based Navigation
-
-Much has been made about Android’s new gesture-based navigation—much of it not good. To be honest, this was a feature that aroused all of my curiosity. When it was first announced, no one really had much of an idea what it would be like. Would users be working with multi touch gestures to navigate around the Android interface? Or would this be something completely different.
-
-
-![Android Pie][2]
-
-Figure 1: The Android Pie recent apps overview.
-
-[Used with permission][3]
-
-The reality is, gesture-based navigation is much more subtle and simple than what most assumed. And it all boils down to the Home button. With gesture-based navigation enabled, the Home button and the Recents button have been combined into a single feature. This means, in order to gain access to your recent apps, you can’t simply tap that square Recents button. Instead, the Recent apps overview (Figure 1) is opened with a short swipe up from the home button.
-
-Another change is how the App Drawer is accessed. In similar fashion to opening the Recents overview, the App Drawer is opened via a long swipe up from the Home button.
-
-As for the back button? It’s not been removed. Instead, what you’ll find is it appears (in the left side of the home screen dock) when an app calls for it. Sometimes that back button will appear, even if an app includes its own back button.
-
-Thing is, however, if you don’t like gesture-based navigation, you can disable it. To do so, follow these steps:
-
- 1. Open Settings
-
- 2. Scroll down and tap System > Gestures
-
- 3. Tap Swipe up on Home button
-
- 4. Tap the On/Off slider (Figure 2) until it’s in the Off position
-
-
-
-
-### Battery Life
-
-AI has become a crucial factor in Android. In fact, it is AI that has helped to greatly improve battery life in Android. This new feature is called Adaptive Battery and works by prioritizing battery power for the apps and services you use most. By using AI, Android learns how you use your Apps and, after a short period, can then shut down unused apps, so they aren’t draining your battery while waiting in memory.
-
-The only caveat to Adaptive Battery is, should the AI pick up “bad habits” and your battery start to prematurely drain, the only way to reset the function is by way of a factory reset. Even with that small oversight, the improvement in battery life from Android Oreo to Pie is significant.
-
-### Changes to Split Screen
-
-Split Screen has been available to Android for some time. However, with Android Pie, how it’s used has slightly changed. This change only affects those who have gesture-based navigation enabled (otherwise, it remains the same). In order to work with Split Screen on Android 9.0, follow these steps:
-
-![Adding an app][5]
-
-Figure 3: Adding an app to split screen mode in Android Pie.
-
-[Used with permission][3]
-
- 1. Swipe upward from the Home button to open the Recent apps overview.
-
- 2. Locate the app you want to place in the top portion of the screen.
-
- 3. Long press the app’s circle icon (located at the top of the app card) to reveal a new popup menu (Figure 3)
-
- 4. Tap Split Screen and the app will open in the top half of the screen.
-
- 5. Locate the second app you want to open and, tap it to add it to the bottom half of the screen.
-
-
-
-
-Using Split Screen and closing apps with the feature remains the same as it was.
-
-###
-
-![Actions][7]
-
-Figure 4: Android App Actions in action.
-
-[Used with permission][3]
-
-### App Actions
-
-This is another feature that was introduced some time ago, but was given some serious attention for the release of Android Pie. App Actions make it such that you can do certain things with an app, directly from the apps launcher.
-
-For instance, if you long-press the GMail launcher, you can select to reply to a recent email, or compose a new email. Back in Android Oreo, that feature came in the form of a popup list of actions. With Android Pie, the feature now better fits with the Material Design scheme of things (Figure 4).
-
-![Sound control][9]
-
-Figure 5: Sound control in Android Pie.
-
-[Used with permission][3]
-
-### Sound Controls
-
-Ah, the ever-changing world of sound controls on Android. Android Oreo had an outstanding method of controlling your sound, by way of minor tweaks to the Do Not Disturb feature. With Android Pie, that feature finds itself in a continued state of evolution.
-
-What Android Pie nailed is the quick access buttons to controlling sound on a device. Now, if you press either the volume up or down button, you’ll see a new popup menu that allows you to control if your device is silenced and/or vibrations are muted. By tapping the top icon in that popup menu (Figure 5), you can cycle through silence, mute, or full sound.
-
-### Screenshots
-
-Because I write about Android, I tend to take a lot of screenshots. With Android Pie came one of my favorite improvements: sharing screenshots. Instead of having to open Google Photos, locate the screenshot to be shared, open the image, and share the image, Pie gives you a pop-up menu (after you take a screenshot) that allows you to share, edit, or delete the image in question.
-
-![Sharing ][11]
-
-Figure 6: Sharing screenshots just got a whole lot easier.
-
-[Used with permission][3]
-
-If you want to share the screenshot, take it, wait for the menu to pop up, tap Share (Figure 6), and then share it from the standard Android sharing menu.
-
-### A More Satisfying Android Experience
-
-The ninth iteration of Android has brought about a far more satisfying user experience. What I’ve illustrated only scratches the surface of what Android Pie brings to the table. For more information, check out Google’s official [Android Pie website][12]. And if your device has yet to receive the upgrade, have a bit of patience. Pie is well worth the wait.
-
---------------------------------------------------------------------------------
-
-via: https://www.linux.com/learn/2018/10/overview-android-pie
-
-作者:[Jack Wallen][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://www.linux.com/users/jlwallen
-[b]: https://github.com/lujun9972
-[1]: /files/images/pie1png
-[2]: https://www.linux.com/sites/lcom/files/styles/floated_images/public/pie_1.png?itok=BsSe8kqS (Android Pie)
-[3]: /licenses/category/used-permission
-[4]: /files/images/pie3png
-[5]: https://www.linux.com/sites/lcom/files/styles/floated_images/public/pie_3.png?itok=F-NB1dqI (Adding an app)
-[6]: /files/images/pie4png
-[7]: https://www.linux.com/sites/lcom/files/styles/floated_images/public/pie_4.png?itok=Ex-NzYSo (Actions)
-[8]: /files/images/pie5png
-[9]: https://www.linux.com/sites/lcom/files/styles/floated_images/public/pie_5.png?itok=NMW2vIlL (Sound control)
-[10]: /files/images/pie6png
-[11]: https://www.linux.com/sites/lcom/files/styles/floated_images/public/pie_6.png?itok=7Ik8_4jC (Sharing )
-[12]: https://www.android.com/versions/pie-9-0/
diff --git a/sources/tech/20181030 How Do We Find Out The Installed Packages Came From Which Repository.md b/sources/tech/20181030 How Do We Find Out The Installed Packages Came From Which Repository.md
deleted file mode 100644
index 203ed2f4f2..0000000000
--- a/sources/tech/20181030 How Do We Find Out The Installed Packages Came From Which Repository.md
+++ /dev/null
@@ -1,369 +0,0 @@
-zianglei translating
-How Do We Find Out The Installed Packages Came From Which Repository?
-======
-Sometimes you might want to know the installed packages came from which repository. This will helps you to troubleshoot when you are facing the package conflict issue.
-
-Because [third party vendor repositories][1] are holding the latest version of package and sometime it will causes the issue when you are trying to install any packages due to incompatibility.
-
-Everything is possible in Linux because you can able to install a packages on your system even though when the package is not available on your distribution.
-
-Also, you can able to install a package with latest version when your distribution don’t have it. How?
-
-That’s why third party repositories are came in the picture. They are allowing users to install all the available packages from their repositories.
-
-Almost all the distributions are allowing third party repositories. Some of the distribution officially suggesting few of third party repositories which are not replacing the base packages badly like CentOS officially suggesting us to install [EPEL repository][2].
-
-[List of Major repositories][1] and it’s details are below.
-
- * **`CentOS:`** [EPEL][2], [ELRepo][3], etc is [CentOS Community Approved Repositories][4].
- * **`Fedora:`** [RPMfusion repo][5] is commonly used by most of the [Fedora][6] users.
- * **`ArchLinux:`** ArchLinux community repository contains packages that have been adopted by Trusted Users from the Arch User Repository.
- * **`openSUSE:`** [Packman repo][7] offers various additional packages for openSUSE, especially but not limited to multimedia related applications and libraries that are on the openSUSE Build Service application blacklist. It’s the largest external repository of openSUSE packages.
- * **`Ubuntu:`** Personal Package Archives (PPAs) are a kind of repository. Developers create them in order to distribute their software. You can find this information on the PPA’s Launchpad page. Also, you can enable Cananical partners repositories.
-
-
-
-### What Is Repository?
-
-A software repository is a central place which stores the software packages for the particular application.
-
-All the Linux distributions are maintaining their own repositories and they allow users to retrieve and install packages on their machine.
-
-Each vendor offered a unique package management tool to manage their repositories such as search, install, update, upgrade, remove, etc.
-
-Most of the Linux distributions comes as freeware except RHEL and SUSE. To access their repositories you need to buy a subscriptions.
-
-### Why do we need to enable third party repositories?
-
-In Linux, installing a package from source is not advisable as this might cause so many issues while upgrading the package or system that’s why we are advised to install a package from repo instead of source.
-
-### How Do We Find Out The Installed Packages Came From Which Repository on RHEL/CentOS Systems?
-
-This can be done in multiple ways. Here we will be giving you all the possible options and you can choose which one is best for you.
-
-### Method-1: Using Yum Command
-
-RHEL & CentOS systems are using RPM packages hence we can use the [Yum Package Manager][8] to get this information.
-
-YUM stands for Yellowdog Updater, Modified is an open-source command-line front-end package-management utility for RPM based systems such as Red Hat Enterprise Linux (RHEL) and CentOS.
-
-Yum is the primary tool for getting, installing, deleting, querying, and managing RPM packages from distribution repositories, as well as other third-party repositories.
-
-```
-# yum info apachetop
-Loaded plugins: fastestmirror
-Loading mirror speeds from cached hostfile
- * epel: epel.mirror.constant.com
-Installed Packages
-Name : apachetop
-Arch : x86_64
-Version : 0.15.6
-Release : 1.el7
-Size : 65 k
-Repo : installed
-From repo : epel
-Summary : A top-like display of Apache logs
-URL : https://github.com/tessus/apachetop
-License : BSD
-Description : ApacheTop watches a logfile generated by Apache (in standard common or
- : combined logformat, although it doesn't (yet) make use of any of the extra
- : fields in combined) and generates human-parsable output in realtime.
-```
-
-The **`apachetop`** package is coming from **`epel repo`**.
-
-### Method-2: Using Yumdb Command
-
-Yumdb info provides information similar to yum info but additionally it provides package checksum data, type, user info (who installed the package). Since yum 3.2.26 yum has started storing additional information outside of the rpmdatabase (where user indicates it was installed by the user, and dep means it was brought in as a dependency).
-
-```
-# yumdb info lighttpd
-Loaded plugins: fastestmirror
-lighttpd-1.4.50-1.el7.x86_64
- checksum_data = a24d18102ed40148cfcc965310a516050ed437d728eeeefb23709486783a4d37
- checksum_type = sha256
- command_line = --enablerepo=epel install lighttpd apachetop aria2 atop axel
- from_repo = epel
- from_repo_revision = 1540756729
- from_repo_timestamp = 1540757483
- installed_by = 0
- origin_url = https://epel.mirror.constant.com/7/x86_64/Packages/l/lighttpd-1.4.50-1.el7.x86_64.rpm
- reason = user
- releasever = 7
- var_contentdir = centos
- var_infra = stock
- var_uuid = ce328b07-9c0a-4765-b2ad-59d96a257dc8
-```
-
-The **`lighttpd`** package is coming from **`epel repo`**.
-
-### Method-3: Using RPM Command
-
-[RPM command][9] stands for Red Hat Package Manager is a powerful, command line Package Management utility for Red Hat based system such as (RHEL, CentOS, Fedora, openSUSE & Mageia) distributions.
-
-The utility allow you to install, upgrade, remove, query & verify the software on your Linux system/server. RPM files comes with .rpm extension. RPM package built with required libraries and dependency which will not conflicts other packages were installed on your system.
-
-```
-# rpm -qi apachetop
-Name : apachetop
-Version : 0.15.6
-Release : 1.el7
-Architecture: x86_64
-Install Date: Mon 29 Oct 2018 06:47:49 AM EDT
-Group : Applications/Internet
-Size : 67020
-License : BSD
-Signature : RSA/SHA256, Mon 22 Jun 2015 09:30:26 AM EDT, Key ID 6a2faea2352c64e5
-Source RPM : apachetop-0.15.6-1.el7.src.rpm
-Build Date : Sat 20 Jun 2015 09:02:37 PM EDT
-Build Host : buildvm-22.phx2.fedoraproject.org
-Relocations : (not relocatable)
-Packager : Fedora Project
-Vendor : Fedora Project
-URL : https://github.com/tessus/apachetop
-Summary : A top-like display of Apache logs
-Description :
-ApacheTop watches a logfile generated by Apache (in standard common or
-combined logformat, although it doesn't (yet) make use of any of the extra
-fields in combined) and generates human-parsable output in realtime.
-```
-
-The **`apachetop`** package is coming from **`epel repo`**.
-
-### Method-4: Using Repoquery Command
-
-repoquery is a program for querying information from YUM repositories similarly to rpm queries.
-
-```
-# repoquery -i httpd
-
-Name : httpd
-Version : 2.4.6
-Release : 80.el7.centos.1
-Architecture: x86_64
-Size : 9817285
-Packager : CentOS BuildSystem
-Group : System Environment/Daemons
-URL : http://httpd.apache.org/
-Repository : updates
-Summary : Apache HTTP Server
-Source : httpd-2.4.6-80.el7.centos.1.src.rpm
-Description :
-The Apache HTTP Server is a powerful, efficient, and extensible
-web server.
-```
-
-The **`httpd`** package is coming from **`CentOS updates repo`**.
-
-### How Do We Find Out The Installed Packages Came From Which Repository on Fedora System?
-
-DNF stands for Dandified yum. We can tell DNF, the next generation of yum package manager (Fork of Yum) using hawkey/libsolv library for back-end. Aleš Kozumplík started working on DNF since Fedora 18 and its implemented/launched in Fedora 22 finally.
-
-[Dnf command][10] is used to install, update, search & remove packages on Fedora 22 and later system. It automatically resolve dependencies and make it smooth package installation without any trouble.
-
-```
-$ dnf info tilix
-Last metadata expiration check: 27 days, 10:00:23 ago on Wed 04 Oct 2017 06:43:27 AM IST.
-Installed Packages
-Name : tilix
-Version : 1.6.4
-Release : 1.fc26
-Arch : x86_64
-Size : 3.6 M
-Source : tilix-1.6.4-1.fc26.src.rpm
-Repo : @System
-From repo : updates
-Summary : Tiling terminal emulator
-URL : https://github.com/gnunn1/tilix
-License : MPLv2.0 and GPLv3+ and CC-BY-SA
-Description : Tilix is a tiling terminal emulator with the following features:
- :
- : - Layout terminals in any fashion by splitting them horizontally or vertically
- : - Terminals can be re-arranged using drag and drop both within and between
- : windows
- : - Terminals can be detached into a new window via drag and drop
- : - Input can be synchronized between terminals so commands typed in one
- : terminal are replicated to the others
- : - The grouping of terminals can be saved and loaded from disk
- : - Terminals support custom titles
- : - Color schemes are stored in files and custom color schemes can be created by
- : simply creating a new file
- : - Transparent background
- : - Supports notifications when processes are completed out of view
- :
- : The application was written using GTK 3 and an effort was made to conform to
- : GNOME Human Interface Guidelines (HIG).
-```
-
-The **`tilix`** package is coming from **`Fedora updates repo`**.
-
-### How Do We Find Out The Installed Packages Came From Which Repository on openSUSE System?
-
-Zypper is a command line package manager which makes use of libzypp. [Zypper command][11] provides functions like repository access, dependency solving, package installation, etc.
-
-```
-$ zypper info nano
-
-Loading repository data...
-Reading installed packages...
-
-
-Information for package nano:
------------------------------
-Repository : Main Repository (OSS)
-Name : nano
-Version : 2.4.2-5.3
-Arch : x86_64
-Vendor : openSUSE
-Installed Size : 1017.8 KiB
-Installed : No
-Status : not installed
-Source package : nano-2.4.2-5.3.src
-Summary : Pico editor clone with enhancements
-Description :
- GNU nano is a small and friendly text editor. It aims to emulate
- the Pico text editor while also offering a few enhancements.
-```
-
-The **`nano`** package is coming from **`openSUSE Main repo (OSS)`**.
-
-### How Do We Find Out The Installed Packages Came From Which Repository on ArchLinux System?
-
-[Pacman command][12] stands for package manager utility. pacman is a simple command-line utility to install, build, remove and manage Arch Linux packages. Pacman uses libalpm (Arch Linux Package Management (ALPM) library) as a back-end to perform all the actions.
-
-```
-# pacman -Ss chromium
-extra/chromium 48.0.2564.116-1
- The open-source project behind Google Chrome, an attempt at creating a safer, faster, and more stable browser
-extra/qt5-webengine 5.5.1-9 (qt qt5)
- Provides support for web applications using the Chromium browser project
-community/chromium-bsu 0.9.15.1-2
- A fast paced top scrolling shooter
-community/chromium-chromevox latest-1
- Causes the Chromium web browser to automatically install and update the ChromeVox screen reader extention. Note: This
- package does not contain the extension code.
-community/fcitx-mozc 2.17.2313.102-1
- Fcitx Module of A Japanese Input Method for Chromium OS, Windows, Mac and Linux (the Open Source Edition of Google Japanese
- Input)
-```
-
-The **`chromium`** package is coming from **`ArchLinux extra repo`**.
-
-Alternatively, we can use the following option to get the detailed information about the package.
-
-```
-# pacman -Si chromium
-Repository : extra
-Name : chromium
-Version : 48.0.2564.116-1
-Description : The open-source project behind Google Chrome, an attempt at creating a safer, faster, and more stable browser
-Architecture : x86_64
-URL : http://www.chromium.org/
-Licenses : BSD
-Groups : None
-Provides : None
-Depends On : gtk2 nss alsa-lib xdg-utils bzip2 libevent libxss icu libexif libgcrypt ttf-font systemd dbus
- flac snappy speech-dispatcher pciutils libpulse harfbuzz libsecret libvpx perl perl-file-basedir
- desktop-file-utils hicolor-icon-theme
-Optional Deps : kdebase-kdialog: needed for file dialogs in KDE
- gnome-keyring: for storing passwords in GNOME keyring
- kwallet: for storing passwords in KWallet
-Conflicts With : None
-Replaces : None
-Download Size : 44.42 MiB
-Installed Size : 172.44 MiB
-Packager : Evangelos Foutras
-Build Date : Fri 19 Feb 2016 04:17:12 AM IST
-Validated By : MD5 Sum SHA-256 Sum Signature
-```
-
-The **`chromium`** package is coming from **`ArchLinux extra repo`**.
-
-### How Do We Find Out The Installed Packages Came From Which Repository on Debian Based Systems?
-
-It can be done in two ways on Debian based systems such as Ubuntu, LinuxMint, etc.,
-
-### Method-1: Using apt-cache Command
-
-The [apt-cache command][13] can display much of the information stored in APT’s internal database. This information is a sort of cache since it is gathered from the different sources listed in the sources.list file. This happens during the apt update operation.
-
-```
-$ apt-cache policy python3
-python3:
- Installed: 3.6.3-0ubuntu2
- Candidate: 3.6.3-0ubuntu3
- Version table:
- 3.6.3-0ubuntu3 500
- 500 http://in.archive.ubuntu.com/ubuntu artful-updates/main amd64 Packages
- * 3.6.3-0ubuntu2 500
- 500 http://in.archive.ubuntu.com/ubuntu artful/main amd64 Packages
- 100 /var/lib/dpkg/status
-```
-
-The **`python3`** package is coming from **`Ubuntu updates repo`**.
-
-### Method-2: Using apt Command
-
-[APT command][14] stands for Advanced Packaging Tool (APT) which is replacement for apt-get, like how DNF came to picture instead of YUM. It’s feature rich command-line tools with included all the futures in one command (APT) such as apt-cache, apt-search, dpkg, apt-cdrom, apt-config, apt-key, etc..,. and several other unique features. For example we can easily install .dpkg packages through APT but we can’t do through Apt-Get similar more features are included into APT command. APT-GET replaced by APT Due to lock of futures missing in apt-get which was not solved.
-
-```
-$ apt -a show notepadqq
-Package: notepadqq
-Version: 1.3.2-1~artful1
-Priority: optional
-Section: editors
-Maintainer: Daniele Di Sarli
-Installed-Size: 1,352 kB
-Depends: notepadqq-common (= 1.3.2-1~artful1), coreutils (>= 8.20), libqt5svg5 (>= 5.2.1), libc6 (>= 2.14), libgcc1 (>= 1:3.0), libqt5core5a (>= 5.9.0~beta), libqt5gui5 (>= 5.7.0), libqt5network5 (>= 5.2.1), libqt5printsupport5 (>= 5.2.1), libqt5webkit5 (>= 5.6.0~rc), libqt5widgets5 (>= 5.2.1), libstdc++6 (>= 5.2)
-Download-Size: 356 kB
-APT-Sources: http://ppa.launchpad.net/notepadqq-team/notepadqq/ubuntu artful/main amd64 Packages
-Description: Notepad++-like editor for Linux
- Text editor with support for multiple programming
- languages, multiple encodings and plugin support.
-
-Package: notepadqq
-Version: 1.2.0-1~artful1
-Status: install ok installed
-Priority: optional
-Section: editors
-Maintainer: Daniele Di Sarli
-Installed-Size: 1,352 kB
-Depends: notepadqq-common (= 1.2.0-1~artful1), coreutils (>= 8.20), libqt5svg5 (>= 5.2.1), libc6 (>= 2.14), libgcc1 (>= 1:3.0), libqt5core5a (>= 5.9.0~beta), libqt5gui5 (>= 5.7.0), libqt5network5 (>= 5.2.1), libqt5printsupport5 (>= 5.2.1), libqt5webkit5 (>= 5.6.0~rc), libqt5widgets5 (>= 5.2.1), libstdc++6 (>= 5.2)
-Homepage: http://notepadqq.altervista.org
-Download-Size: unknown
-APT-Manual-Installed: yes
-APT-Sources: /var/lib/dpkg/status
-Description: Notepad++-like editor for Linux
- Text editor with support for multiple programming
- languages, multiple encodings and plugin support.
-```
-
-The **`notepadqq`** package is coming from **`Launchpad PPA`**.
-
---------------------------------------------------------------------------------
-
-via: https://www.2daygeek.com/how-do-we-find-out-the-installed-packages-came-from-which-repository/
-
-作者:[Prakash Subramanian][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://www.2daygeek.com/author/prakash/
-[b]: https://github.com/lujun9972
-[1]: https://www.2daygeek.com/category/repository/
-[2]: https://www.2daygeek.com/install-enable-epel-repository-on-rhel-centos-scientific-linux-oracle-linux/
-[3]: https://www.2daygeek.com/install-enable-elrepo-on-rhel-centos-scientific-linux/
-[4]: https://www.2daygeek.com/additional-yum-repositories-for-centos-rhel-fedora-systems/
-[5]: https://www.2daygeek.com/install-enable-rpm-fusion-repository-on-centos-fedora-rhel/
-[6]: https://fedoraproject.org/wiki/Third_party_repositories
-[7]: https://www.2daygeek.com/install-enable-packman-repository-on-opensuse-leap/
-[8]: https://www.2daygeek.com/yum-command-examples-manage-packages-rhel-centos-systems/
-[9]: https://www.2daygeek.com/rpm-command-examples/
-[10]: https://www.2daygeek.com/dnf-command-examples-manage-packages-fedora-system/
-[11]: https://www.2daygeek.com/zypper-command-examples-manage-packages-opensuse-system/
-[12]: https://www.2daygeek.com/pacman-command-examples-manage-packages-arch-linux-system/
-[13]: https://www.2daygeek.com/apt-get-apt-cache-command-examples-manage-packages-debian-ubuntu-systems/
-[14]: https://www.2daygeek.com/apt-command-examples-manage-packages-debian-ubuntu-systems/
diff --git a/sources/tech/20181031 8 creepy commands that haunt the terminal - Opensource.com.md b/sources/tech/20181031 8 creepy commands that haunt the terminal - Opensource.com.md
deleted file mode 100644
index 2f6ca1b93e..0000000000
--- a/sources/tech/20181031 8 creepy commands that haunt the terminal - Opensource.com.md
+++ /dev/null
@@ -1,62 +0,0 @@
-translating---geekpi
-
-8 creepy commands that haunt the terminal | Opensource.com
-======
-
-Welcome to the spookier side of Linux.
-
-
-
-It’s that time of year again: The weather gets chilly, the leaves change colors, and kids everywhere transform into tiny ghosts, goblins, and zombies. But did you know that Unix (and Linux) and its various offshoots are also chock-full of creepy crawly things? Let’s take a quick look at some of the spookier aspects of the operating system we all know and love.
-
-### daemon
-
-Unix just wouldn’t be the same without all the various daemons that haunt the system. A `daemon` is a process that runs in the background and provides useful services to both the user and the operating system itself. Think SSH, FTP, HTTP, etc.
-
-### zombie
-
-Every now and then a zombie, a process that has been killed but refuses to go away, shows up. When this happens, you have no choice but to dispatch it using whatever tools you have available. A zombie usually indicates that something is wrong with the process that spawned it.
-
-### kill
-
-Not only can you use the `kill` command to dispatch a zombie, but you can also use it to kill any process that’s adversely affecting your system. Have a process that’s using too much RAM or CPU cycles? Dispatch it with the `kill` command.
-
-### cat
-
-The `cat` command has nothing to do with felines and everything to do with combining files: `cat` is short for "concatenate." You can even use this handy command to view the contents of a file.
-
-
-### tail
-
-
-The `tail` command is useful when you want to see last n number of lines in a file. It’s also great when you want to monitor a file.
-
-### which
-
-No, not that kind of witch, but the command that prints the location of the files associated with any command passed to it. `which python`, for example, will print the locations of every version of Python on your system.
-
-### crypt
-
-The `crypt` command, known these days as `mcrypt`, is handy when you want to scramble (encrypt) the contents of a file so that no one but you can read it. Like most Unix commands, you can use `crypt` standalone or within a system script.
-
-### shred
-
-The `shred` command is handy when you not only want to delete a file but you also want to ensure that no one will ever be able to recover it. Using the `rm` command to delete a file isn’t enough. You also need to overwrite the space that the file previously occupied. That’s where `shred` comes in.
-
-These are just a few of the spooky things you’ll find hiding inside Unix. Do you know more creepy commands? Feel free to let me know.
-
-Happy Halloween!
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/10/spookier-side-unix-linux
-
-作者:[Patrick H.Mullins][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://opensource.com/users/pmullins
-[b]: https://github.com/lujun9972
diff --git a/sources/tech/20181101 KRS- A new tool for gathering Kubernetes resource statistics.md b/sources/tech/20181101 KRS- A new tool for gathering Kubernetes resource statistics.md
deleted file mode 100644
index 50db9d728d..0000000000
--- a/sources/tech/20181101 KRS- A new tool for gathering Kubernetes resource statistics.md
+++ /dev/null
@@ -1,77 +0,0 @@
-translating---geekpi
-
-KRS: A new tool for gathering Kubernetes resource statistics
-======
-Zero-configuration tool simplifies gathering information, such as how many pods are running in a certain namespace.
-
-
-Recently I was in New York giving a talk at O'Reilly Velocity on the topic of [troubleshooting Kubernetes apps][1] and, motivated by the positive feedback and great discussions on the topic, I decided to revisit tooling in the space. It turns out that, besides [kubernetes-incubator/spartakus][2] and [kubernetes/kube-state-metrics][3], we don't really have much lightweight tooling available to collect resource stats (such as the number of pods or services in a namespace). So, I sat down on my way home and started coding on a little tool—creatively named **krs** , which is short for Kubernetes Resource Stats—that allows you to gather these stats.
-
-You can use [mhausenblas/krs][5] in two ways:
-
- * directly from the command line (binaries for Linux, Windows, and MacOS are available); and
- * in cluster, as a deployment, using the [launch.sh][4] script, which creates the appropriate role-based access control (RBAC) permissions on the fly.
-
-
-
-Mind you, it's very early days, and this is heavily a work in progress. However, the 0.1 release of **krs** offers the following features:
-
- * In a per-namespace basis, it periodically gathers resource stats (supporting pods, deployments, and services).
- * It exposes these stats as metrics in the [OpenMetrics format][6].
- * It can be used directly via binaries or in a containerized setup with all dependencies included.
-
-
-
-In its current form, you need to have **kubectl** installed and configured for **krs** to work, because **krs** relies on a **kubectl get all** command to be executed to gather the stats. (On the other hand, who's using Kubernetes and doesn't have **kubectl** installed?)
-
-Using **krs** is simple; [Download][7] the binary for your platform and execute it like this:
-
-```
-$ krs thenamespacetowatch
-# HELP pods Number of pods in any state, for example running
-# TYPE pods gauge
-pods{namespace="thenamespacetowatch"} 13
-# HELP deployments Number of deployments
-# TYPE deployments gauge
-deployments{namespace="thenamespacetowatch"} 6
-# HELP services Number of services
-# TYPE services gauge
-services{namespace="thenamespacetowatch"} 4
-```
-
-This will launch **krs** in the foreground, gathering resource stats from the namespace **thenamespacetowatch** and outputting them respectively in the OpenMetrics format on **stdout** for you to further process.
-
-![krs screenshot][9]
-
-Screenshot of krs in action.
-
-But Michael, you may ask, why isn't it doing something useful (such as storing 'em in S3) with the metrics? Because [Unix philosophy][10].
-
-For those wondering if they can directly use Prometheus or [kubernetes/kube-state-metrics][3] for this task: Well, sure you can, why not? The emphasis of **krs** is on being a lightweight and easy-to-use alternative to already available tooling—and maybe even being slightly complementary in certain aspects.
-
-This was originally published on [Medium's ITNext][11] and is reprinted with permission.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/11/kubernetes-resource-statistics
-
-作者:[Michael Hausenblas][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://opensource.com/users/mhausenblas
-[b]: https://github.com/lujun9972
-[1]: http://troubleshooting.kubernetes.sh/
-[2]: https://github.com/kubernetes-incubator/spartakus
-[3]: https://github.com/kubernetes/kube-state-metrics
-[4]: https://github.com/mhausenblas/krs/blob/master/launch.sh
-[5]: https://github.com/mhausenblas/krs
-[6]: https://openmetrics.io/
-[7]: https://github.com/mhausenblas/krs/releases
-[8]: /file/412706
-[9]: https://opensource.com/sites/default/files/uploads/krs_screenshot.png (krs screenshot)
-[10]: http://harmful.cat-v.org/cat-v/
-[11]: https://itnext.io/kubernetes-resource-statistics-e8247f92b45c
diff --git a/sources/tech/20181102 Create a containerized machine learning model.md b/sources/tech/20181102 Create a containerized machine learning model.md
index 3914bd4bee..d307bc3575 100644
--- a/sources/tech/20181102 Create a containerized machine learning model.md
+++ b/sources/tech/20181102 Create a containerized machine learning model.md
@@ -1,3 +1,5 @@
+translating by Flowsnow
+
Create a containerized machine learning model
======
diff --git a/sources/tech/20181102 How To Create A Bootable Linux USB Drive From Windows OS 7,8 and 10.md b/sources/tech/20181102 How To Create A Bootable Linux USB Drive From Windows OS 7,8 and 10.md
deleted file mode 100644
index f8a5e57927..0000000000
--- a/sources/tech/20181102 How To Create A Bootable Linux USB Drive From Windows OS 7,8 and 10.md
+++ /dev/null
@@ -1,78 +0,0 @@
-How To Create A Bootable Linux USB Drive From Windows OS 7,8 and 10?
-======
-If you would like to learn about Linux, the first thing you have to do is install the Linux OS on your system.
-
-It can be achieved in two ways either go with virtualization applications like Virtualbox, VMWare, etc, or install Linux on your system.
-
-If you are preferring to move from windows OS to Linux OS or planning to install Linux operating system on your spare machine then you have to create a bootable USB stick for that.
-
-We had wrote many articles for creating [bootable USB drive on Linux][1] such as [BootISO][2], [Etcher][3] and [dd command][4] but we never get an opportunity to write an article about creating Linux bootable USB drive in windows. Somehow, we got a opportunity today to perform this task.
-
-In this article we are going to show you, how to create a bootable Ubuntu USB flash drive from windows 10.
-
-These step will work for other Linux as well but you have to choose the corresponding OS from the drop down instead of Ubuntu.
-
-### Step-1: Download Ubuntu ISO
-
-Visit [Ubuntu releases][5] page and download a latest version. I would like to advise you to download a latest LTS version and not for a normal release.
-
-Make sure you have downloaded the proper ISO by performing checksum using MD5 or SHA256. The output value should be matched with the Ubuntu releases page value.
-
-### Step-2: Download Universal USB Installer
-
-There are many applications are available for this but my preferred application is [Universal USB Installer][6] which is very simple to perform this task. Just visit Universal USB Installer page and download the app.
-
-### Step-3: How To Create a bootable Ubuntu ISO using Universal USB Installer
-
-There is no complication on this application to perform this. First connect your USB drive then hit the downloaded Universal USB Installer. Once it’s launched you can see the interface similar to us.
-![][8]
-
- * **`Step-1:`** Select Ubuntu OS.
- * **`Step-2:`** Navigate to Ubuntu ISO downloaded location.
- * **`Step-3:`** By default it’s select a USB drive however verify this then check the option to format it.
-
-
-
-![][9]
-
-When you hit `Create` button, it will pop-up a window with warnings. No need to worry, just hit `Yes` to proceed further on this.
-![][10]
-
-USB drive partition is in progress.
-![][11]
-
-Wait for sometime to complete this. If you would like to move this process to background, yes, you can by hitting `Background` button.
-![][12]
-
-Yes, it’s completed.
-![][13]
-
-Now you are ready to perform [Ubuntu OS installation][14]. However, it’s offering a live mode also so, you can play around it if you want to try before performing the installation.
-
---------------------------------------------------------------------------------
-
-via: https://www.2daygeek.com/create-a-bootable-live-usb-drive-from-windows-using-universal-usb-installer/
-
-作者:[Prakash Subramanian][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://www.2daygeek.com/author/prakash/
-[b]: https://github.com/lujun9972
-[1]: https://www.2daygeek.com/category/bootable-usb/
-[2]: https://www.2daygeek.com/bootiso-a-simple-bash-script-to-securely-create-a-bootable-usb-device-in-linux-from-iso-file/
-[3]: https://www.2daygeek.com/etcher-easy-way-to-create-a-bootable-usb-drive-sd-card-from-an-iso-image-on-linux/
-[4]: https://www.2daygeek.com/create-a-bootable-usb-drive-from-an-iso-image-using-dd-command-on-linux/
-[5]: http://releases.ubuntu.com/
-[6]: https://www.pendrivelinux.com/universal-usb-installer-easy-as-1-2-3/
-[7]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
-[8]: https://www.2daygeek.com/wp-content/uploads/2018/11/create-a-live-linux-os-usb-from-windows-using-universal-usb-installer-1.png
-[9]: https://www.2daygeek.com/wp-content/uploads/2018/11/create-a-live-linux-os-usb-from-windows-using-universal-usb-installer-2.png
-[10]: https://www.2daygeek.com/wp-content/uploads/2018/11/create-a-live-linux-os-usb-from-windows-using-universal-usb-installer-3.png
-[11]: https://www.2daygeek.com/wp-content/uploads/2018/11/create-a-live-linux-os-usb-from-windows-using-universal-usb-installer-4.png
-[12]: https://www.2daygeek.com/wp-content/uploads/2018/11/create-a-live-linux-os-usb-from-windows-using-universal-usb-installer-5.png
-[13]: https://www.2daygeek.com/wp-content/uploads/2018/11/create-a-live-linux-os-usb-from-windows-using-universal-usb-installer-6.png
-[14]: https://www.2daygeek.com/how-to-install-ubuntu-16-04/
diff --git a/sources/tech/20181105 CPod- An Open Source, Cross-platform Podcast App.md b/sources/tech/20181105 CPod- An Open Source, Cross-platform Podcast App.md
deleted file mode 100644
index 89a1f1f354..0000000000
--- a/sources/tech/20181105 CPod- An Open Source, Cross-platform Podcast App.md
+++ /dev/null
@@ -1,104 +0,0 @@
-CPod: An Open Source, Cross-platform Podcast App
-======
-Podcasts are a great way to be entertained and informed. In fact, I listen to about ten different podcasts covering technology, mysteries, history, and comedy. Of course, [Linux podcasts][1] are also on this list.
-
-Today, we will take a look at a simple cross-platform application for handling your podcasts.
-
-![][2]
-Recommended podcasts and podcast search
-
-### The Application
-
-[CPod][3] is the creation of [Zack Guard (z————-)][4]. **It is an[Election][5] app** , which gives it the ability to run on the largest operating systems (Linux, Windows, Mac OS).
-
-Trivia: CPod was originally named Cumulonimbus.
-
-The majority of the application is taken up by two large panels to display content and options. A small bar along the left side of the screen gives you access to the different parts of the application. The different sections of CPod include Home, Queue, Subscriptions, Explore and Settings.
-
-![cpod settings][6]Settings
-
-### Features of CPod
-
-Here is a list of features that CPod has to offer:
-
- * Simple, clean design
- * Available on the top computer platforms
- * Available as a Snap
- * Search iTunes’ podcast directory
- * Download and play episodes without downloading
- * View podcast information and episode
- * Search for an individual episode of a podcast
- * Dark mode
- * Change playback speed
- * Keyboard shortcuts
- * Sync your podcast subscriptions with gpodder.net
- * Import and export subscriptions
- * Sort subscriptions based on length, date, download status, and play progress
- * Auto-fetch new episodes on application startup
- * Multiple language support
-
-
-
-![search option in cpod application][7]Searching for ZFS episode
-
-### Experiencing CPod on Linux
-
-I ended up installing CPod on two systems: ArchLabs and Windows. There are two versions of CPod in the [Arch User Repository][8]. However, they are both out of date, one is version 1.14.0 and the other was 1.22.6. The most recent version of CPod is 1.27.0. Because of the version difference between ArchLabs and Windows, I had to different experiences. For this article, I will focus on 1.27.0, since that is the most current and has the most features.
-
-Right out of the gate, I was able to find most of my favorite podcasts. I was able to add the ones that were not on the iTunes’ list by pasting in the URL for the RSS feed.
-
-It was also very easy to find a particular episode of a podcast. for example, I was recently looking for an episode of [Late Night Linux][9] where they were talking about [ZFS][10]. I clicked on the podcast, typed “ZFS” in the search box and found it.
-
-I quickly discovered that the easiest way to play a bunch of podcast episodes was to add them to the queue. Once they are in the queue, you can either stream them or download them. You can also reorder them by dragging and dropping. As each episode played, it displayed a visualization of the sound wave, along with the episode summary.
-
-### Installating CPod
-
-On [GitHub][11], you can download an AppImage or Deb file for Linux, a .exe file for Windows or a .dmg file for Mac OS.
-
-You can also install CPod as a [Snap][12]. All you need to do is use the following command:
-
-```
-sudo snap install cpod
-```
-
-Like I said earlier, the [Arch User Repository][8] version of CPod is old. I already messaged one of the packagers. If you use Arch (or an Arch-based distro), I would recommend doing the same.
-
-![cpod for Linux pidcasts][13]Playing one of my favorite podcasts
-
-### Final Thoughts
-
-Overall, I liked CPod. It was nice looking and simple to use. In fact, I like the original name (Cumulonimbus) better, but it is a bit of a mouthful.
-
-I just had two problems with the application. First, I wish that the ratings were available for each podcast. Second, the menus that allow you to sort episodes based on length, date, download status, and play progress don’t work when the dork mode is turned on.
-
-Have you ever used CPod? If not, what is your favorite podcast app? What are some of your favorite podcasts? Let us know in the comments below.
-
-If you found this article interesting, please take a minute to share it on social media, Hacker News or [Red][14][d][14][it][14].
-
---------------------------------------------------------------------------------
-
-via: https://itsfoss.com/cpod-podcast-app/
-
-作者:[John Paul][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://itsfoss.com/author/john/
-[b]: https://github.com/lujun9972
-[1]: https://itsfoss.com/linux-podcasts/
-[2]: https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/10/cpod1.1.jpg
-[3]: https://github.com/z-------------/CPod
-[4]: https://github.com/z-------------
-[5]: https://electronjs.org/
-[6]: https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/10/cpod2.1.png
-[7]: https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/10/cpod4.1.jpg
-[8]: https://aur.archlinux.org/packages/?O=0&K=cpod
-[9]: https://latenightlinux.com/
-[10]: https://itsfoss.com/what-is-zfs/
-[11]: https://github.com/z-------------/CPod/releases
-[12]: https://snapcraft.io/cumulonimbus
-[13]: https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/10/cpod3.1.jpg
-[14]: http://reddit.com/r/linuxusersgroup
diff --git a/sources/tech/20181105 Commandline quick tips- How to locate a file.md b/sources/tech/20181105 Commandline quick tips- How to locate a file.md
deleted file mode 100644
index f0e7259a35..0000000000
--- a/sources/tech/20181105 Commandline quick tips- How to locate a file.md
+++ /dev/null
@@ -1,229 +0,0 @@
-translating by dianbanjiu Commandline quick tips: How to locate a file
-======
-
-
-
-We all have files on our computers — documents, photos, source code, you name it. So many of them. Definitely more than I can remember. And if not challenging, it might be time consuming to find the right one you’re looking for. In this post, we’ll have a look at how to make sense of your files on the command line, and especially how to quickly find the ones you’re looking for.
-
-Good news is there are few quite useful utilities in the Linux commandline designed specifically to look for files on your computer. We’ll have a look at three of those: ls, tree, and find.
-
-### ls
-
-If you know where your files are, and you just need to list them or see information about them, ls is here for you.
-
-Just running ls lists all visible files and directories in the current directory:
-
-```
-$ ls
-Documents Music Pictures Videos notes.txt
-```
-
-Adding the **-l** option shows basic information about the files. And together with the **-h** option you’ll see file sizes in a human-readable format:
-
-```
-$ ls -lh
-total 60K
-drwxr-xr-x 2 adam adam 4.0K Nov 2 13:07 Documents
-drwxr-xr-x 2 adam adam 4.0K Nov 2 13:07 Music
-drwxr-xr-x 2 adam adam 4.0K Nov 2 13:13 Pictures
-drwxr-xr-x 2 adam adam 4.0K Nov 2 13:07 Videos
--rw-r--r-- 1 adam adam 43K Nov 2 13:12 notes.txt
-```
-
-**Is** can also search a specific place:
-
-```
-$ ls Pictures/
-trees.png wallpaper.png
-```
-
-Or a specific file — even with just a part of the name:
-
-```
-$ ls *.txt
-notes.txt
-```
-
-Something missing? Looking for a hidden file? No problem, use the **-a** option:
-
-```
-$ ls -a
-. .bash_logout .bashrc Documents Pictures notes.txt
-.. .bash_profile .vimrc Music Videos
-```
-
-There are many other useful options for **ls** , and you can combine them together to achieve what you need. Learn about them by running:
-
-```
-$ man ls
-```
-
-### tree
-
-If you want to see, well, a tree structure of your files, tree is a good choice. It’s probably not installed by default which you can do yourself using the package manager DNF:
-
-```
-$ sudo dnf install tree
-```
-
-Running tree without any options or parameters shows the whole tree starting at the current directory. Just a warning, this output might be huge, because it will include all files and directories:
-
-```
-$ tree
-.
-|-- Documents
-| |-- notes.txt
-| |-- secret
-| | `-- christmas-presents.txt
-| `-- work
-| |-- project-abc
-| | |-- README.md
-| | |-- do-things.sh
-| | `-- project-notes.txt
-| `-- status-reports.txt
-|-- Music
-|-- Pictures
-| |-- trees.png
-| `-- wallpaper.png
-|-- Videos
-`-- notes.txt
-```
-
-If that’s too much, I can limit the number of levels it goes using the -L option followed by a number specifying the number of levels I want to see:
-
-```
-$ tree -L 2
-.
-|-- Documents
-| |-- notes.txt
-| |-- secret
-| `-- work
-|-- Music
-|-- Pictures
-| |-- trees.png
-| `-- wallpaper.png
-|-- Videos
-`-- notes.txt
-```
-
-You can also display a tree of a specific path:
-
-```
-$ tree Documents/work/
-Documents/work/
-|-- project-abc
-| |-- README.md
-| |-- do-things.sh
-| `-- project-notes.txt
-`-- status-reports.txt
-```
-
-To browse and search a huge tree, you can use it together with less:
-
-```
-$ tree | less
-```
-
-Again, there are other options you can use with three, and you can combine them together for even more power. The manual page has them all:
-
-```
-$ man tree
-```
-
-### find
-
-And what about files that live somewhere in the unknown? Let’s find them!
-
-In case you don’t have find on your system, you can install it using DNF:
-
-```
-$ sudo dnf install findutils
-```
-
-Running find without any options or parameters recursively lists all files and directories in the current directory.
-
-```
-$ find
-.
-./Documents
-./Documents/secret
-./Documents/secret/christmas-presents.txt
-./Documents/notes.txt
-./Documents/work
-./Documents/work/status-reports.txt
-./Documents/work/project-abc
-./Documents/work/project-abc/README.md
-./Documents/work/project-abc/do-things.sh
-./Documents/work/project-abc/project-notes.txt
-./.bash_logout
-./.bashrc
-./Videos
-./.bash_profile
-./.vimrc
-./Pictures
-./Pictures/trees.png
-./Pictures/wallpaper.png
-./notes.txt
-./Music
-```
-
-But the true power of find is that you can search by name:
-
-```
-$ find -name do-things.sh
-./Documents/work/project-abc/do-things.sh
-```
-
-Or just a part of a name — like the file extension. Let’s find all .txt files:
-
-```
-$ find -name "*.txt"
-./Documents/secret/christmas-presents.txt
-./Documents/notes.txt
-./Documents/work/status-reports.txt
-./Documents/work/project-abc/project-notes.txt
-./notes.txt
-```
-
-You can also look for files by size. That might be especially useful if you’re running out of space. Let’s list all files larger than 1 MB:
-
-```
-$ find -size +1M
-./Pictures/trees.png
-./Pictures/wallpaper.png
-```
-
-Searching a specific directory is also possible. Let’s say I want to find a file in my Documents directory, and I know it has the word “project” in its name:
-
-```
-$ find Documents -name "*project*"
-Documents/work/project-abc
-Documents/work/project-abc/project-notes.txt
-```
-
-Ah! That also showed the directory. One thing I can do is to limit the search query to files only:
-
-```
-$ find Documents -name "*project*" -type f
-Documents/work/project-abc/project-notes.txt
-```
-
-And again, find have many more options you can use, the man page might definitely help you:
-
-```
-$ man find
-```
-
---------------------------------------------------------------------------------
-
-via: https://fedoramagazine.org/commandline-quick-tips-locate-file/
-
-作者:[Adam Šamalík][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://fedoramagazine.org/author/asamalik/
-[b]: https://github.com/lujun9972
diff --git a/sources/tech/20181105 How to manage storage on Linux with LVM.md b/sources/tech/20181105 How to manage storage on Linux with LVM.md
new file mode 100644
index 0000000000..9c0ee685d6
--- /dev/null
+++ b/sources/tech/20181105 How to manage storage on Linux with LVM.md
@@ -0,0 +1,238 @@
+[zianglei translating]
+How to manage storage on Linux with LVM
+======
+Create, expand, and encrypt storage pools as needed with the Linux LVM utilities.
+
+
+Logical Volume Manager ([LVM][1]) is a software-based RAID-like system that lets you create "pools" of storage and add hard drive space to those pools as needed. There are lots of reasons to use it, especially in a data center or any place where storage requirements change over time. Many Linux distributions use it by default for desktop installations, though, because users find the flexibility convenient and there are some built-in encryption features that the LVM structure simplifies.
+
+However, if you aren't used to seeing an LVM volume when booting off of a Live CD for data rescue or migration purposes, LVM can be confusing because the **mount** command can't mount LVM volumes. For that, you need LVM tools installed. The chances are great that your distribution has LVM utils available—if they aren't already installed.
+
+This tutorial explains how to create and deal with LVM volumes.
+
+### Create an LVM pool
+
+This article assumes you have a working knowledge of how to interact with hard drives on Linux. If you need more information on the basics before continuing, read my [introduction to hard drives on Linux][2]
+
+Usually, you don't have to set up LVM at all. When you install Linux, it often defaults to creating a virtual "pool" of storage and adding your machine's hard drive(s) to that pool. However, manually creating an LVM storage pool is a great way to learn what happens behind the scenes.
+
+You can practice with two spare thumb drives of any size, or two hard drives, or a virtual machine with two imaginary drives defined.
+
+First, format the imaginary drive **/dev/sdx** so that you have a fresh drive ready to use for this demo.
+
+```
+# echo "warning, this ERASES everything on this drive."
+warning, this ERASES everything on this drive.
+# dd if=/dev/zero of=/dev/sdx count=8196
+# parted /dev/sdx print | grep Disk
+Disk /dev/sdx: 100GB
+# parted /dev/sdx mklabel gpt
+# parted /dev/sdx mkpart primary 1s 100%
+```
+
+This LVM command creates a storage pool. A pool can consist of one or more drives, and right now it consists of one. This example storage pool is named **billiards** , but you can call it anything.
+
+```
+# vgcreate billiards /dev/sdx1
+```
+
+Now you have a big, nebulous pool of storage space. Time to hand it out. To create two logical volumes (you can think of them as virtual drives), one called **vol0** and the other called **vol1** , enter the following:
+
+```
+# lvcreate billiards 49G --name vol0
+# lvcreate billiards 49G --name vol1
+```
+
+Now you have two volumes carved out of one storage pool, but neither of them has a filesystem yet. To create a filesystem on each volume, you must bring the **billiards** volume group online.
+
+```
+# vgchange --activate y billiards
+```
+
+Now make the file systems. The **-L** option provides a label for the drive, which is displayed when the drive is mounted on your desktop. The path to the volume is a little different than the usual device paths you're used to because these are virtual devices in an LVM storage pool.
+
+```
+# mkfs.ext4 -L finance /dev/billiards/vol0
+# mkfs.ext4 -L production /dev/billiards/vol1
+```
+
+You can mount these new volumes on your desktop or from a terminal.
+
+```
+# mkdir -p /mnt/vol0 /mnt/vol1
+# mount /dev/billiards/vol0 /mnt/vol0
+# mount /dev/billiards/vol1 /mnt/vol1
+```
+
+### Add space to your pool
+
+So far, LVM has provided nothing more than partitioning a drive normally provides: two distinct sections of drive space on a single physical drive (in this example, 49GB and 49GB on a 100GB drive). Imagine now that the finance department needs more space. Traditionally, you'd have to restructure. Maybe you'd move the finance department data to a new, dedicated physical drive, or maybe you'd add a drive and then use an ugly symlink hack to provide users easy access to their additional storage space. With LVM, however, all you have to do is expand the storage pool.
+
+You can add space to your pool by formatting another drive and using it to create more additional space.
+
+First, create a partition on the new drive you're adding to the pool.
+
+```
+# part /dev/sdy mkpart primary 1s 100%
+```
+
+Then use the **vgextend** command to mark the new drive as part of the pool.
+
+```
+# vgextend billiards /dev/sdy1
+```
+
+Finally, dedicate some portion of the newly available storage pool to the appropriate logical volume.
+
+```
+# lvextend -L +49G /dev/billiards/vol0
+```
+
+Of course, the expansion doesn't have to be so linear. Imagine that the production department suddenly needs 100TB of additional space. With LVM, you can add as many physical drives as needed, adding each one and using **vgextend** to create a 100TB storage pool, then using **lvextend** to "stretch" the production department's storage space across 100TB of available space.
+
+### Use utils to understand your storage structure
+
+Once you start using LVM in earnest, the landscape of storage can get overwhelming. There are two commands to gather information about the structure of your storage infrastructure.
+
+First, there is **vgdisplay** , which displays information about your volume groups (you can think of these as LVM's big, high-level virtual drives).
+
+```
+# vgdisplay
+ --- Volume group ---
+ VG Name billiards
+ System ID
+ Format lvm2
+ Metadata Areas 1
+ Metadata Sequence No 4
+ VG Access read/write
+ VG Status resizable
+ MAX LV 0
+ Cur LV 3
+ Open LV 3
+ Max PV 0
+ Cur PV 1
+ Act PV 1
+ VG Size <237.47 GiB
+ PE Size 4.00 MiB
+ Total PE 60792
+ Alloc PE / Size 60792 / <237.47 GiB
+ Free PE / Size 0 / 0
+ VG UUID j5RlhN-Co4Q-7d99-eM3K-G77R-eDJO-nMR9Yg
+```
+
+The second is **lvdisplay** , which displays information about your logical volumes (you can think of these as user-facing drives).
+
+```
+# lvdisplay
+ --- Logical volume ---
+ LV Path /dev/billiards/finance
+ LV Name finance
+ VG Name billiards
+ LV UUID qPgRhr-s0rS-YJHK-0Cl3-5MME-87OJ-vjjYRT
+ LV Write Access read/write
+ LV Creation host, time localhost, 2018-12-16 07:31:01 +1300
+ LV Status available
+ # open 1
+ LV Size 149.68 GiB
+ Current LE 46511
+ Segments 1
+ Allocation inherit
+ Read ahead sectors auto
+ - currently set to 256
+ Block device 253:3
+
+[...]
+```
+
+### Use LVM in a rescue environment
+
+The "problem" with LVM is that it wraps partitions in a way that is unfamiliar to many administrative users who are used to traditional drive partitioning. Under normal circumstances, LVM drives are activated and mounted fairly invisibly during the boot process or desktop LVM integration. It's not something you typically have to think about. It only becomes problematic when you find yourself in recovery mode after something goes wrong with your system.
+
+If you need to mount a volume that's "hidden" within the structure of LVM, you must make sure that the LVM toolchain is installed. If you have access to your **/usr/sbin** directory, you probably have access to all of your usual LVM commands. But if you've booted into a minimal shell or a rescue environment, you may not have those tools. A good rescue environment has LVM installed, so if you're in a minimal shell, find a rescue system that does. If you're using a rescue disc and it doesn't have LVM installed, either install it manually or find a rescue disc that already has it.
+
+For the sake of repetition and clarity, here's how to mount an LVM volume.
+
+```
+# vgchange --activate y
+2 logical volume(s) in volume group "billiards" now active
+# mkdir /mnt/finance
+# mount /dev/billiards/finance /mnt/finance
+```
+
+### Integrate LVM with LUKS encryption
+
+Many Linux distributions use LVM by default when installing the operating system. This permits storage extension later, but it also integrates nicely with disk encryption provided by the Linux Unified Key Setup ([LUKS][3]) encryption toolchain.
+
+Encryption is pretty important, and there are two ways to encrypt things: you can encrypt on a per-file basis with a tool like GnuPG, or you can encrypt an entire partition. On Linux, encrypting a partition is easy with LUKS, which, being completely integrated into Linux by way of kernel modules, permits drives to be mounted for seamless reading and writing.
+
+Encrypting your entire main drive usually happens as an option during installation. You select to encrypt your entire drive or just your home partition when prompted, and from that point on you're using LUKS. It's mostly invisible to you, aside from a password prompt during boot.
+
+If your distribution doesn't offer this option during installation, or if you just want to encrypt a drive or partition manually, you can do that.
+
+You can follow this example by using a spare drive; I used a small 4GB thumb drive.
+
+First, plug the drive into your computer. Make sure it's safe to erase the drive and [use lsblk][2] to locate the drive on your system.
+
+If the drive isn't already partitioned, partition it now. If you don't know how to partition a drive, check out the link above for instructions.
+
+Now you can set up the encryption. First, format the partition with the **cryptsetup** command.
+
+```
+# cryptsetup luksFormat /dev/sdx1
+```
+
+Note that you're encrypting the partition, not the physical drive itself. You'll see a warning that LUKS is going to erase your drive; you must accept it to continue. You'll be prompted to create a passphrase, so do that. Don't forget that passphrase. Without it, you will never be able to get into that drive again!
+
+You've encrypted the thumb drive's partition, but there's no filesystem on the drive yet. Of course, you can't write a filesystem to the drive while you're locked out of it, so open the drive with LUKS first. You can provide a human-friendly name for your drive; for this example, I used **mySafeDrive**.
+
+```
+# cryptsetup luksOpen /dev/sdx1 mySafeDrive
+```
+
+Enter your passphrase to open the drive.
+
+Look in **/dev/mapper** and you'll see that you've mounted the volume along with any other LVM volumes you might have, meaning you now have access to that drive. The custom name (e.g., mySafeDrive) is a symlink to an auto-generated designator in **/dev/mapper**. You can use either path when operating on this drive.
+
+```
+# ls -l /dev/mapper/mySafeDrive
+lrwxrwxrwx. 1 root root 7 Oct 24 03:58 /dev/mapper/mySafeDrive -> ../dm-4
+```
+
+Create your filesystem.
+
+```
+# mkfs.ext4 -o Linux -L mySafeExt4Drive /dev/mapper/mySafeDrive
+```
+
+Now do an **ls -lh** on **/dev/mapper** and you'll see that mySafeDrive is actually a symlink to some other dev; probably **/dev/dm0** or similar. That's the filesystem you can mount:
+
+```
+# mount /dev/mapper/mySafeExt4Drive /mnt/hd
+```
+
+Now the filesystem on the encrypted drive is mounted. You can read and write files as you'd expect with any drive.
+
+### Use encrypted drives with the desktop
+
+LUKS is built into the kernel, so your Linux system is fully aware of how to handle it. Detach the drive, plug it back in, and mount it from your desktop. In KDE's Dolphin file manager, you'll be prompted for a password before the drive is decrypted and mounted.
+
+
+
+Using LVM and LUKS is easy, and it provides flexibility for you as a user and an admin. Being tightly integrated into Linux itself, it's well-supported and a great way to add a layer of security to your data. Try it today!
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/11/manage-storage-lvm
+
+作者:[Seth Kenlon][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/seth
+[b]: https://github.com/lujun9972
+[1]: https://en.wikipedia.org/wiki/Logical_Volume_Manager_(Linux)
+[2]: https://opensource.com/article/18/10/partition-and-format-drive-linux
+[3]: https://en.wikipedia.org/wiki/Linux_Unified_Key_Setup
diff --git a/sources/tech/20181105 Introducing pydbgen- A random dataframe-database table generator.md b/sources/tech/20181105 Introducing pydbgen- A random dataframe-database table generator.md
deleted file mode 100644
index 9332551a34..0000000000
--- a/sources/tech/20181105 Introducing pydbgen- A random dataframe-database table generator.md
+++ /dev/null
@@ -1,171 +0,0 @@
-HankChow translating
-
-Introducing pydbgen: A random dataframe/database table generator
-======
-Simple tool generates large database files with multiple tables to practice SQL commands for data science.
-
-
-
-When you start learning data science, often your biggest worry is not the algorithms or techniques but getting access to raw data. While there are many high-quality, real-life datasets available on the web for trying out cool machine learning techniques, I've found that the same is not true when it comes to learning SQL.
-
-For data science, having a basic familiarity with SQL is almost as important as knowing how to write code in Python or R. But it's far easier to find toy datasets on Kaggle than it is to access a large enough database with real data (such as name, age, credit card, social security number, address, birthday, etc.) specifically designed or curated for machine learning tasks.
-
-Wouldn't it be great to have a simple tool or library to generate a large database with multiple tables filled with data of your own choice?
-
-Aside from beginners in data science, even seasoned software testers may find it useful to have a simple tool where, with a few lines of code, they can generate arbitrarily large data sets with random (fake), yet meaningful entries.
-
-For this reason, I am glad to introduce a lightweight Python library called **[pydbgen][1]**. In this article, I'll briefly share some information about the package, and you can learn much more [by reading the docs][2].
-
-### What is pydbgen?
-
-Pydbgen is a lightweight, pure-Python library to generate random useful entries (e.g., name, address, credit card number, date, time, company name, job title, license plate number, etc.) and save them in a Pandas dataframe object, as an SQLite table in a database file, or in a Microsoft Excel file.
-
-### How to install pydbgen
-
-The current version (1.0.5) is hosted on PyPI (the Python Package Index repository). You need to have [Faker][3] installed to make this work. To install Pydbgen, enter:
-
-```
-pip install pydbgen
-```
-
-It has been tested on Python 3.6 and won't work on Python 2 installations.
-
-### How to use it
-
-To start using Pydbgen, initiate a **pydb** object.
-
-```
-import pydbgen
-from pydbgen import pydbgen
-myDB=pydbgen.pydb()
-```
-
-Then you can access the various internal functions exposed by the **pydb** object. For example, to print random US cities, enter:
-
-```
-myDB.city_real()
->> 'Otterville'
-for _ in range(10):
- print(myDB.license_plate())
->> 8NVX937
- 6YZH485
- XBY-564
- SCG-2185
- XMR-158
- 6OZZ231
- CJN-850
- SBL-4272
- TPY-658
- SZL-0934
-```
-
-By the way, if you enter **city** instead of **city_real** , it will return fictitious city names.
-
-```
-print(myDB.gen_data_series(num=8,data_type='city'))
->>
-New Michelle
-Robinborough
-Leebury
-Kaylatown
-Hamiltonfort
-Lake Christopher
-Hannahstad
-West Adamborough
-```
-
-### Generate a Pandas dataframe with random entries
-
-You can choose how many and what data types will be generated. Note that everything returns as string/texts.
-
-```
-testdf=myDB.gen_dataframe(5,['name','city','phone','date'])
-testdf
-```
-
-The resulting dataframe looks like the following image.
-
-
-
-### Generate a database table
-
-You can choose how many and what data types will be generated. Everything is returned in the text/VARCHAR data type for the database. You can specify the database filename and the table name.
-
-```
-myDB.gen_table(db_file='Testdb.DB',table_name='People',
-
-fields=['name','city','street_address','email'])
-```
-
-This generates a .db file which can be used with MySQL or the SQLite database server. The following image shows a database table opened in DB Browser for SQLite.
-
-
-### Generate an Excel file
-
-Similar to the examples above, the following code will generate an Excel file with random data. Note that **phone_simple** is set to **False** so it can generate complex, long-form phone numbers. This can come in handy when you want to experiment with more involved data extraction codes.
-
-```
-myDB.gen_excel(num=20,fields=['name','phone','time','country'],
-phone_simple=False,filename='TestExcel.xlsx')
-```
-
-The resulting file looks like this image:
-
-
-### Generate random email IDs for scrap use
-
-A built-in method in pydbgen is **realistic_email** , which generates random email IDs from a seed name. This is helpful when you don't want to use your real email address on the web—but something close.
-
-```
-for _ in range(10):
- print(myDB.realistic_email('Tirtha Sarkar'))
->>
-Tirtha_Sarkar@gmail.com
-Sarkar.Tirtha@outlook.com
-Tirtha_S48@verizon.com
-Tirtha_Sarkar62@yahoo.com
-Tirtha.S46@yandex.com
-Tirtha.S@att.com
-Sarkar.Tirtha60@gmail.com
-TirthaSarkar@zoho.com
-Sarkar.Tirtha@protonmail.com
-Tirtha.S@comcast.net
-```
-
-### Future improvements and user contributions
-
-There may be many bugs in the current version—if you notice any and your program crashes during execution (except for a crash due to your incorrect entry), please let me know. Also, if you have a cool idea to contribute to the source code, the [GitHub repo][1] is open. Some questions readily come to mind:
-
- * Can we integrate some machine learning/statistical modeling with this random data generator?
- * Should a visualization function be added to the generator?
-
-
-
-The possibilities are endless and exciting!
-
-If you have any questions or ideas to share, please contact me at [tirthajyoti[AT]gmail.com][4]. If you are, like me, passionate about machine learning and data science, please [add me on LinkedIn][5] or [follow me on Twitter][6]. Also, check my [GitHub repo][7] for other fun code snippets in Python, R, or MATLAB and some machine learning resources.
-
-Originally published on [Towards Data Science][8]. Licensed under [CC BY-SA 4.0][9].
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/11/pydbgen-random-database-table-generator
-
-作者:[Tirthajyoti Sarkar][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://opensource.com/users/tirthajyoti
-[b]: https://github.com/lujun9972
-[1]: https://github.com/tirthajyoti/pydbgen
-[2]: http://pydbgen.readthedocs.io/en/latest/
-[3]: https://faker.readthedocs.io/en/latest/index.html
-[4]: mailto:tirthajyoti@gmail.com
-[5]: https://www.linkedin.com/in/tirthajyoti-sarkar-2127aa7/
-[6]: https://twitter.com/tirthajyotiS
-[7]: https://github.com/tirthajyoti?tab=repositories
-[8]: https://towardsdatascience.com/introducing-pydbgen-a-random-dataframe-database-table-generator-b5c7bdc84be5
-[9]: https://creativecommons.org/licenses/by-sa/4.0/
diff --git a/sources/tech/20181105 Revisiting the Unix philosophy in 2018.md b/sources/tech/20181105 Revisiting the Unix philosophy in 2018.md
deleted file mode 100644
index 0b1e24b89b..0000000000
--- a/sources/tech/20181105 Revisiting the Unix philosophy in 2018.md
+++ /dev/null
@@ -1,104 +0,0 @@
-Revisiting the Unix philosophy in 2018
-======
-The old strategy of building small, focused applications is new again in the modern microservices environment.
-
-
-In 1984, Rob Pike and Brian W. Kernighan published an article called "[Program Design in the Unix Environment][1]" in the AT&T Bell Laboratories Technical Journal, in which they argued the Unix philosophy, using the example of BSD's **cat -v** implementation. In a nutshell that philosophy is: Build small, focused programs—in whatever language—that do only one thing but do this thing well, communicate via **stdin** / **stdout** , and are connected through pipes.
-
-Sound familiar?
-
-Yeah, I thought so. That's pretty much the [definition of microservices][2] offered by James Lewis and Martin Fowler:
-
-> In short, the microservice architectural style is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API.
-
-While one *nix program or one microservice may be very limited or not even very interesting on its own, it's the combination of such independently working units that reveals their true benefit and, therefore, their power.
-
-### *nix vs. microservices
-
-The following table compares programs (such as **cat** or **lsof** ) in a *nix environment against programs in a microservices environment.
-
-| | *nix | Microservices |
-| ----------------------------------- | -------------------------- | ----------------------------------- |
-| Unit of execution | program using stdin/stdout | service with HTTP or gRPC API |
-| Data flow | Pipes | ? |
-| Configuration & parameterization | Command-line arguments, | |
-| environment variables, config files | JSON/YAML docs | |
-| Discovery | Package manager, man, make | DNS, environment variables, OpenAPI |
-
-Let's explore each line in slightly greater detail.
-
-#### Unit of execution
-
-**stdin** and writes output to **stdout**. A microservices setup deals with a service that exposes one or more communication interfaces, such as HTTP or gRPC APIs. In both cases, you'll find stateless examples (essentially a purely functional behavior) and stateful examples, where, in addition to the input, some internal (persisted) state decides what happens.
-
-#### Data flow
-
-The unit of execution in *nix (such as Linux) is an executable file (binary or interpreted script) that, ideally, reads input fromand writes output to. A microservices setup deals with a service that exposes one or more communication interfaces, such as HTTP or gRPC APIs. In both cases, you'll find stateless examples (essentially a purely functional behavior) and stateful examples, where, in addition to the input, some internal (persisted) state decides what happens.
-
-Traditionally, *nix programs could communicate via pipes. In other words, thanks to [Doug McIlroy][3], you don't need to create temporary files to pass around and each can process virtually endless streams of data between processes. To my knowledge, there is nothing comparable to a pipe standardized in microservices, besides my little [Apache Kafka-based experiment from 2017][4].
-
-#### Configuration and parameterization
-
-How do you configure a program or service—either on a permanent or a by-call basis? Well, with *nix programs you essentially have three options: command-line arguments, environment variables, or full-blown config files. In microservices, you typically deal with YAML (or even worse, JSON) documents, defining the layout and configuration of a single microservice as well as dependencies and communication, storage, and runtime settings. Examples include [Kubernetes resource definitions][5], [Nomad job specifications][6], or [Docker Compose][7] files. These may or may not be parameterized; that is, either you have some templating language, such as [Helm][8] in Kubernetes, or you find yourself doing an awful lot of **sed -i** commands.
-
-#### Discovery
-
-How do you know what programs or services are available and how they are supposed to be used? Well, in *nix, you typically have a package manager as well as good old man; between them, they should be able to answer all the questions you might have. In a microservices setup, there's a bit more automation in finding a service. In addition to bespoke approaches like [Airbnb's SmartStack][9] or [Netflix's Eureka][10], there usually are environment variable-based or DNS-based [approaches][11] that allow you to discover services dynamically. Equally important, [OpenAPI][12] provides a de-facto standard for HTTP API documentation and design, and [gRPC][13] does the same for more tightly coupled high-performance cases. Last but not least, take developer experience (DX) into account, starting with writing good [Makefiles][14] and ending with writing your docs with (or in?) [**style**][15].
-
-### Pros and cons
-
-Both *nix and microservices offer a number of challenges and opportunities
-
-#### Composability
-
-It's hard to design something that has a clear, sharp focus and can also play well with others. It's even harder to get it right across different versions and to introduce respective error case handling capabilities. In microservices, this could mean retry logic and timeouts—maybe it's a better option to outsource these features into a service mesh? It's hard, but if you get it right, its reusability can be enormous.
-
-#### Observability
-
-In a monolith (in 2018) or a big program that tries to do it all (in 1984), it's rather straightforward to find the culprit when things go south. But, in a
-
-```
-yes | tr \\n x | head -c 450m | grep n
-```
-
-or a request path in a microservices setup that involves, say, 20 services, how do you even start to figure out which one is behaving badly? Luckily we have standards, notably [OpenCensus][16] and [OpenTracing][17]. Observability still might be the biggest single blocker if you are looking to move to microservices.
-
-#### Global state
-
-While it may not be such a big issue for *nix programs, in microservices, global state remains something of a discussion. Namely, how to make sure the local (persistent) state is managed effectively and how to make the global state consistent with as little effort as possible.
-
-### Wrapping up
-
-In the end, the question remains: Are you using the right tool for a given task? That is, in the same way a specialized *nix program implementing a range of functions might be the better choice for certain use cases or phases, it might be that a monolith [is the best option][18] for your organization or workload. Regardless, I hope this article helps you see the many, strong parallels between the Unix philosophy and microservices—maybe we can learn something from the former to benefit the latter.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/11/revisiting-unix-philosophy-2018
-
-作者:[Michael Hausenblas][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://opensource.com/users/mhausenblas
-[b]: https://github.com/lujun9972
-[1]: http://harmful.cat-v.org/cat-v/
-[2]: https://martinfowler.com/articles/microservices.html
-[3]: https://en.wikipedia.org/wiki/Douglas_McIlroy
-[4]: https://speakerdeck.com/mhausenblas/distributed-named-pipes-and-other-inter-services-communication
-[5]: http://kubernetesbyexample.com/
-[6]: https://www.nomadproject.io/docs/job-specification/index.html
-[7]: https://docs.docker.com/compose/overview/
-[8]: https://helm.sh/
-[9]: https://github.com/airbnb/smartstack-cookbook
-[10]: https://github.com/Netflix/eureka
-[11]: https://kubernetes.io/docs/concepts/services-networking/service/#discovering-services
-[12]: https://www.openapis.org/
-[13]: https://grpc.io/
-[14]: https://suva.sh/posts/well-documented-makefiles/
-[15]: https://www.linux.com/news/improve-your-writing-gnu-style-checkers
-[16]: https://opencensus.io/
-[17]: https://opentracing.io/
-[18]: https://robertnorthard.com/devops-days-well-architected-monoliths-are-okay/
diff --git a/sources/tech/20181105 Some Good Alternatives To ‘du- Command.md b/sources/tech/20181105 Some Good Alternatives To ‘du- Command.md
deleted file mode 100644
index 5856983f9e..0000000000
--- a/sources/tech/20181105 Some Good Alternatives To ‘du- Command.md
+++ /dev/null
@@ -1,308 +0,0 @@
-Some Good Alternatives To ‘du’ Command
-======
-
-
-
-As you may already know, the **“du”** command is used to compute and summarize the file and directory space usage in Unix-like systems. If you are a heavy user of du command, you will find this guide interesting! Today, I came across five good **alternatives to du** command. There could be many, but these are the ones that I am aware of at the moment. If I came across anything in future, I will add it in this list. Also, if you know any other alternatives, please let me know in the comment section below. I will review and add them in the list as well.
-
-### 1\. Ncdu
-
-The **Ncdu** is the popular alternative to du command in the Linux community. The developer of Ncdu is not satisfied with the performance of the du command, so he ended up creating his own. Ncdu is simple, yet fast disk usage analyzer written using **C** programming language with an **ncurses** interface to find which directories or files are taking up more space either on a local or remote systems. We already have published a detailed guide about Ncdu. Check the following link if you are interested to know more about it.
-
-### 2\. Tin Summer
-
-The **Tin Summer** is used to find the build artifacts that are taking up disk space. It is also an yet another good alternative for du command. Thanks to multi-threading, Tin-summer is significantly faster than du command when calculating the size of the big directories. Unlike Du command, it reads file sizes, not disk usage. Tin SUmmer is free, open source tool written using **Rust** programming language.
-
-The developer claims Tin Summer is good alternative to du command, because,
-
- * It is faster on larger directories compared to du command,
- * It displays the disk usage results in human-readable format by default,
- * It uses **regex** to exclude files/directories,
- * Provides sorted and colorized output,
- * Extensible,
- * And more.
-
-
-
-**Installing Tin Summer**
-
-To install Tin Summer, open your Terminal and run the following command:
-
-```
-$ curl -LSfs https://japaric.github.io/trust/install.sh | sh -s -- --git vmchale/tin-summer
-```
-
-Alternatively, you can install Tin Summer using **Cargo** package manager. Make sure you have installed **Rust** on your system as described in the following link.
-
-After installing Rust, run the following command to install Tin Summer:
-
-```
-$ cargo install tin-summer
-```
-
-If either of the above mentioned methods doesn’t not work, download the latest binary from the [**releases page**][1] and compile and install it manually.
-
-**Usage**
-
-To find the file sizes in a current working directory, use this command:
-
-```
-$ sn f
-749 MB ./.rustup/toolchains
-749 MB ./.rustup
-147 MB ./.cargo/bin
-147 MB ./.cargo
-900 MB .
-```
-
-See? It displays a nicer input in human-readable format by default. You need not to use any extra flags (like **-h** in du command) to get this result.
-
-To find the file sizes in a specific directory, mention the actual path like below:
-
-```
-$ sn f
-```
-
-We can also sort the list in the output as well. To display the sorted list of the top 5 biggest directories, run:
-
-```
-$ sn sort /home/sk/ -n5
-749 MB /home/sk/.rustup
-749 MB /home/sk/.rustup/toolchains
-147 MB /home/sk/.cargo
-147 MB /home/sk/.cargo/bin
-2.6 MB /home/sk/mcelog
-900 MB /home/sk/
-```
-
-For your information, the last result in the above output is the total size of the biggest directories in the given directory i.e **/home/sk/**. So, don’t wonder why you get six results instead of 5.
-
-To search current directory for directories with build artifacts:
-
-```
-$ sn ar
-```
-
-Tin Summer can also search for directories containing artifacts that occupy a certain size of the disk space. Say for example, to search for directories containing artifacts that occupy more than **100MB** of disk space, run:
-
-```
-$ sn ar -t100M
-```
-
-Like already mentioned, Tin Summer is faster on larger directories, but it is also slower on small ones. However, the developer assures he will find a way to fix this in the future releases!
-
-To get help, run:
-
-```
-$ sn --help
-```
-
-For more details, check the project’s GitHub repository given at the end of this guide.
-
-### 3\. Dust
-
-**Dust** (du+rust=dust) is more intuitive version of du utility. It will give us an instant overview of which directories are occupying the disk space without having to use **head** or **sort** commands. Like Tin Summer, it also displays the size of each directory in human-readable format by default. It is free, open source and written using **Rust** programming language.
-
-**Installing Dust**
-
-Since the dust utility is written in Rust, It can be installed using “cargo” package manager like below.
-
-```
-$ cargo install du-dust
-```
-
-Alternatively, you can download the latest binary from the [**releases page**][2] and install it as shown below. As of writing this guide, the latest version was **0.3.1**.
-
-```
-$ wget https://github.com/bootandy/dust/releases/download/v0.3.1/dust-v0.3.1-x86_64-unknown-linux-gnu.tar.gz
-```
-
-Extract the download file:
-
-```
-$ tar -xvf dust-v0.3.1-x86_64-unknown-linux-gnu.tar.gz
-```
-
-Finally, copy the executable file to your $PATH, for example **/usr/local/bin**.
-
-```
-$ sudo mv dust /usr/local/bin/
-```
-
-**Usage**
-
-To find the total file sizes in the current directory and its sub-directories, run:
-
-```
-$ dust
-```
-
-Sample output:
-
-
-
-We can also get the full path of all directories using **-p** flag.
-
-```
-$ dust -p
-```
-
-![dust 2][4]
-
-To get the total size of multiple directories, just mention them with space-separated:
-
-```
-$ dust
-```
-
-Here are some more examples.
-
-Show the apparent size of the files:
-
-```
-$ dust -s
-```
-
-Show particular number of directories only:
-
-```
-$ dust -n 10
-```
-
-Show 3 levels of sub-directories in the current directory:
-
-```
-$ dust -d 3
-```
-
-For help, run:
-
-```
-$ dust -h
-```
-
-For more details, refer the project’s GitHub page given at the end.
-
-### 4\. Diskus
-
-**Diskus** It is a simple and fast alternative command line utility to `du -sh`command. The diskus utility computes the total file size of the current directory. It is a parallelized version of `du -sh` or rather `du -sh --bytes` command. The developer of diskus utility claims that it is about **nine times faster** compared to ‘du -sh’. Diskus is minimal, fast and open source program written in **Rust** programming language.
-
-**Installing diskus**
-
-The diskus utility is available in [**AUR**][5], so you can install it on Arch-based systems using any AUR helper programs, for example [**Yay**][6] , as shown below.
-
-```
-$ yay -S diskus
-```
-
-On Ubuntu and its derivatives, download the latest diskus utility from the [**releases page**][7] and install it as shown below.
-
-```
-$ wget "https://github.com/sharkdp/diskus/releases/download/v0.3.1/diskus_0.3.1_amd64.deb"
-
-$ sudo dpkg -i diskus_0.3.1_amd64.deb
-```
-
-Alternatively, you can install diskus using **Cargo** package manager. Make sure you have installed **Rust 1.29** or higher on your system as described in the link given above in “Installing Tin Summer” section.
-
-Once you have Rust on your system, run the following command to install diskus:
-
-```
-$ cargo install diskus
-```
-
-**Usage**
-
-Usually, when I want to check the total disk space used by a particular directory, I use the **-sh** flags with **du** command as shown below.
-
-```
-$ du -sh dir
-```
-
-Here, **-s** flag indicates summary.
-
-Using Diskus tool, I find the total size of current working directory with command:
-
-```
-$ diskus
-```
-
-
-
-I tested diskus to compute the total size of different directories in my Arch Linux system. The speed of computing the total size of the directory is pretty impressive! I must admit that this utility is quite faster than ‘du -sh’. Please be mindful that it can find the size of the current directory only at the moment.
-
-For getting help, run:
-
-```
-$ diskus -h
-```
-
-For more details about Diskus, refer the official GitHub page (link at the end).
-
-**Suggested read:**
-
-### 5\. Duu
-
-**Duu** , short for **D** irectory **U** sage **U** tility, is another tool to find the disk usage of given directory. It is a cross-platform, so you can use it on Windows, Mac OS and Linux operating systems. It is written in **Python** programming language.
-
-**Installing Duu**
-
-Make sure you have installed Python3. Python3 is available in the default repositories of most Linux distributions, so the installation wouldn’t be a problem.
-
-Once Python3 is installed, download the latest Duu version from the official [**releases page**][8].
-
-```
-$ wget https://github.com/jftuga/duu/releases/download/2.20/duu.py
-```
-
-**Usage**
-
-To find the disk space occupied by the current working directory, simply run:
-
-```
-$ python3 duu.py
-```
-
-Sample output:
-
-
-
-As you can see in the above output, Duu utility will display a nice summary of total number of files and directories and their total size in bytes, KB and MB. It will also display the total size of each item.
-
-To display the total disk usage of a specific directory, just mention the full path like below:
-
-```
-$ python3 duu.py /home/sk/Downloads/
-```
-
-For more details, refer Duu github page included at the end.
-
-And, that’s all for now. Hope this was useful. You know now five alternatives to du command. Personally, I prefer Ncdu over all of them given in this guide. Now is your turn. Give them a try and let us know your thoughts on these tools in the comment section below.
-
-More good stuffs to come. Stay tuned!
-
-Cheers!
-
-
-
---------------------------------------------------------------------------------
-
-via: https://www.ostechnix.com/some-good-alternatives-to-du-command/
-
-作者:[SK][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://www.ostechnix.com/author/sk/
-[b]: https://github.com/lujun9972
-[1]: https://github.com/vmchale/tin-summer/releases
-[2]: https://github.com/bootandy/dust/releases
-[3]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
-[4]: http://www.ostechnix.com/wp-content/uploads/2018/11/dust-2.png
-[5]: https://aur.archlinux.org/packages/diskus-bin/
-[6]: https://www.ostechnix.com/yay-found-yet-another-reliable-aur-helper/
-[7]: https://github.com/sharkdp/diskus/releases
-[8]: https://github.com/jftuga/duu/releases
diff --git a/sources/tech/20181107 Top 30 OpenStack Interview Questions and Answers.md b/sources/tech/20181107 Top 30 OpenStack Interview Questions and Answers.md
new file mode 100644
index 0000000000..e00fc5452b
--- /dev/null
+++ b/sources/tech/20181107 Top 30 OpenStack Interview Questions and Answers.md
@@ -0,0 +1,324 @@
+Top 30 OpenStack Interview Questions and Answers
+======
+Now a days most of the firms are trying to migrate their IT infrastructure and Telco Infra into private cloud i.e OpenStack. If you planning to give interviews on Openstack admin profile, then below list of interview questions might help you to crack the interview.
+
+
+
+### Q:1 Define OpenStack and its key components?
+
+Ans: It is a bundle of opensource software, which all in combine forms a provide cloud software known as OpenStack.OpenStack is known as Stack of Open source Software or Projects.
+
+Following are the key components of OpenStack
+
+ * **Nova** – It handles the Virtual machines at compute level and performs other computing task at compute or hypervisor level.
+ * **Neutron** – It provides the networking functionality to VMs, Compute and Controller Nodes.
+ * **Keystone** – It provides the identity service for all cloud users and openstack services. In other words, we can say Keystone a method to provide access to cloud users and services.
+ * **Horizon** – It provides a GUI (Graphical User Interface), using the GUI Admin can all day to day operations task at ease.
+ * **Cinder** – It provides the block storage functionality, generally in OpenStack Cinder is integrated with Chef and ScaleIO to service block storage to Compute & Controller nodes.
+ * **Swift** – It provides the object storage functionality. Generally, Glance images are on object storage. External storage like ScaleIO can work as Object storage too and can easily be integrated with Glance Service.
+ * **Glance** – It provides Cloud image services, using glance admin used to upload and download cloud images.
+ * **Heat** – It provides an orchestration service or functionality. Using Heat admin can easily VMs as stack and based on requirements VMs in the stack can be scale-in and Scale-out
+ * **Ceilometer** – It provides the telemetry and billing services.
+
+
+
+### Q:2 What are services generally run on a controller node?
+
+Ans: Following services run on a controller node:
+
+ * Identity Service ( KeyStone)
+ * Image Service ( Glance)
+ * Nova Services like Nova API, Nova Scheduler & Nova DB
+ * Block & Object Service
+ * Ceilometer Service
+ * MariaDB / MySQL and RabbitMQ Service
+ * Management services of Networking (Neutron) and Networking agents
+ * Orchestration Service (Heat)
+
+
+
+### Q:3 What are the services generally run on a Compute Node?
+
+Ans: Following services run on a compute node,
+
+ * Nova-Compute
+ * Networking Services like OVS
+
+
+
+### Q:4 What is the default location of VMs on the Compute Nodes?
+
+Ans: VMs in the Compute node are stored at “ **/var/lib/nova/instances** ”
+
+### Q:5 What is default location of glance images?
+
+Ans: As the Glance service runs on a controller node, all the glance images are store under the folder “ **/var/lib/glance/images** ” on a controller node.
+
+Read More : [**How to Create and Delete Virtual Machine(VM) from Command line in OpenStack**][1]
+
+### Q:6 Tell me the command how to spin a VM from Command Line?
+
+Ans: We can easily spin a new VM using the following openstack command,
+
+```
+# openstack server create --flavor {flavor-name} --image {Image-Name-Or-Image-ID} --nic net-id={Network-ID} --security-group {Security_Group_ID} –key-name {Keypair-Name}
+```
+
+### Q:7 How to list the network namespace of a tenant in OpenStack?
+
+Ans: Network namespace of a tenant can be listed using “ip net ns” command
+
+```
+~# ip netns list
+qdhcp-a51635b1-d023-419a-93b5-39de47755d2d
+haproxy
+vrouter
+```
+
+### Q:8 How to execute command inside network namespace in openstack?
+
+Ans: Let’s assume we want to execute “ifconfig” command inside the network namespace “qdhcp-a51635b1-d023-419a-93b5-39de47755d2d”, then run the beneath command,
+
+Syntax : ip netns exec {network-space}
+
+```
+~# ip netns exec qdhcp-a51635b1-d023-419a-93b5-39de47755d2d "ifconfig"
+```
+
+### Q:9 How to upload and download a cloud image in Glance from command line?
+
+Ans: A Cloud image can be uploaded in glance from command using beneath openstack command,
+
+```
+~# openstack image create --disk-format qcow2 --container-format bare --public --file {Name-Cloud-Image}.qcow2
+```
+
+Use below openstack command to download a cloud image from command line,
+
+```
+~# glance image-download --file --progress
+```
+
+### Q:10 How to reset error state of a VM into active in OpenStack env?
+
+Ans: There are some scenarios where some VMs went to error state and this error state can be changed into active state using below commands,
+
+```
+~# nova reset-state --active {Instance_id}
+```
+
+### Q:11 How to get list of available Floating IPs from command line?
+
+Ans: Available floating ips can be listed using the below command,
+
+```
+~]# openstack ip floating list | grep None | head -10
+```
+
+### Q:12 How to provision a virtual machine in specific availability zone and compute Host?
+
+Ans: Let’s assume we want to provision a VM on the availability zone NonProduction in compute-02, use the beneath command to accomplish this,
+
+```
+~]# openstack server create --flavor m1.tiny --image cirros --nic net-id=e0be93b8-728b-4d4d-a272-7d672b2560a6 --security-group NonProd_SG --key-name linuxtec --availability-zone NonProduction:compute-02 nonprod_testvm
+```
+
+### Q:13 How to get list of VMs which are provisioned on a specific Compute node?
+
+Ans: Let’s assume we want to list the vms which are provisioned on compute-0-19, use below
+
+Syntax: openstack server list –all-projects –long -c Name -c Host | grep -i {Compute-Node-Name}
+
+```
+~# openstack server list --all-projects --long -c Name -c Host | grep -i compute-0-19
+```
+
+### Q:14 How to view the console log of an openstack instance from command line?
+
+Ans: Console logs of an instance can be viewed from the command line using the following commands,
+
+First get the ID of an instance and then use the below command,
+
+```
+~# openstack console log show {Instance-id}
+```
+
+### Q:15 How to get console URL of an openstack instance?
+
+Ans: Console URL of an instance can be retrieved from command line using the below openstack command,
+
+```
+~# openstack console url show {Instance-id}
+```
+
+### Q:16 How to create a bootable cinder / block storage volume from command line?
+
+Ans: To Create a bootable cinder or block storage volume (assume 8 GB) , refer the below steps:
+
+ * Get Image list using below
+
+
+
+```
+~# openstack image list | grep -i cirros
+| 89254d46-a54b-4bc8-8e4d-658287c7ee92 | cirros | active |
+```
+
+ * Create bootable volume of size 8 GB using cirros image
+
+
+
+```
+~# cinder create --image-id 89254d46-a54b-4bc8-8e4d-658287c7ee92 --display-name cirros-bootable-vol 8
+```
+
+### Q:17 How to list all projects or tenants that has been created in your opentstack?
+
+Ans: Projects or tenants list can be retrieved from the command using the below openstack command,
+
+```
+~# openstack project list --long
+```
+
+### Q:18 How to list the endpoints of openstack services?
+
+Ans: Openstack service endpoints are classified into three categories,
+
+ * Public Endpoint
+ * Internal Endpoint
+ * Admin Endpoint
+
+
+
+Use below openstack command to view endpoints of each openstack service,
+
+```
+~# openstack catalog list
+```
+
+To list the endpoint of a specific service like keystone use below,
+
+```
+~# openstack catalog show keystone
+```
+
+Read More : [**Step by Step Instance Creation Flow in OpenStack**][2]
+
+### Q:19 In which order we should restart nova services on a controller node?
+
+Ans: Following order should be followed to restart the nova services on openstack controller node,
+
+ * service nova-api restart
+ * service nova-cert restart
+ * service nova-conductor restart
+ * service nova-consoleauth restart
+ * service nova-scheduler restart
+
+
+
+### Q:20 Let’s assume DPDK ports are configured on compute node for data traffic, now how you will check the status of dpdk ports?
+
+Ans: As DPDK ports are configured via openvSwitch (OVS), use below commands to check the status,
+
+### Q:21 How to add new rules to the existing SG(Security Group) from command line in openstack?
+
+Ans: New rules to the existing SG in openstack can be added using the neutron command,
+
+```
+~# neutron security-group-rule-create --protocol --port-range-min --port-range-max --direction --remote-ip-prefix Security-Group-Name
+```
+
+### Q:22 How to view the OVS bridges configured on Controller and Compute Nodes?
+
+Ans: OVS bridges on Controller and Compute nodes can be viewed using below command,
+
+```
+~]# ovs-vsctl show
+```
+
+### Q:23 What is the role of Integration Bridge(br-int) on the Compute Node ?
+
+Ans: The integration bridge (br-int) performs VLAN tagging and untagging for the traffic coming from and to the instance running on the compute node.
+
+Packets leaving the n/w interface of an instance goes through the linux bridge (qbr) using the virtual interface qvo. The interface qvb is connected to the Linux Bridge & interface qvo is connected to integration bridge (br-int). The qvo port on integration bridge has an internal VLAN tag that gets appended to packet header when a packet reaches to the integration bridge.
+
+### Q:24 What is the role of Tunnel Bridge (br-tun) on the compute node?
+
+Ans: The tunnel bridge (br-tun) translates the VLAN tagged traffic from integration bridge to the tunnel ids using OpenFlow rules.
+
+br-tun (tunnel bridge) allows the communication between the instances on different networks. Tunneling helps to encapsulate the traffic travelling over insecure networks, br-tun supports two overlay networks i.e GRE and VXLAN
+
+### Q:25 What is the role of external OVS bridge (br-ex)?
+
+Ans: As the name suggests, this bridge forwards the traffic coming to and from the network to allow external access to instances. br-ex connects to the physical interface like eth2, so that floating IP traffic for tenants networks is received from the physical network and routed to the tenant network ports.
+
+### Q:26 What is function of OpenFlow rules in OpenStack Networking?
+
+Ans: OpenFlow rules is a mechanism that define how a packet will reach to destination starting from its source. OpenFlow rules resides in flow tables. The flow tables are part of OpenFlow switch.
+
+When a packet arrives to a switch, it is processed by the first flow table, if it doesn’t match any flow entries in the table then packet is dropped or forwarded to another table.
+
+### Q:27 How to display the information about a OpenFlow switch (like ports, no. of tables, no of buffer)?
+
+Ans: Let’s assume we want to display the information about OpenFlow switch (br-int), run the following command,
+
+```
+root@compute-0-15# ovs-ofctl show br-int
+OFPT_FEATURES_REPLY (xid=0x2): dpid:0000fe981785c443
+n_tables:254, n_buffers:256
+capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
+actions: output enqueue set_vlan_vid set_vlan_pcp strip_vlan mod_dl_src mod_dl_dst mod_nw_src mod_nw_dst mod_nw_tos mod_tp_src mod_tp_dst
+ 1(patch-tun): addr:3a:c6:4f:bd:3e:3b
+ config: 0
+ state: 0
+ speed: 0 Mbps now, 0 Mbps max
+ 2(qvob35d2d65-f3): addr:b2:83:c4:0b:42:3a
+ config: 0
+ state: 0
+ current: 10GB-FD COPPER
+ speed: 10000 Mbps now, 0 Mbps max
+ ………………………………………
+```
+
+### Q:28 How to display the entries for all the flows in a switch?
+
+Ans: Flows entries of a switch can be displayed using the command ‘ **ovs-ofctl dump-flows** ‘
+
+Let’s assume we want to display flow entries of OVS integration bridge (br-int),
+
+### Q:29 What are Neutron Agents and how to list all neutron agents?
+
+Ans: OpenStack neutron server acts as the centralized controller, the actual network configurations are executed either on compute and network nodes. Neutron agents are software entities that carry out configuration changes on compute or network nodes. Neutron agents communicate with the main neutron service via Neuron API and message queue.
+
+Neutron agents can be listed using the following command,
+
+```
+~# openstack network agent list -c ‘Agent type’ -c Host -c Alive -c State
+```
+
+### Q:30 What is CPU pinning?
+
+Ans: CPU pinning refers to reserving the physical cores for specific virtual machine. It is also known as CPU isolation or processor affinity. The configuration is in two parts:
+
+ * it ensures that virtual machine can only run on dedicated cores
+ * it also ensures that common host processes don’t run on those cores
+
+
+
+In other words we can say pinning is one to one mapping of a physical core to a guest vCPU.
+
+--------------------------------------------------------------------------------
+
+via: https://www.linuxtechi.com/openstack-interview-questions-answers/
+
+作者:[Pradeep Kumar][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: http://www.linuxtechi.com/author/pradeep/
+[b]: https://github.com/lujun9972
+[1]: https://www.linuxtechi.com/create-delete-virtual-machine-command-line-openstack/
+[2]: https://www.linuxtechi.com/step-by-step-instance-creation-flow-in-openstack/
diff --git a/sources/tech/20181109 Must-Have Tools for Writers on the Linux Platform.md b/sources/tech/20181109 Must-Have Tools for Writers on the Linux Platform.md
new file mode 100644
index 0000000000..0ab375a008
--- /dev/null
+++ b/sources/tech/20181109 Must-Have Tools for Writers on the Linux Platform.md
@@ -0,0 +1,118 @@
+Must-Have Tools for Writers on the Linux Platform
+======
+
+
+I’ve been a writer for more than 20 years. I’ve written thousands of articles and how-tos on various technical topics and have penned more than 40 works of fiction. So, the written word is not only important to me, it’s familiar to the point of being second nature. And through those two decades (and counting) I’ve done nearly all my work on the Linux platform. I must confess, during those early years it wasn’t always easy. Formats didn’t always mesh with what an editor required and, in some cases, the open source platform simply didn’t have the necessary tools required to get the job done.
+
+That was then, this is now.
+
+A perfect storm of Linux evolution and web-based tools have made it such that any writer can get the job done (and done well) on Linux. But what tools will you need? You might be surprised to find out that, in some instances, the job cannot be efficiently done with 100% open source tools. Even with that caveat, the job can be done. Let’s take a look at the tools I’ve been using as both a tech writer and author of fiction. I’m going to outline this by way of my writing process for both nonfiction and fiction (as the process is different and requires specific tools).
+
+A word of warning to seriously hard-core Linux users. A long time ago, I gave up on using tools like LaTeX and DocBook for my writing. Why? Because, for me, the focus must be on the content, not the process. When you’re facing deadlines, efficiency must take precedent.
+
+### Nonfiction
+
+We’ll start with nonfiction, as that process is the simpler of the two. For writing technical how-tos, I collaborate with different editors and, in some cases, have to copy/paste content into a CMS. But like with my fiction, the process always starts with Google Drive. This is the point at which many open source purists will check out. Fear not, you can always opt to either keep all of your files locally, or use a more open-friendly cloud service (such as [Zoho][1] or [nextCloud][2]).
+
+Why start on the cloud? Over the years, I’ve found I need to be able to access that content from anywhere at any time. The simplest solution was to migrate the cloud. I’ve also become paranoid about losing work. To that end, I make use of a tool like [Insync][3] to keep my Google Drive in sync with my desktop. With that desktop sync in place, I know there’s always a backup of my work, in case something should go awry with Google Drive.
+
+For those clients with whom I must enter content into a Content Management System (CMS), the process ends there. I can copy/paste directly from a Google Doc into the CMS and be done with it. Of course, with technical content, there are always screenshots involved. For that, I use [Gimp][4], which makes taking screenshots simple:
+
+![screenshot with Gimp][6]
+
+Figure 1: Taking a screenshot with Gimp.
+
+[Used with permission][7]
+
+ 1. Open Gimp.
+
+ 2. Click File > Create > Screenshot.
+
+ 3. Select from a single window, the entire screen, or a region to grab (Figure 1).
+
+ 4. Click Snap.
+
+
+
+
+The majority of my clients tend to prefer I work with Google Docs, because I can share folders so that they have reliable access to the content. There are a few clients I have that do not work with Google Docs, and so I must download the files into a format that can be used. What I do for this is download in .odt format, open the document in [LibreOffice][8] (Figure 2), format as needed, save in a format required by the client, and send the document on.
+
+![Google Doc][10]
+
+Figure 2: My Google Doc download opened in LibreOffice.
+
+[Used with permission][7]
+
+And that, is the end of the line for nonfiction.
+
+### Fiction
+
+This is where it gets a bit more complicated. The beginning steps are the same, as I always write every first draft of a novel in Google Docs. Once that is complete, I then download the file to my Linux desktop, open the file in LibreOffice, format as necessary, and then save as a file type supported by my editor (unfortunately, that means .docx).
+
+The next step in the process gets a bit dicey. My editor prefers to use comments over track changes (as it makes it easier for both of us to read the document as we make changes). Because of this, a 60k word doc can include hundreds upon hundreds of comments, which slows LibreOffice to a useless crawl. Once upon a time, you could up the memory used for documents, but as of LibreOffice 6, that is no longer possible. This means any larger, novel-length, document with numerous comments will become unusable. Because of that, I’ve had to take drastic measures and use [WPS Office][11] (Figure 3). Although this isn’t an open source solution, WPS Office does a fine job with numerous comments in a document, so there’s no need to deal with the frustration that is LibreOffice (when working with these large files with hundreds of comments).
+
+![comments][13]
+
+Figure 3: WPS handles numerous comments with ease.
+
+[Used with permission][7]
+
+Once my editor and I finish up the edits for the book (and all comments have been removed), I can then open the file in LibreOffice for final formatting. When the formatting is complete, I save the file in .html format and then open the file in [Calibre][14] for exporting the file to .mobi and .epub formats.
+
+Calibre is a must-have for anyone looking to publish on Amazon, Barnes & Noble, Smashwords, or other platforms. One thing Calibre does better than other, similar, solutions is enable you to directly edit the .epub files (Figure 4). For the likes of Smashword, this is an absolute necessity (as the export process will add elements not accepted on the Smashwords conversion tool).
+
+![Calibre][16]
+
+Figure 4: Editing an epub file directly in Calibre.
+
+[Creative Commons Zero][17]
+
+After the writing process is over (or sometimes while waiting for an editor to complete a pass), I’ll start working on the cover for the book. That task is handled completely in Gimp (Figure 5).
+
+![Using Gimp][19]
+
+Figure 5: Creating the cover of POTUS in Gimp.
+
+[Used with permission][7]
+
+And that finishes up the process of creating a work of fiction on the Linux platform. Because of the length of the documents, and how some editors work, it can get a bit more complicated than the process of creating nonfiction, but it’s far from challenging. In fact, creating fiction on Linux is just as simple (and more reliable) than other platforms.
+
+### HTH
+
+I hope this helps aspiring writers to have the confidence to write on the Linux platform. There are plenty of other tools available to use, but the ones I have listed here have served me quite well over the years. And although I do make use of a couple of proprietary tools, as long as they keep working well on Linux, I’m okay with that.
+
+Learn more about Linux in the[ Introduction to Open Source Development, Git, and Linux (LFD201) ][20]training course from The Linux Foundation, and sign up now to start your open source journey.
+
+--------------------------------------------------------------------------------
+
+via: https://www.linux.com/learn/2018/11/must-have-tools-writers-linux-platform
+
+作者:[Jack Wallen][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.linux.com/users/jlwallen
+[b]: https://github.com/lujun9972
+[1]: https://www.zoho.com/
+[2]: https://nextcloud.com/
+[3]: https://www.insynchq.com
+[4]: https://www.gimp.org/
+[5]: /files/images/writingtools1jpg
+[6]: https://www.linux.com/sites/lcom/files/styles/floated_images/public/writingtools_1.jpg?itok=Uko7DZ8U (screenshot with Gimp)
+[7]: /licenses/category/used-permission
+[8]: https://www.libreoffice.org/
+[9]: /files/images/writingtools2jpg
+[10]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/writingtools_2.jpg?itok=vDgxd8hu (Google Doc)
+[11]: https://www.wps.com/en-US/
+[12]: /files/images/writingtools3jpg
+[13]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/writingtools_3.jpg?itok=AYrsfz01 (comments)
+[14]: https://calibre-ebook.com/
+[15]: /files/images/writingtools4jpg
+[16]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/writingtools_4.jpg?itok=wFMEsL7b (Calibre)
+[17]: /licenses/category/creative-commons-zero
+[18]: /files/images/writingtools5jpg
+[19]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/writingtools_5.jpg?itok=e7SZCgip (Using Gimp)
+[20]: https://training.linuxfoundation.org/training/introduction-to-open-source-development-git-and-linux/?utm_source=linux.com&utm_medium=article&utm_campaign=lfd201
diff --git a/sources/tech/20181112 A Free, Secure And Cross-platform Password Manager.md b/sources/tech/20181112 A Free, Secure And Cross-platform Password Manager.md
new file mode 100644
index 0000000000..66d34769c4
--- /dev/null
+++ b/sources/tech/20181112 A Free, Secure And Cross-platform Password Manager.md
@@ -0,0 +1,137 @@
+A Free, Secure And Cross-platform Password Manager
+======
+
+
+
+In this modern Internet era, you will surely have multiple accounts on lot of websites. It could be a personal or official mail account, social or professional network account, GitHub account, and ecommerce account etc. So you should have several different passwords for different accounts. I am sure that you are already aware that setting up same password to multiple accounts is crazy and dangerous practice. If an attacker managed to breach one of your accounts, it’s highly likely he/she will try to access other accounts you have with the same password. So, it is **highly recommended to set different passwords** to different accounts.
+
+However, remembering several passwords might be difficult. You can write them in a paper. But it is not an efficient method either and you might lose them over a period of time. This is where the password managers comes in help. The password managers are like a repository where you can store all your passwords for different accounts and lock them down with a master password. By this way, all you need to remember is just the master password. We already have reviewed an open source password manager named [**KeeWeb**][1]. Today, we are going to see yet another password manager called **Buttercup**.
+
+### About Buttercup
+
+Buttercup is a free, open source, secure and cross-platform password manager written using **NodeJS**. It helps you to store all your login credentials of different accounts in an encrypted archive, which can be stored in your local system or any remote services like DropBox, ownCloud, NextCloud and WebDAV-based services. It uses strong **256bit AES encryption** method to save your sensitive data with a master password. So, no one can access your login details except those who have the master password. Buttercup currently supports Linux, Mac OS and Windows. It is also available a browser extension and mobile app. so, you can access the same archive you use on the desktop application and browser extension in your Android or iOS devices as well.
+
+### Installing Buttercup Password Manager
+
+Buttercup is currently available as **.deb** , **.rpm** packages, portable AppImage and tar archives for Linux platform. Head over to the [**releases pages**][2] and download and install the version you want to use.
+
+Buttercup desktop application is also available in [**AUR**][3], so you can install on Arch-based systems using AUR helper programs, such as [**Yay**][4], as shown below:
+
+```
+$ yay -S buttercup-desktop
+```
+
+If you have downloaded the portable AppImage file, make it executable using command:
+
+```
+$ chmod +x buttercup-desktop-1.11.0-x86_64.AppImage
+```
+
+Then, launch it using command:
+
+```
+$ ./buttercup-desktop-1.11.0-x86_64.AppImage
+```
+
+Once you run this command, it will prompt whether you like to integrate Buttercup AppImage with your system. If you choose ‘Yes’, this will add it to your applications menu and install icons. If you don’t do this, you can still launch the application by double-clicking on the AppImage or using the above command from the Terminal.
+
+### Add archives
+
+When you launch it for the first time, you will see the following welcome screen:
+
+
+We haven’t added any archives yet, so let us add one. To do so, click on the “New Archive File” button and type the name of the archive file and choose the location to save it.
+
+
+You can name it as you wish. I named it mine as “mypass”. The archives will have extension **.bcup** at the end and saved in the location of your choice.
+
+If you already have created one, simply choose it by clicking on “Open Archive File”.
+
+Next, buttercup will prompt you to enter a master password to the newly created archive. It is recommended to provide a strong password to protect the archives from the unauthorized access.
+
+
+
+We have now created an archive and secured it with a master password. Similarly, you can create any number of archives and protect them with a password.
+
+Let us go ahead and add the account details in the archives.
+
+### Adding entries (login credentials) in the archives
+
+Once you created or opened the archive, you will see the following screen.
+
+
+
+It is like a vault where we are going to save our login credentials of different online accounts. As you can see, we haven’t added any entries yet. Let us add some.
+
+To add a new entry, click “ADD ENTRY” button on the lower right corner and enter your account information you want to save.
+
+
+
+If you want to add any extra detail, there is an “ADD NEW FIELD” option right under the each entry. Just click on it and add as many as fields you want to include in the entries.
+
+Once you added all entries, you will see them on the right pane of the Buttercup interface.
+
+![][6]
+
+### Creating new groups
+
+You can also group login details under different name for easy recognition. Say for example, you can group all your mail accounts under a distinct name named “my_mails”. By default, your login details will be saved under “General” group. To create a new group, click “NEW GROUP” button and provide the name for the group. When creating new entries inside a new group, just click on the group name and start adding the entries as shown above.
+
+### Manage and access login details
+
+The data stored in the archives can be edited, moved to different groups, or entirely deleted at anytime. For instance, if you want to copy the username or password to clipboard, right click on the entry and choose “Copy to Clipboard” option.
+
+![][7]
+
+To edit/modify the data in the future, just click “Edit” button under the selected entry.
+
+### Save archives on remote location
+
+By default, Buttercup will save your data on the local system. However, you can save them on different remote services, such as Dropbox, ownCloud/NextCloud, WebDAV-based service.
+
+To connect to these services, go to **File - > Connect Cloud Sources**.
+
+
+
+And, choose the service you want to connect and authorize it to save your data.
+
+![][8]
+
+You can also connect those services from the Buttercup welcome screen while adding the archives.
+
+### Import/Export
+
+Buttercup allows you to import or export data to or from other password managers, such as 1Password, Lastpass and KeePass. You can also export your data and access them from another system or device, for example on your Android phone. You can export Buttercup vaults to CSV format as well.
+
+![][9]
+
+Buttercup is a simple, yet mature and fully functional password manager. It is being actively developed for years. If you ever in need of a password manager, Buttercup might a good choice. For more details, refer the project website and github page.
+
+And, that’s all for now. Hope this was useful. More good stuffs to come. Stay tuned!
+
+Cheers!
+
+
+
+--------------------------------------------------------------------------------
+
+via: https://www.ostechnix.com/buttercup-a-free-secure-and-cross-platform-password-manager/
+
+作者:[SK][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.ostechnix.com/author/sk/
+[b]: https://github.com/lujun9972
+[1]: https://www.ostechnix.com/keeweb-an-open-source-cross-platform-password-manager/
+[2]: https://github.com/buttercup/buttercup-desktop/releases/latest
+[3]: https://aur.archlinux.org/packages/buttercup-desktop/
+[4]: https://www.ostechnix.com/yay-found-yet-another-reliable-aur-helper/
+[5]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
+[6]: http://www.ostechnix.com/wp-content/uploads/2018/11/buttercup-6.png
+[7]: http://www.ostechnix.com/wp-content/uploads/2018/11/buttercup-7.png
+[8]: http://www.ostechnix.com/wp-content/uploads/2018/11/buttercup-9.png
+[9]: http://www.ostechnix.com/wp-content/uploads/2018/11/buttercup-10.png
diff --git a/sources/tech/20181112 Behind the scenes with Linux containers.md b/sources/tech/20181112 Behind the scenes with Linux containers.md
new file mode 100644
index 0000000000..0f813ac517
--- /dev/null
+++ b/sources/tech/20181112 Behind the scenes with Linux containers.md
@@ -0,0 +1,205 @@
+Behind the scenes with Linux containers
+======
+Become a better container troubleshooter by using LXC to understand how they work.
+
+
+Can you have Linux containers without [Docker][1]? Without [OpenShift][2]? Without [Kubernetes][3]?
+
+Yes, you can. Years before Docker made containers a household term (if you live in a data center, that is), the [LXC][4] project developed the concept of running a kind of virtual operating system, sharing the same kernel, but contained within defined groups of processes.
+
+Docker built on LXC, and today there are plenty of platforms that leverage the work of LXC both directly and indirectly. Most of these platforms make creating and maintaining containers sublimely simple, and for large deployments, it makes sense to use such specialized services. However, not everyone's managing a large deployment or has access to big services to learn about containerization. The good news is that you can create, use, and learn containers with nothing more than a PC running Linux and this article. This article will help you understand containers by looking at LXC, how it works, why it works, and how to troubleshoot when something goes wrong.
+
+### Sidestepping the simplicity
+
+If you're looking for a quick-start guide to LXC, refer to the excellent [Linux Containers][5] website.
+
+### Installing LXC
+
+If it's not already installed, you can install [LXC][6] with your package manager.
+
+On Fedora or similar, enter:
+
+```
+$ sudo dnf install lxc lxc-templates lxc-doc
+```
+
+On Debian, Ubuntu, and similar, enter:
+
+```
+$ sudo apt install lxc
+```
+
+### Creating a network bridge
+
+Most containers assume a network will be available, and most container tools expect the user to be able to create virtual network devices. The most basic unit required for containers is the network bridge, which is more or less the software equivalent of a network switch. A network switch is a little like a smart Y-adapter used to split a headphone jack so two people can hear the same thing with separate headsets, except instead of an audio signal, a network switch bridges network data.
+
+You can create your own software network bridge so your host computer and your container OS can both send and receive different network data over a single network device (either your Ethernet port or your wireless card). This is an important concept that often gets lost once you graduate from manually generating containers, because no matter the size of your deployment, it's highly unlikely you have a dedicated physical network card for each container you run. It's vital to understand that containers talk to virtual network devices, so you know where to start troubleshooting if a container loses its network connection.
+
+To create a network bridge on your machine, you must have the appropriate permissions. For this article, use the **sudo** command to operate with root privileges. (However, LXC docs provide a configuration to grant users permission to do this without using **sudo**.)
+
+```
+$ sudo ip link add br0 type bridge
+```
+
+Verify that the imaginary network interface has been created:
+
+```
+$ sudo ip addr show br0
+7: br0: mtu 1500 qdisc
+ noop state DOWN group default qlen 1000
+ link/ether 26:fa:21:5f:cf:99 brd ff:ff:ff:ff:ff:ff
+```
+
+Since **br0** is seen as a network interface, it requires its own IP address. Choose a valid local IP address that doesn't conflict with any existing IP address on your network and assign it to the **br0** device:
+
+```
+$ sudo ip addr add 192.168.168.168 dev br0
+```
+
+And finally, ensure that **br0** is up and running:
+
+```
+$ sudo ip link set br0 up
+```
+
+### Setting the container config
+
+The config file for an LXC container can be as complex as it needs to be to define a container's place in your network and the host system, but for this example the config is simple. Create a file in your favorite text editor and define a name for the container and the network's required settings:
+
+```
+lxc.utsname = opensourcedotcom
+lxc.network.type = veth
+lxc.network.flags = up
+lxc.network.link = br0
+lxc.network.hwaddr = 4a:49:43:49:79:bd
+lxc.network.ipv4 = 192.168.168.1/24
+lxc.network.ipv6 = 2003:db8:1:0:214:1234:fe0b:3596
+```
+
+Save this file in your home directory as **mycontainer.conf**.
+
+The **lxc.utsname** is arbitrary. You can call your container whatever you like; it's the name you'll use when starting and stopping it.
+
+The network type is set to **veth** , which is a kind of virtual Ethernet patch cable. The idea is that the **veth** connection goes from the container to the bridge device, which is defined by the **lxc.network.link** property, set to **br0**. The IP address for the container is in the same network as the bridge device but unique to avoid collisions.
+
+With the exception of the **veth** network type and the **up** network flag, you invent all the values in the config file. The list of properties is available from **man lxc.container.conf**. (If it's missing on your system, check your package manager for separate LXC documentation packages.) There are several example config files in **/usr/share/doc/lxc/examples** , which you should review later.
+
+### Launching a container shell
+
+At this point, you're two-thirds of the way to an operable container: you have the network infrastructure, and you've installed the imaginary network cards in an imaginary PC. All you need now is to install an operating system.
+
+However, even at this stage, you can see LXC at work by launching a shell within a container space.
+
+```
+$ sudo lxc-execute --name basic \
+--rcfile ~/mycontainer.conf /bin/bash \
+--logfile mycontainer.log
+#
+```
+
+In this very bare container, look at your network configuration. It should look familiar, yet unique, to you.
+
+```
+# /usr/sbin/ip addr show
+1: lo: mtu 65536 qdisc noqueue state [...]
+link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
+inet 127.0.0.1/8 scope host lo
+[...]
+22: eth0@if23: [...] qlen 1000
+link/ether 4a:49:43:49:79:bd brd ff:ff:ff:ff:ff:ff link-netnsid 0
+inet 192.168.168.167/24 brd 192.168.168.255 scope global eth0
+ valid_lft forever preferred_lft forever
+inet6 2003:db8:1:0:214:1234:fe0b:3596/64 scope global
+ valid_lft forever preferred_lft forever
+[...]
+```
+
+Your container is aware of its fake network infrastructure and of a familiar-yet-unique kernel.
+
+```
+# uname -av
+Linux opensourcedotcom 4.18.13-100.fc27.x86_64 #1 SMP Wed Oct 10 18:34:01 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
+```
+
+Use the **exit** command to leave the container:
+
+```
+# exit
+```
+
+### Installing the container operating system
+
+Building out a fully containerized environment is a lot more complex than the networking and config steps, so you can borrow a container template from LXC. If you don't have any templates, look for a separate LXC template package in your software repository.
+
+The default LXC templates are available in **/usr/share/lxc/templates**.
+
+```
+$ ls -m /usr/share/lxc/templates/
+lxc-alpine, lxc-altlinux, lxc-archlinux, lxc-busybox, lxc-centos, lxc-cirros, lxc-debian, lxc-download, lxc-fedora, lxc-gentoo, lxc-openmandriva, lxc-opensuse, lxc-oracle, lxc-plamo, lxc-slackware, lxc-sparclinux, lxc-sshd, lxc-ubuntu, lxc-ubuntu-cloud
+```
+
+Pick your favorite, then create the container. This example uses Slackware.
+
+```
+$ sudo lxc-create --name slackware --template slackware
+```
+
+Watching a template being executed is almost as educational as building one from scratch; it's very verbose, and you can see that **lxc-create** sets the "root" of the container to **/var/lib/lxc/slackware/rootfs** and several packages are being downloaded and installed to that directory.
+
+Reading through the template files gives you an even better idea of what's involved: LXC sets up a minimal device tree, common spool files, a file systems table (fstab), init files, and so on. It also prevents some services that make no sense in a container (like udev for hardware detection) from starting. Since the templates cover a wide spectrum of typical Linux configurations, if you intend to design your own, it's wise to base your work on a template closest to what you want to set up; otherwise, you're sure to make errors of omission (if nothing else) that the LXC project has already stumbled over and accounted for.
+
+Once you've installed the minimal operating system environment, you can start your container.
+
+```
+$ sudo lxc-start --name slackware \
+--rcfile ~/mycontainer.conf
+```
+
+You have started the container, but you have not attached to it. (Unlike the previous basic example, you're not just running a shell this time, but a containerized operating system.) Attach to it by name.
+
+```
+$ sudo lxc-attach --name slackware
+#
+```
+
+Check that the IP address of your environment matches the one in your config file.
+
+```
+# /usr/sbin/ip addr SHOW | grep eth
+34: eth0@if35: mtu 1500 [...] 1000
+link/ether 4a:49:43:49:79:bd brd ff:ff:ff:ff:ff:ff link-netnsid 0
+inet 192.168.168.167/24 brd 192.168.168.255 scope global eth0
+```
+
+Exit the container, and shut it down.
+
+```
+# exit
+$ sudo lxc-stop slackware
+```
+
+### Running real-world containers with LXC
+
+In real life, LXC makes it easy to create and run safe and secure containers. Containers have come a long way since the introduction of LXC in 2008, so use its developers' expertise to your advantage.
+
+While the LXC instructions on [linuxcontainers.org][5] make the process simple, this tour of the manual side of things should help you understand what's going on behind the scenes.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/11/behind-scenes-linux-containers
+
+作者:[Seth Kenlon][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/seth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/resources/what-docker
+[2]: https://opensource.com/sitewide-search?search_api_views_fulltext=openshift
+[3]: https://opensource.com/resources/what-is-kubernetes
+[4]: https://linuxcontainers.org
+[5]: https://linuxcontainers.org/lxc/getting-started
+[6]: https://github.com/lxc/lxc
diff --git a/sources/tech/20181113 An introduction to Udev- The Linux subsystem for managing device events.md b/sources/tech/20181113 An introduction to Udev- The Linux subsystem for managing device events.md
new file mode 100644
index 0000000000..c406c491b0
--- /dev/null
+++ b/sources/tech/20181113 An introduction to Udev- The Linux subsystem for managing device events.md
@@ -0,0 +1,228 @@
+An introduction to Udev: The Linux subsystem for managing device events
+======
+Create a script that triggers your computer to do a specific action when a specific device is plugged in.
+
+
+Udev is the Linux subsystem that supplies your computer with device events. In plain English, that means it's the code that detects when you have things plugged into your computer, like a network card, external hard drives (including USB thumb drives), mouses, keyboards, joysticks and gamepads, DVD-ROM drives, and so on. That makes it a potentially useful utility, and it's well-enough exposed that a standard user can manually script it to do things like performing certain tasks when a certain hard drive is plugged in.
+
+This article teaches you how to create a [udev][1] script triggered by some udev event, such as plugging in a specific thumb drive. Once you understand the process for working with udev, you can use it to do all manner of things, like loading a specific driver when a gamepad is attached, or performing an automatic backup when you attach your backup drive.
+
+### A basic script
+
+The best way to work with udev is in small chunks. Don't write the entire script upfront, but instead start with something that simply confirms that udev triggers some custom event.
+
+Depending on your goal for your script, you can't guarantee you will ever see the results of a script with your own eyes, so make sure your script logs that it was successfully triggered. The usual place for log files is in the **/var** directory, but that's mostly the root user's domain. For testing, use **/tmp** , which is accessible by normal users and usually gets cleaned out with a reboot.
+
+Open your favorite text editor and enter this simple script:
+
+```
+#!/usr/bin/bash
+
+echo $date > /tmp/udev.log
+```
+
+Place this in **/usr/local/bin** or some such place in the default executable path. Call it **trigger.sh** and, of course, make it executable with **chmod +x**.
+
+```
+$ sudo mv trigger.sh /usr/local/bin
+$ sudo chmod +x /usr/local/bin/trigger.sh
+```
+
+This script has nothing to do with udev. When it executes, the script places a timestamp in the file **/tmp/udev.log**. Test the script yourself:
+
+```
+$ /usr/local/bin/trigger.sh
+$ cat /tmp/udev.log
+Tue Oct 31 01:05:28 NZDT 2035
+```
+
+The next step is to make udev trigger the script.
+
+### Unique device identification
+
+In order for your script to be triggered by a device event, udev must know under what conditions it should call the script. In real life, you can identify a thumb drive by its color, the manufacturer, and the fact that you just plugged it into your computer. Your computer, however, needs a different set of criteria.
+
+Udev identifies devices by serial numbers, manufacturers, and even vendor ID and product ID numbers. Since this is early in your udev script's lifespan, be as broad, non-specific, and all-inclusive as possible. In other words, you want first to catch nearly any valid udev event to trigger your script.
+
+With the **udevadm monitor** command, you can tap into udev in real time and see what it sees when you plug in different devices. Become root and try it.
+
+```
+$ su
+# udevadm monitor
+```
+
+The monitor function prints received events for:
+
+ * UDEV: the event udev sends out after rule processing
+ * KERNEL: the kernel uevent
+
+
+
+With **udevadm monitor** running, plug in a thumb drive and watch as all kinds of information is spewed out onto your screen. Notice that the type of event is an **ADD** event. That's a good way to identify what type of event you want.
+
+The **udevadm monitor** command provides a lot of good info, but you can see it with prettier formatting with the command **udevadm info** , assuming you know where your thumb drive is currently located in your **/dev** tree. If not, unplug and plug your thumb drive back in, then immediately issue this command:
+
+```
+$ su -c 'dmesg | tail | fgrep -i sd*'
+```
+
+If that command returned **sdb: sdb1** , for instance, you know the kernel has assigned your thumb drive the **sdb** label.
+
+Alternately, you can use the **lsblk** command to see all drives attached to your system, including their sizes and partitions.
+
+Now that you have established where your drive is located in your filesystem, you can view udev information about that device with this command:
+
+```
+# udevadm info -a -n /dev/sdb | less
+```
+
+This returns a lot of information. Focus on the first block of info for now.
+
+Your job is to pick out parts of udev's report about a device that are most unique to that device, then tell udev to trigger your script when those unique attributes are detected.
+
+The **udevadm info** process reports on a device (specified by the device path), then "walks" up the chain of parent devices. For every device found, it prints all possible attributes using a key-value format. You can compose a rule to match according to the attributes of a device plus attributes from one single parent device.
+
+```
+looking at device '/devices/000:000/blah/blah//block/sdb':
+ KERNEL=="sdb"
+ SUBSYSTEM=="block"
+ DRIVER==""
+ ATTR{ro}=="0"
+ ATTR{size}=="125722368"
+ ATTR{stat}==" 2765 1537 5393"
+ ATTR{range}=="16"
+ ATTR{discard\_alignment}=="0"
+ ATTR{removable}=="1"
+ ATTR{blah}=="blah"
+```
+
+A udev rule must contain one attribute from one single parent device.
+
+Parent attributes are things that describe a device from the most basic level, such as it's something that has been plugged into a physical port or it is something with a size or this is a removable device.
+
+Since the KERNEL label of **sdb** can change depending upon how many other drives were plugged in before you plugged that thumb drive in, that's not the optimal parent attribute for a udev rule. However, it works for a proof of concept, so you could use it. An even better candidate is the SUBSYSTEM attribute, which identifies that this is a "block" system device (which is why the **lsblk** command lists the device).
+
+Open a file called **80-local.rules** in **/etc/udev/rules.d** and enter this code:
+
+```
+SUBSYSTEM=="block", ACTION=="add", RUN+="/usr/local/bin/trigger.sh"
+```
+
+Save the file, unplug your test thumb drive, and reboot.
+
+Wait, reboot on a Linux machine?
+
+Theoretically, you can just issue **udevadm control --reload** , which should load all rules, but at this stage in the game, it's best to eliminate all variables. Udev is complex enough, and you don't want to be lying in bed all night wondering if that rule didn't work because of a syntax error or if you just should have rebooted. So reboot regardless of what your POSIX pride tells you.
+
+When your system is back online, switch to a text console (with Ctl+Alt+F3 or similar) and plug in your thumb drive. If you are running a recent kernel, you will probably see a bunch of output in your console when you plug in the drive. If you see an error message such as Could not execute /usr/local/bin/trigger.sh, you probably forgot to make the script executable. Otherwise, hopefully all you see is a device was plugged in, it got some kind of kernel device assignment, and so on.
+
+Now, the moment of truth:
+
+```
+$ cat /tmp/udev.log
+Tue Oct 31 01:35:28 NZDT 2035
+```
+
+If you see a very recent date and time returned from **/tmp/udev.log** , udev has successfully triggered your script.
+
+### Refining the rule into something useful
+
+The problem with this rule is that it's very generic. Plugging in a mouse, a thumb drive, or someone else's thumb drive will indiscriminately trigger your script. Now is the time to start focusing on the exact thumb drive you want to trigger your script.
+
+One way to do this is with the vendor ID and product ID. To get these numbers, you can use the **lsusb** command.
+
+```
+$ lsusb
+Bus 001 Device 002: ID 8087:0024 Slacker Corp. Hub
+Bus 002 Device 002: ID 8087:0024 Slacker Corp. Hub
+Bus 003 Device 005: ID 03f0:3307 TyCoon Corp.
+Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 hub
+Bus 001 Device 003: ID 13d3:5165 SBo Networks
+```
+
+In this example, the **03f0:3307** before **TyCoon Corp.** denotes the idVendor and idProduct attributes. You can also see these numbers in the output of **udevadm info -a -n /dev/sdb | grep vendor** , but I find the output of **lsusb** a little easier on the eyes.
+
+You can now include these attributes in your rule.
+
+```
+SUBSYSTEM=="block", ATTRS{idVendor}=="03f0", ACTION=="add", RUN+="/usr/local/bin/thumb.sh"
+```
+
+Test this (yes, you should still reboot, just to make sure you're getting fresh reactions from udev), and it should work the same as before, only now if you plug in, say, a thumb drive manufactured by a different company (therefore with a different idVendor) or a mouse or a printer, the script won't be triggered.
+
+Keep adding new attributes to further focus in on that one unique thumb drive you want to trigger your script. Using **udevadm info -a -n /dev/sdb** , you can find out things like the vendor name, sometimes a serial number, or the product name, and so on.
+
+For your own sanity, be sure to add only one new attribute at a time. Most mistakes I have made (and have seen other people online make) is to throw a bunch of attributes into their udev rule and wonder why the thing no longer works. Testing attributes one by one is the safest way to ensure udev can identify your device successfully.
+
+### Security
+
+This brings up the security concerns of writing udev rules to automatically do something when a drive is plugged in. On my machines, I don't even have auto-mount turned on, and yet this article proposes scripts and rules that execute commands just by having something plugged in.
+
+Two things to bear in mind here.
+
+ 1. Focus your udev rules once you have them working so they trigger scripts only when you really want them to. Executing a script that blindly copies data to or from your computer is a bad idea in case anyone who happens to be carrying the same brand of thumb drive plugs it into your box.
+ 2. Do not write your udev rule and scripts and forget about them. I know which computers have my udev rules on them, and those boxes are most often my personal computers, not the ones I take around to conferences or have in my office at work. The more "social" a computer is, the less likely it is to get a udev rule on it that could potentially result in my data ending up on someone else's device or someone else's data or malware on my device.
+
+
+
+In other words, as with so much of the power provided by a GNU system, it is your job to be mindful of how you are wielding that power. If you abuse it or fail to treat it with respect, it very well could go horribly wrong.
+
+### Udev in the real world
+
+Now that you can confirm that your script is triggered by udev, you can turn your attention to the function of the script. Right now, it is useless, doing nothing more than logging the fact that it has been executed.
+
+I use udev to trigger [automated backups][2] of my thumb drives. The idea is that the master copies of my active documents are on my thumb drive (since it goes everywhere I go and could be worked on at any moment), and those master documents get backed up to my computer each time I plug the drive into that machine. In other words, my computer is the backup drive and my production data is mobile. The source code is available, so feel free to look at the code of attachup for further examples of constraining your udev tests.
+
+Since that's what I use udev for the most, it's the example I'll use here, but udev can grab lots of other things, like gamepads (this is useful on systems that aren't set to load the xboxdrv module when a gamepad is attached) and cameras and microphones (useful to set inputs when a specific mic is attached), so realize that it's good for a lot more than this one example.
+
+A simple version of my backup system is a two-command process:
+
+```
+SUBSYSTEM=="block", ATTRS{idVendor}=="03f0", ACTION=="add", SYMLINK+="safety%n"
+SUBSYSTEM=="block", ATTRS{idVendor}=="03f0", ACTION=="add", RUN+="/usr/local/bin/trigger.sh"
+```
+
+The first line detects my thumb drive with the attributes already discussed, then assigns the thumb drive a symlink within the device tree. The symlink it assigns is **safety%n**. The **%n** is a udev macro that resolves to whatever number the kernel gives to the device, such as sdb1, sdb2, sdb3, and so on. So **%n** would be the 1 or the 2 or the 3.
+
+This creates a symlink in the dev tree, so it does not interfere with the normal process of plugging in a device. This means that if you use a desktop environment that likes to auto-mount devices, you won't be causing problems for it.
+
+The second line runs the script.
+
+My backup script looks like this:
+
+```
+#!/usr/bin/bash
+
+mount /dev/safety1 /mnt/hd
+sleep 2
+rsync -az /mnt/hd/ /home/seth/backups/ && umount /dev/safety1
+```
+
+The script uses the symlink, which avoids the possibility of udev naming the drive something unexpected (for instance, if I have a thumb drive called DISK plugged into my computer already, and I plug in my other thumb drive also called DISK, the second one will be labeled DISK_, which would foil my script). It mounts **safety1** (the first partition of the drive) at my preferred mount point of **/mnt/hd**.
+
+Once safely mounted, it uses [rsync][3] to back up the drive to my backup folder (my actual script uses rdiff-backup, and yours can use whatever automated backup solution you prefer).
+
+### Udev is your dev
+
+Udev is a very flexible system and enables you to define rules and functions in ways that few other systems dare provide users. Learn it and use it, and enjoy the power of POSIX.
+
+This article builds on content from the [Slackermedia Handbook][4], which is licensed under the [GNU Free Documentation License 1.3][5].
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/11/udev
+
+作者:[Seth Kenlon][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/seth
+[b]: https://github.com/lujun9972
+[1]: https://linux.die.net/man/8/udev
+[2]: https://gitlab.com/slackermedia/attachup
+[3]: https://opensource.com/article/17/1/rsync-backup-linux
+[4]: http://slackermedia.info/handbook/doku.php?id=backup
+[5]: http://www.gnu.org/licenses/fdl-1.3.html
diff --git a/sources/tech/20181114 How to use systemd-nspawn for Linux system recovery.md b/sources/tech/20181114 How to use systemd-nspawn for Linux system recovery.md
new file mode 100644
index 0000000000..3355436cc3
--- /dev/null
+++ b/sources/tech/20181114 How to use systemd-nspawn for Linux system recovery.md
@@ -0,0 +1,148 @@
+How to use systemd-nspawn for Linux system recovery
+======
+Tap into systemd's ability to launch containers to repair a damaged system's root filesystem.
+
+
+For as long as GNU/Linux systems have existed, system administrators have needed to recover from root filesystem corruption, accidental configuration changes, or other situations that kept the system from booting into a "normal" state.
+
+Linux distributions typically offer one or more menu options at boot time (for example, in the GRUB menu) that can be used for rescuing a broken system; typically they boot the system into a single-user mode with most system services disabled. In the worst case, the user could modify the kernel command line in the bootloader to use the standard shell as the init (PID 1) process. This method is the most complex and fraught with complications, which can lead to frustration and lost time when a system needs rescuing.
+
+Most importantly, these methods all assume that the damaged system has a physical console of some sort, but this is no longer a given in the age of cloud computing. Without a physical console, there are few (if any) options to influence the boot process this way. Even physical machines may be small, embedded devices that don't offer an easy-to-use console, and finding the proper serial port cables and adapters and setting up a serial terminal emulator, all to use a serial console port while dealing with an emergency, is often complicated.
+
+When another system (of the same architecture and generally similar configuration) is available, a common technique to simplify the repair process is to extract the storage device(s) from the damaged system and connect them to the working system as secondary devices. With physical systems, this is usually straightforward, but most cloud computing platforms can also support this since they allow the root storage volume of the damaged instance to be mounted on another instance.
+
+Once the root filesystem is attached to another system, addressing filesystem corruption is straightforward using **fsck** and other tools. Addressing configuration mistakes, broken packages, or other issues can be more complex since they require mounting the filesystem and locating and changing the correct configuration files or databases.
+
+### Using systemd
+
+Before **[**systemd**][1]** , editing configuration files with a text editor was a practical way to correct a configuration. Locating the necessary files and understanding their contents may be a separate challenge, which is beyond the scope of this article.
+
+When the GNU/Linux system uses **systemd** though, many configuration changes are best made using the tools it provides—enabling and disabling services, for example, requires the creation or removal of symbolic links in various locations. The **systemctl** tool is used to make these changes, but using it requires a **systemd** instance to be running and listening (on D-Bus) for requests. When the root filesystem is mounted as an additional filesystem on another machine, the running **systemd** instance can't be used to make these changes.
+
+Manually launching the target system's **systemd** is not practical either, since it is designed to be the PID 1 process on a system and manage all other processes, which would conflict with the already-running instance on the system used for the repairs.
+
+Thankfully, **systemd** has the ability to launch containers, fully encapsulated GNU/Linux systems with their own PID 1 and environment that utilize various namespace features offered by the Linux kernel. Unlike tools like Docker and Rocket, **systemd** doen't require a container image to launch a container; it can launch one rooted at any point in the existing filesystem. This is done using the **systemd-nspawn** tool, which will create the necessary system namespaces and launch the initial process in the container, then provide a console in the container. In contrast to **chroot** , which only changes the apparent root of the filesystem, this type of container will have a separate filesystem namespace, suitable filesystems mounted on **/dev** , **/run** , and **/proc** , and a separate process namespace and IPC namespaces. Consult the **systemd-nspawn** [man page][2] to learn more about its capabilities.
+
+### An example to show how it works
+
+In this example, the storage device containing the damaged system's root filesystem has been attached to a running system, where it appears as **/dev/vdc**. The device name will vary based on the number of existing storage devices, the type of device, and the method used to connect it to the system. The root filesystem could use the entire storage device or be in a partition within the device; since the most common (simple) configuration places the root filesystem in the device's first partition, this example will use **/dev/vdc1.** Make sure to replace the device name in the commands below with your system's correct device name.
+
+The damaged root filesystem may also be more complex than a single filesystem on a device; it may be a volume in an LVM volume set or on a set of devices combined into a software RAID device. In these cases, the necessary steps to compose and activate the logical device holding the filesystem must be performed before it will be available for mounting. Again, those steps are beyond the scope of this article.
+
+#### Prerequisites
+
+First, ensure the **systemd-nspawn** tool is installed—most GNU/Linux distributions don't install it by default. It's provided by the **systemd-container** package on most distributions, so use your distribution's package manager to install that package. The instructions in this example were tested using Debian 9 but should work similarly on any modern GNU/Linux distribution.
+
+Using the commands below will almost certainly require root permissions, so you'll either need to log in as root, use **sudo** to obtain a shell with root permissions, or prefix each of the commands with **sudo**.
+
+#### Verify and mount the fileystem
+
+First, use **fsck** to verify the target filesystem's structures and content:
+
+```
+$ fsck /dev/vdc1
+```
+
+If it finds any problems with the filesystem, answer the questions appropriately to correct them. If the filesystem is sufficiently damaged, it may not be repairable, in which case you'll have to find other ways to extract its contents.
+
+Now, create a temporary directory and mount the target filesystem onto that directory:
+
+```
+$ mkdir /tmp/target-rescue
+$ mount /dev/vdc1 /tmp/target-rescue
+```
+
+With the filesystem mounted, launch a container with that filesystem as its root filesystem:
+
+```
+$ systemd-nspawn --directory /tmp/target-rescue --boot -- --unit rescue.target
+```
+
+The command-line arguments for launching the container are:
+
+ * **\--directory /tmp/target-rescue** provides the path of the container's root filesystem.
+ * **\--boot** searches for a suitable init program in the container's root filesystem and launches it, passing parameters from the command line to it. In this example, the target system also uses **systemd** as its PID 1 process, so the remaining parameters are intended for it. If the target system you are repairing uses any other tool as its PID 1 process, you'll need to adjust the parameters accordingly.
+ * **\--** separates parameters for **systemd-nspawn** from those intended for the container's PID 1 process.
+ * **\--unit rescue.target** tells **systemd** in the container the name of the target it should try to reach during the boot process. In order to simplify the rescue operations in the target system, boot it into "rescue" mode rather than into its normal multi-user mode.
+
+
+
+If all goes well, you should see output that looks similar to this:
+
+```
+Spawning container target-rescue on /tmp/target-rescue.
+Press ^] three times within 1s to kill container.
+systemd 232 running in system mode. (+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN)
+Detected virtualization systemd-nspawn.
+Detected architecture arm.
+
+Welcome to Debian GNU/Linux 9 (Stretch)!
+
+Set hostname to .
+Failed to install release agent, ignoring: No such file or directory
+[ OK ] Reached target Swap.
+[ OK ] Listening on Journal Socket (/dev/log).
+[ OK ] Started Dispatch Password Requests to Console Directory Watch.
+[ OK ] Reached target Encrypted Volumes.
+[ OK ] Created slice System Slice.
+ Mounting POSIX Message Queue File System...
+[ OK ] Listening on Journal Socket.
+ Starting Set the console keyboard layout...
+ Starting Restore / save the current clock...
+ Starting Journal Service...
+ Starting Remount Root and Kernel File Systems...
+[ OK ] Mounted POSIX Message Queue File System.
+[ OK ] Started Journal Service.
+[ OK ] Started Remount Root and Kernel File Systems.
+ Starting Flush Journal to Persistent Storage...
+[ OK ] Started Restore / save the current clock.
+[ OK ] Started Flush Journal to Persistent Storage.
+[ OK ] Started Set the console keyboard layout.
+[ OK ] Reached target Local File Systems (Pre).
+[ OK ] Reached target Local File Systems.
+ Starting Create Volatile Files and Directories...
+[ OK ] Started Create Volatile Files and Directories.
+[ OK ] Reached target System Time Synchronized.
+ Starting Update UTMP about System Boot/Shutdown...
+[ OK ] Started Update UTMP about System Boot/Shutdown.
+[ OK ] Reached target System Initialization.
+[ OK ] Started Rescue Shell.
+[ OK ] Reached target Rescue Mode.
+ Starting Update UTMP about System Runlevel Changes...
+[ OK ] Started Update UTMP about System Runlevel Changes.
+You are in rescue mode. After logging in, type "journalctl -xb" to view
+system logs, "systemctl reboot" to reboot, "systemctl default" or ^D to
+boot into default mode.
+Give root password for maintenance
+(or press Control-D to continue):
+```
+
+In this output, you can see **systemd** launching as the init process in the container and detecting that it is being run inside a container so it can adjust its behavior appropriately. Various unit files are started to bring the container to a usable state, then the target system's root password is requested. You can enter the root password here if you want a shell prompt with root permissions, or you can press **Ctrl+D** to allow the startup process to continue, which will display a normal console login prompt.
+
+When you have completed the necessary changes to the target system, press **Ctrl+]** three times in rapid succession; this will terminate the container and return you to your original shell. From there, you can clean up by unmounting the target system's filesystem and removing the temporary directory:
+
+```
+$ umount /tmp/target-rescue
+$ rmdir /tmp/target-rescue
+```
+
+That's it! You can now remove the target system's storage device(s) and return them to the target system.
+
+The idea to use **systemd-nspawn** this way, especially the **\--boot parameter** , came from [a question][3] posted on StackExchange. Thanks to Shibumi and kirbyfan64sos for providing useful answers to this question!
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/11/systemd-nspawn-system-recovery
+
+作者:[Kevin P.Fleming][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/kpfleming
+[b]: https://github.com/lujun9972
+[1]: https://www.freedesktop.org/wiki/Software/systemd/
+[2]: https://www.freedesktop.org/software/systemd/man/systemd-nspawn.html
+[3]: https://unix.stackexchange.com/questions/457819/running-systemd-utilities-like-systemctl-under-an-nspawn
diff --git a/sources/tech/20181115 11 Things To Do After Installing elementary OS 5 Juno.md b/sources/tech/20181115 11 Things To Do After Installing elementary OS 5 Juno.md
new file mode 100644
index 0000000000..5e23c6e5c4
--- /dev/null
+++ b/sources/tech/20181115 11 Things To Do After Installing elementary OS 5 Juno.md
@@ -0,0 +1,260 @@
+11 Things To Do After Installing elementary OS 5 Juno
+======
+I’ve been using [elementary OS 5 Juno][1] for over a month and it has been an amazing experience. It is easily the [best Mac OS inspired Linux distribution][2] and one of the [best Linux distribution for beginners][3].
+
+However, you will need to take care of a couple of things after installing it.
+In this article, we will discuss the most important things that you need to do after installing [elementary OS][4] 5 Juno.
+
+### Things to do after installing elementary OS 5 Juno
+
+![Things to do after installing elementary OS Juno][5]
+
+Things I mentioned in this list are from my personal experience and preference. Of course, you are not restricted to these few things. You can explore and tweak the system as much as you like. However, if you follow (some of) these recommendations, things might be smoother for you.
+
+#### 1.Run a System Update
+
+![terminal showing system updates in elementary os 5 Juno][6]
+
+Even when you download the latest version of a distribution – it is always recommended to check for the latest System updates. You might have a quick fix for an annoying bug, or, maybe there’s an important security patch that you shouldn’t ignore. So, no matter what – you should always ensure that you have everything up-to-date.
+
+To do that, you need to type in the following command in the terminal:
+
+```
+sudo apt-get update
+```
+
+#### 2\. Set Window Hotcorner
+
+![][7]
+
+You wouldn’t notice the minimize button for a window. So, how do you do it?
+
+Well, you can just bring up the dock and click the app icon again to minimize it or press **Windows key + H** as a shortcut to minimize the active window.
+
+But, I’ll recommend something way more easy and intuitive. Maybe you already knew it, but for the users who were unaware of the “ **hotcorners** ” feature, here’s what it does:
+
+Whenever you hover the cursor to any of the 4 corners of the window, you can set a preset action to happen when you do that. For example, when you move your cursor to the **left corner** of the screen you get the **multi-tasking view** to switch between apps – which acts like a “gesture“.
+
+In order to utilize the functionality, you can follow the steps below:
+
+ 1. Head to the System Settings.
+ 2. Click on the “ **Desktop** ” option (as shown in the image above).
+ 3. Next, select the “ **Hot Corner** ” section (as shown in the image below).
+ 4. Depending on what corner you prefer, choose an appropriate action (refer to the image below – that’s what I personally prefer as my settings)
+
+
+
+#### 3\. Install Multimedia codecs
+
+I’ve tried playing MP3/MP4 files – it just works fine. However, there are a lot of file formats when it comes to multimedia.
+
+So, just to be able to play almost every format of multimedia, you should install the codecs. Here’s what you need to enter in the terminal:
+
+To get certain proprietary codecs:
+
+```
+sudo apt install ubuntu-restricted-extras
+```
+
+To specifically install [Libav][8]:
+
+```
+sudo apt install libavcodec-extra
+```
+
+To install a codec in order to facilitate playing video DVDs:
+
+```
+sudo apt install libdvd-pkg
+```
+
+#### 4\. Install GDebi
+
+You don’t get to install .deb files by just double-clicking it on elementary OS 5 Juno. It just does not let you do that.
+
+So, you need an additional tool to help you install .deb files.
+
+We’ll recommend you to use **GDebi**. I prefer it because it lets you know about the dependencies even before trying to install it – that way – you can be sure about what you need in order to correctly install an application.
+
+Simply install GDebi and open any .deb files by performing a right-click on them **open in GDebi Package Installer.**
+
+To install it, type in the following command:
+
+```
+sudo apt install gdebi
+```
+
+#### 5\. Add a PPA for your Favorite App
+
+Yes, elementary OS 5 Juno now supports PPA (unlike its previous version). So, you no longer need to enable the support for PPAs explicitly.
+
+Just grab a PPA and add it via terminal to install something you like.
+
+#### 6\. Install Essential Applications
+
+If you’re a Linux power user, you already know what you want and where to get it, but if you’re new to this Linux distro and looking out for some applications to have installed, I have a few recommendations:
+
+**Steam app** : If you’re a gamer, this is a must-have app. You just need to type in a single command to install it:
+
+```
+sudo apt install steam
+```
+
+**GIMP** : It is the best photoshop alternative across every platform. Get it installed for every type of image manipulation:
+
+```
+sudo apt install gimp
+```
+
+**Wine** : If you want to install an application that only runs on Windows, you can try using Wine to run such Windows apps here on Linux. To install, follow the command:
+
+```
+sudo apt install wine-stable
+```
+
+**qBittorrent** : If you prefer downloading Torrent files, you should have this installed as your Torrent client. To install it, enter the following command:
+
+```
+sudo apt install qbittorrent
+```
+
+**Flameshot** : You can obviously utilize the default screenshot tool to take screenshots. But, if you want to instantly share your screenshots and the ability to annotate – install flameshot. Here’s how you can do that:
+
+```
+sudo apt install flameshot
+```
+
+**Chrome/Firefox: **The default browser isn’t much useful. So, you should install Chrome/Firefox – as per your choice.
+
+To install chrome, enter the command:
+
+```
+sudo apt install chromium-browser
+```
+
+To install Firefox, enter:
+
+```
+sudo apt install firefox
+```
+
+These are some of the most common applications you should definitely have installed. For the rest, you should browse through the App Center or the Flathub to install your favorite applications.
+
+#### 7\. Install Flatpak (Optional)
+
+It’s just my personal recommendation – I find flatpak to be the preferred way to install apps on any Linux distro I use.
+
+You can try it and learn more about it at its [official website][9].
+
+To install flatpak, type in:
+
+```
+sudo apt install flatpak
+```
+
+After you are done installing flatpak, you can directly head to [Flathub][10] to install some of your favorite apps and you will also find the command/instruction to install it via the terminal.
+
+In case you do not want to launch the browser, you can search for your app by typing in (example – finding Discord and installing it):
+
+```
+flatpak search discord flathub
+```
+
+After gettting the application ID, you can proceed installing it by typing in:
+
+```
+flatpak install flathub com.discordapp.Discord
+```
+
+#### 8\. Enable the Night Light
+
+![Night Light in elementary OS Juno][11]
+
+You might have installed Redshift as per our recommendation for [elemantary OS 0.4 Loki][12] to filter the blue light to avoid straining our eyes- but you do not need any 3rd party tool anymore.
+
+It comes baked in as the “ **Night Light** ” feature.
+
+You just head to System Settings and click on “ **Displays** ” (as shown in the image above).
+
+Select the **Night Light** section and activate it with your preferred settings.
+
+#### 9\. Install NVIDIA driver metapackage (for NVIDIA GPUs)
+
+![Nvidia drivers in elementary OS juno][13]
+
+The NVIDIA driver metapackage should be listed right at the App Center – so you can easily the NVIDIA driver.
+
+However, it’s not the latest driver version – I have version **390.77** installed and it’s performing just fine.
+
+If you want the latest version for Linux, you should check out NVIDIA’s [official download page][14].
+
+Also, if you’re curious about the version installed, just type in the following command:
+
+```
+nvidia-smi
+```
+
+#### 10\. Install TLP for Advanced Power Management
+
+We’ve said it before. And, we’ll still recommend it.
+
+If you want to manage your background tasks/activity and prevent overheating of your system – you should install TLP.
+
+It does not offer a GUI, but you don’t have to bother. You just install it and let it manage whatever it takes to prevent overheating.
+
+It’s very helpful for laptop users.
+
+To install, type in:
+
+```
+supo apt install tlp tlp-rdw
+```
+
+#### 11\. Perform visual customizations
+
+![][15]
+
+If you need to change the look of your Linux distro, you can install GNOME tweaks tool to get the options. In order to install the tweak tool, type in:
+
+```
+sudo apt install gnome-tweaks
+```
+
+Once you install it, head to the application launcher and search for “Tweaks”, you’ll find something like this:
+
+Here, you can select the icon, theme, wallpaper, and you’ll also be able to tweak a couple more options that’s not limited to the visual elements.
+
+### Wrapping Up
+
+It’s the least you should do after installing elementary OS 5 Juno. However, considering that elementary OS 5 Juno comes with numerous new features – you can explore a lot more new things as well.
+
+Let us know what you did first after installing elementary OS 5 Juno and how’s your experience with it so far?
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/things-to-do-after-installing-elementary-os-5-juno/
+
+作者:[Ankush Das][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/ankush/
+[b]: https://github.com/lujun9972
+[1]: https://itsfoss.com/elementary-os-juno-features/
+[2]: https://itsfoss.com/macos-like-linux-distros/
+[3]: https://itsfoss.com/best-linux-beginners/
+[4]: https://elementary.io/
+[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2018/11/things-to-do-after-installing-elementary-os-juno.jpeg?ssl=1
+[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/11/elementary-os-system-update.jpg?ssl=1
+[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/11/elementary-os-hotcorners.jpg?ssl=1
+[8]: https://libav.org/
+[9]: https://flatpak.org/
+[10]: https://flathub.org/home
+[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2018/11/elementary-os-night-light.jpg?ssl=1
+[12]: https://itsfoss.com/things-to-do-after-installing-elementary-os-loki/
+[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2018/11/elementary-os-nvidia-metapackage.jpg?ssl=1
+[14]: https://www.nvidia.com/Download/index.aspx
+[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2018/11/elementary-os-gnome-tweaks.jpg?ssl=1
diff --git a/sources/tech/20181115 3 best practices for continuous integration and deployment.md b/sources/tech/20181115 3 best practices for continuous integration and deployment.md
new file mode 100644
index 0000000000..09e10f187b
--- /dev/null
+++ b/sources/tech/20181115 3 best practices for continuous integration and deployment.md
@@ -0,0 +1,138 @@
+[Translating by ChiZelin]
+3 best practices for continuous integration and deployment
+======
+Learn about automating, using a Git repository, and parameterizing Jenkins pipelines.
+
+
+The article covers three key topics: automating CI/CD configuration, using a Git repository for common CI/CD artifacts, and parameterizing Jenkins pipelines.
+
+### Terminology
+
+First things first; let's define a few terms. **CI/CD** is a practice that allows teams to quickly and automatically test, package, and deploy their applications. It is often achieved by leveraging a server called **[Jenkins][1]** , which serves as the CI/CD orchestrator. Jenkins listens to specific inputs (often a Git hook following a code check-in) and, when triggered, kicks off a pipeline.
+
+A **pipeline** consists of code written by development and/or operations teams that instructs Jenkins which actions to take during the CI/CD process. This pipeline is often something like "build my code, then test my code, and if those tests pass, deploy my application to the next highest environment (usually a development, test, or production environment)." Organizations often have more complex pipelines, incorporating tools such as artifact repositories and code analyzers, but this provides a high-level example.
+
+Now that we understand the key terminology, let's dive into some best practices.
+
+### 1\. Automation is key
+
+To run CI/CD on a PaaS, you need the proper infrastructure to be configured on the cluster. In this example, I will use [OpenShift][2].
+
+"Hello, World" implementations of this are quite simple to achieve. Simply run **oc new-app jenkins- ** and voilà, you have a running Jenkins server ready to go. Uses in the enterprise, however, are much more complex. In addition to the Jenkins server, admins will often need to deploy a code analysis tool such as SonarQube and an artifact repository such as Nexus. They will then have to create pipelines to perform CI/CD and Jenkins slaves to reduce the load on the master. Most of these entities are backed by OpenShift resources that need to be created to deploy the desired CI/CD infrastructure.
+
+Eventually, the manual steps required to deploy your CI/CD components may need to be replicated, and you might not be the person to perform those steps. To ensure the outcome is produced quickly, error-free, and exactly as it was before, an automation method should be incorporated in the way your infrastructure is created. This can be an Ansible playbook, a Bash script, or any other way you would like to automate the deployment of CI/CD infrastructure. I have used [Ansible][3] and the [OpenShift-Applier][4] role to automate my implementations. You may find these tools valuable, or you may find something else that works better for you and your organization. Either way, you'll find that automation significantly reduces the workload required to recreate CI/CD components.
+
+#### Configuring the Jenkins master
+
+Outside of general "automation," I'd like to single out the Jenkins master and talk about a few ways admins can take advantage of OpenShift to automate Jenkins configuration. The Jenkins image from the [Red Hat Container Catalog][5] comes packaged with the [OpenShift-Sync plugin][6] installed. In the [video][7], we discuss how this plugin can be used to create Jenkins pipelines and slaves.
+
+To create a Jenkins pipeline, create an OpenShift BuildConfig similar to this:
+
+```
+apiVersion: v1
+kind: BuildConfig
+...
+spec:
+ source:
+ git:
+ ref: master
+ uri:
+ ...
+ strategy:
+ jenkinsPipelineStrategy:
+ jenkinsfilePath: Jenkinsfile
+ type: JenkinsPipeline
+```
+
+The OpenShift-Sync plugin will notice that a BuildConfig with the strategy **jenkinsPipelineStrategy** has been created and will convert it into a Jenkins pipeline, pulling from the Jenkinsfile specified by the Git source. An inline Jenkinsfile can also be used instead of pulling from one from a Git repository. See the [documentation][8] for more information.
+
+To create a Jenkins slave, create an OpenShift ImageStream that starts with the following definition:
+
+```
+apiVersion: v1
+kind: ImageStream
+metadata:
+ annotations:
+ slave-label: jenkins-slave
+ labels:
+ role: jenkins-slave
+…
+```
+
+Notice the metadata defined in this ImageStream. The OpenShift-Sync plugin will convert any ImageStream with the label **role: jenkins-slave** into a Jenkins slave. The Jenkins slave will be named after the value from the **slave-label** annotation.
+
+ImageStreams work just fine for simple Jenkins slave configurations, but some teams will find it necessary to configure nitty-gritty details such as resource limits, readiness and liveness probes, and instance caps. This is where ConfigMaps come into play:
+
+```
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ labels:
+ role: jenkins-slave
+...
+data:
+ template1: |-
+
+```
+
+Notice that the **role: jenkins-slave** label is still required to convert the ConfigMap into a Jenkins slave. The **Kubernetes pod template** consists of a lengthy bit of XML that will configure every detail to your organization's liking. To view this XML, as well as more information on converting ImageStreams and ConfigMaps into Jenkins slaves, see the [documentation][9].
+
+Notice with the three examples shown above that none of the operations required an administrator to make manual changes to the Jenkins console. By using OpenShift resources, Jenkins can be configured in a way that is easily automated.
+
+### 2\. Sharing is caring
+
+The second best practice is maintaining a Git repository of common CI/CD artifacts. The main idea is to prevent teams from reinventing the wheel. Imagine your team needs to perform a blue/green deployment to an OpenShift environment as part of the pipeline's CD phase. The members of your team responsible for writing the pipeline may not be OpenShift experts, nor may they have the bandwidth to write this functionality from scratch. Luckily, somebody has already written a function that incorporates that functionality in a common CI/CD repository, so your team can use that function instead of spending time writing one.
+
+To take this a step further, your organization may decide to maintain entire pipelines. You may find that teams are writing pipelines with similar functionality. It would be more efficient for those teams to use a parameterized pipeline from a common repository as opposed to writing their own from scratch.
+
+### 3\. Less is more
+
+As I hinted in the previous section, the third and final best practice is to parameterize your CI/CD pipelines. Parameterization will prevent an over-abundance of pipelines, making your CI/CD system easier to maintain. Imagine I have multiple regions where I can deploy my application. Without parameterization, I would need a separate pipeline for each region.
+
+To parameterize a pipeline written as an OpenShift build config, add the **env** stanza to the configuration:
+
+```
+...
+spec:
+ ...
+ strategy:
+ jenkinsPipelineStrategy:
+ env:
+ - name: REGION
+ value: US-West
+ jenkinsfilePath: Jenkinsfile
+ type: JenkinsPipeline
+```
+
+With this configuration, I can pass the **REGION** parameter the pipeline to deploy my application to the specified region.
+
+The [video][7] provides a more substantial case where parameterization is a must. Some organizations decide to split up their CI/CD pipelines into separate CI and CD pipelines, usually, because there is some sort of approval process that happens before deployment. Imagine I have four images and three different environments to deploy to. Without parameterization, I would need 12 CD pipelines to allow all deployment possibilities. This can get out of hand very quickly. To make maintenance of the CD pipeline easier, organizations would find it better to parameterize the image and environment to allow one pipeline to perform the work of many.
+
+### Summary
+
+CI/CD at the enterprise level tends to become more complex than many organizations anticipate. Luckily, with Jenkins, there are many ways to seamlessly provide automation of your setup. Maintaining a Git repository of common CI/CD artifacts will also ease the effort, as teams can pull from maintained dependencies instead of writing their own from scratch. Finally, parameterization of your CI/CD pipelines will reduce the number of pipelines that will have to be maintained.
+
+If you've found other practices you can't do without, please share them in the comments.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/11/best-practices-cicd
+
+作者:[Austin Dewey][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/adewey
+[b]: https://github.com/lujun9972
+[1]: https://jenkins.io/
+[2]: https://www.openshift.com/
+[3]: https://docs.ansible.com/
+[4]: https://github.com/redhat-cop/openshift-applier
+[5]: https://access.redhat.com/containers/?tab=overview#/registry.access.redhat.com/openshift3/jenkins-2-rhel7
+[6]: https://github.com/openshift/jenkins-sync-plugin
+[7]: https://www.youtube.com/watch?v=zlL7AFWqzfw
+[8]: https://docs.openshift.com/container-platform/3.11/dev_guide/dev_tutorials/openshift_pipeline.html#the-pipeline-build-config
+[9]: https://docs.openshift.com/container-platform/3.11/using_images/other_images/jenkins.html#configuring-the-jenkins-kubernetes-plug-in
diff --git a/sources/tech/20181119 7 command-line tools for writers - Opensource.com.md b/sources/tech/20181119 7 command-line tools for writers - Opensource.com.md
new file mode 100644
index 0000000000..a222389079
--- /dev/null
+++ b/sources/tech/20181119 7 command-line tools for writers - Opensource.com.md
@@ -0,0 +1,75 @@
+Translating by LazyWolfLin
+
+7 command-line tools for writers | Opensource.com
+======
+Put away your word processor and start writing from the command line using these open source tools.
+
+
+For most people (especially non-techies), the act of writing means tapping out words using LibreOffice Writer or another GUI word processing application. But there are many other options available to help anyone communicate their message in writing, especially for the growing number of writers [embracing plaintext][1].
+
+There's also room in a GUI writer's world for command line tools that can help them write, check their writing, and more—regardless of whether they're banging out an article, blog post, or story; writing a README; or prepping technical documentation.
+
+Here's a look at some command-line tools that any writer will find useful.
+
+### Editors
+
+Yes, you _can_ do actual writing at the command line. I know writers who do their work using editors like [Nano][2], [Vim][3], [Emacs][4], and [Jove][5] in a terminal window. And those editors [aren't the only games in town][6]. Text editors are great because they (at a basic level, anyway) are easy to use and distraction free. They're perfect for tapping out a first draft of anything or even completing a long and complicated writing project.
+
+If you want a more word processor-like experience at the command line, take a look at [WordGrinder][7] . WordGrinder is a bare-bones word processor, but it has more than enough features for writing and publishing your work. It supports basic formatting and styles, and you can export your writing to formats like Markdown, ODT, LaTeX, and HTML.
+
+### Spell checkers
+
+Every writer does (or at least should do) a spelling check on their work at least once. Why? An immutable law of the writing universe states that, no matter how many times you look over your manuscript, a spelling mistake or typo will creep in.
+
+My favorite command-line spelling checker is [GNU Aspell][8], which I previously [looked at][9] in detail. Aspell checks plaintext documents interactively and not only highlights errors but often puts the best correction at the top of its list of suggestions. Aspell also ignores many markup languages while doing its thing.
+
+A much older but still useful alternative is [Ispell][10]. It's a bit slower than Aspell, but both utilities work the same way. As you interact with your text file, Ispell suggests corrections. Ispell also has good support for foreign languages.
+
+### Prose linters
+
+Software developers use [linters][11] to check their code for errors or bugs. There are also linters for prose that check for style and syntax errors; think of them as the _Elements of Style_ for the command line. While any writer can (and probably should) use one, a prose linter is especially useful for team documentation projects that require a consistent voice and style.
+
+[Proselint][12] is a comprehensive tool for checking what you're writing. It looks for jargon, hyperbole, incorrect date and time format, misused terms, and [much more][13]. It's also easy to run and ignores markup in a plaintext file.
+
+[Alex][14] is a simple yet powerful prose linter. Run it against a plaintext document or one formatted with Markdown or HTML. Alex pumps out warnings of "gender favouring, polarising, race related, religion inconsiderate, or other unequal phrasing in text." If you want to give Alex a test drive, there's an [online demo][15].
+
+### Other tools
+
+Sometimes you just can't find the right synonym for a word. But you don't need to grab a "dead tree" thesaurus or go to a dedicated website to perfect your word choice. Just run [Aiksaurus][16] against the word you want to replace, and it does the work for you. This utility's main drawback, though, is that it supports English only.
+
+Even writers with few (if any) technical skills are embracing [Markdown][17] to quickly and easily format their work. Sometimes, though, you need to convert files formatted with Markdown to something else. That's where [Pandoc][18] comes in. You can use it to convert your documents to HTML, Word, LibreOffice Writer, LaTeX, EPUB, and other formats. You can even use Pandoc to produce books and [research papers][19].
+
+Do you have a favorite command-line tool for writing? Share it with the Opensource.com community by leaving a comment.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/11/command-line-tools-writers
+
+作者:[Scott Nesbitt][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/scottnesbitt
+[b]: https://github.com/lujun9972
+[1]: https://plaintextproject.online
+[2]: https://www.nano-editor.org/
+[3]: https://www.vim.org
+[4]: https://www.gnu.org/software/emacs/
+[5]: https://opensource.com/article/17/1/jove-lightweight-alternative-vim
+[6]: https://en.wikipedia.org/wiki/List_of_text_editors#Text_user_interface
+[7]: https://cowlark.com/wordgrinder/
+[8]: http://aspell.net/
+[9]: https://opensource.com/article/18/2/how-check-spelling-linux-command-line-aspell
+[10]: https://www.cs.hmc.edu/~geoff/ispell.html
+[11]: https://en.wikipedia.org/wiki/Lint_(software)
+[12]: http://proselint.com/
+[13]: http://proselint.com/checks/
+[14]: https://github.com/get-alex/alex
+[15]: https://alexjs.com/#demo
+[16]: http://aiksaurus.sourceforge.net/
+[17]: https://en.wikipedia.org/wiki/Markdown
+[18]: https://pandoc.org
+[19]: https://opensource.com/article/18/9/pandoc-research-paper
diff --git a/sources/tech/20181119 Arch-Wiki-Man - A Tool to Browse The Arch Wiki Pages As Linux Man Page from Offline.md b/sources/tech/20181119 Arch-Wiki-Man - A Tool to Browse The Arch Wiki Pages As Linux Man Page from Offline.md
new file mode 100644
index 0000000000..9e1ee18be7
--- /dev/null
+++ b/sources/tech/20181119 Arch-Wiki-Man - A Tool to Browse The Arch Wiki Pages As Linux Man Page from Offline.md
@@ -0,0 +1,214 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: subject: (Arch-Wiki-Man – A Tool to Browse The Arch Wiki Pages As Linux Man Page from Offline)
+[#]: via: (https://www.2daygeek.com/arch-wiki-man-a-tool-to-browse-the-arch-wiki-pages-as-linux-man-page-from-offline/)
+[#]: author: ([Prakash Subramanian](https://www.2daygeek.com/author/prakash/))
+[#]: url: ( )
+
+Arch-Wiki-Man – A Tool to Browse The Arch Wiki Pages As Linux Man Page from Offline
+======
+
+Getting internet is not a big deal now a days, however there will be a limitation on technology.
+
+I was really surprise to see the technology growth but in the same time there will be fall in everywhere.
+
+Whenever you search anything about other Linux distributions most of the time you will get a third party links in the first place but for Arch Linux every time you would get the Arch Wiki page for your results.
+
+As Arch Wiki has most of the solution other than third party websites.
+
+As of now, you might used web browser to get a solution for your Arch Linux system but you no need to do the same for now.
+
+There is a solution is available in command line to perform this action much faster way and the utility called arch-wiki-man. If you are Arch Linux lover, i would suggest you to read **[Arch Linux Post Installation guide][1]** which helps you to tweak your system for day to day use.
+
+### What is arch-wiki-man?
+
+[arch-wiki-man][2] tool allows user to search the arch wiki pages right from the command line (CLI) instantly without internet connection. It allows user to access and search an entire wiki pages as a Linux man page.
+
+Also, you no need to switch to GUI. Updates are pushed automatically every two days so, your local copy of the Arch Wiki pages will be upto date. The tool name is `awman`. awman stands for Arch Wiki Man.
+
+We had already wrote similar kind of topic called **[Arch Wiki Command Line Utility][3]** (arch-wiki-cli) which allows user search Arch Wiki from command line but make sure you should have internet to use this utility.
+
+### How to Install arch-wiki-man tool?
+
+arch-wiki-man utility is available in AUR repository so, we need to use AUR helper to install it. There are many AUR helper is available and we had wrote an article about **[Yaourt AUR helper][4]** and **[Packer AUR helper][5]** which are very famous AUR helper.
+
+```
+$ yaourt -S arch-wiki-man
+
+or
+
+$ packer -S arch-wiki-man
+```
+
+Alternatively we can install it using npm package manager. Make sure, you should have installed **[NodeJS][6]** on your system. If so, run the following command to install it.
+
+```
+$ npm install -g arch-wiki-man
+```
+
+### How to Update the local Arch Wiki copy?
+
+As updated previously, updates are pushed automatically every two days and it can be done by running the following command.
+
+```
+$ sudo awman-update
+[sudo] password for daygeek:
+[email protected] /usr/lib/node_modules/arch-wiki-man
+└── [email protected]
+
+arch-wiki-md-repo has been successfully updated or reinstalled.
+```
+
+awman-update is faster and more convenient method to get the update. However, you can get the updates by reinstalling this package using the following command.
+
+```
+$ yaourt -S arch-wiki-man
+
+or
+
+$ packer -S arch-wiki-man
+```
+
+### How to Use Arch Wiki from command line?
+
+It’s very simple interface and easy to use. To search anything, just run `awman` followed by the search term. The general syntax is as follow.
+
+```
+$ awman Search-Term
+```
+
+### How to Search Multiple Matches?
+
+If you would like to list all the results titles comes with `installation` string, run the following command format. If the output comes with multiple results then you will get a selection menu to navigate each item.
+
+```
+$ awman installation
+```
+
+![][8]
+
+Detailed page screenshot.
+![][9]
+
+### Search a given string in Titles & Descriptions
+
+The `-d` or `--desc-search` option allow users to search a given string in titles and descriptions.
+
+```
+$ awman -d mirrors
+
+or
+
+$ awman --desc-search mirrors
+? Select an article: (Use arrow keys)
+❯ [1/3] Mirrors: Related articles
+ [2/3] DeveloperWiki-NewMirrors: Contents
+ [3/3] Powerpill: Powerpill is a pac
+```
+
+### Search a given string in Contents
+
+The `-k` or `--apropos` option allow users to search a given string in content as well. Make a note, this option significantly slower your search as this scan entire wiki page content.
+
+```
+$ awman -k openjdk
+
+or
+
+$ awman --apropos openjdk
+? Select an article: (Use arrow keys)
+❯ [1/26] Hadoop: Related articles
+ [2/26] XDG Base Directory support: Related articles
+ [3/26] Steam-Game-specific troubleshooting: See Steam/Troubleshooting first.
+ [4/26] Android: Related articles
+ [5/26] Elasticsearch: Elasticsearch is a search engine based on Lucene. It provides a distributed, mul..
+ [6/26] LibreOffice: Related articles
+ [7/26] Browser plugins: Related articles
+(Move up and down to reveal more choices)
+```
+
+### Open the search results in a web browser
+
+The `-w` or `--web` option allow users to open the search results in a web browser.
+
+```
+$ awman -w AUR helper
+
+or
+
+$ awman --web AUR helper
+```
+
+![][10]
+
+### Search in other languages
+
+The `-w` or `--web` option allow users to open the search results in a web browser. To see a list of supported language, run the following command.
+
+```
+$ awman --list-languages
+arabic
+bulgarian
+catalan
+chinesesim
+chinesetrad
+croatian
+czech
+danish
+dutch
+english
+esperanto
+finnish
+greek
+hebrew
+hungarian
+indonesian
+italian
+korean
+lithuanian
+norwegian
+polish
+portuguese
+russian
+serbian
+slovak
+spanish
+swedish
+thai
+ukrainian
+```
+
+Run the awman command with your preferred language to see the results with different language other than English.
+
+```
+$ awman -l chinesesim deepin
+```
+
+![][11]
+
+--------------------------------------------------------------------------------
+
+via: https://www.2daygeek.com/arch-wiki-man-a-tool-to-browse-the-arch-wiki-pages-as-linux-man-page-from-offline/
+
+作者:[Prakash Subramanian][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.2daygeek.com/author/prakash/
+[b]: https://github.com/lujun9972
+[1]: https://www.2daygeek.com/arch-linux-post-installation-30-things-to-do-after-installing-arch-linux/
+[2]: https://github.com/greg-js/arch-wiki-man
+[3]: https://www.2daygeek.com/search-arch-wiki-website-command-line-terminal/
+[4]: https://www.2daygeek.com/install-yaourt-aur-helper-on-arch-linux/
+[5]: https://www.2daygeek.com/install-packer-aur-helper-on-arch-linux/
+[6]: https://www.2daygeek.com/install-nodejs-on-ubuntu-centos-debian-fedora-mint-rhel-opensuse/
+[7]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
+[8]: https://www.2daygeek.com/wp-content/uploads/2018/11/arch-wiki-man-%E2%80%93-A-Tool-to-Browse-The-Arch-Wiki-Pages-As-Linux-Man-page-from-Offline-1.png
+[9]: https://www.2daygeek.com/wp-content/uploads/2018/11/arch-wiki-man-%E2%80%93-A-Tool-to-Browse-The-Arch-Wiki-Pages-As-Linux-Man-page-from-Offline-2.png
+[10]: https://www.2daygeek.com/wp-content/uploads/2018/11/arch-wiki-man-%E2%80%93-A-Tool-to-Browse-The-Arch-Wiki-Pages-As-Linux-Man-page-from-Offline-3.png
+[11]: https://www.2daygeek.com/wp-content/uploads/2018/11/arch-wiki-man-%E2%80%93-A-Tool-to-Browse-The-Arch-Wiki-Pages-As-Linux-Man-page-from-Offline-4.png
diff --git a/sources/tech/20181121 Coupled commands with control operators in Bash.md b/sources/tech/20181121 Coupled commands with control operators in Bash.md
new file mode 100644
index 0000000000..b599dc64af
--- /dev/null
+++ b/sources/tech/20181121 Coupled commands with control operators in Bash.md
@@ -0,0 +1,129 @@
+Translating by Jamskr
+
+Coupled commands with control operators in Bash
+======
+Add logic to the command line with control operators in compound commands.
+
+
+
+Simple compound commands—such as stringing several commands together in a sequence on the command line—are used often. Such commands are separated by semicolons, which define the end of a command. To create a simple series of shell commands on a single line, simply separate each command using a semicolon, like this:
+
+```
+command1 ; command2 ; command3 ; command4 ;
+```
+
+You don't need to add a final semicolon because pressing the Enter key implies the end of the final command, but it's fine to add it for consistency.
+
+**& &** and **||** control operators built into Bash. These two control operators provide some flow control and enable us to alter the code-execution sequence. The semicolon and the **newline** character are also considered to be Bash control operators.
+
+All the commands will run without a problem—as long as no error occurs. But what happens if an error happens? We can anticipate and allow for errors using theandcontrol operators built into Bash. These two control operators provide some flow control and enable us to alter the code-execution sequence. The semicolon and thecharacter are also considered to be Bash control operators.
+
+The **& &** operator simply says "if command1 is successful, then run command2." If command1 fails for any reason, command2 won't run. That syntax looks like:
+
+```
+command1 && command2
+```
+
+This works because every command returns a code to the shell that indicates whether it completed successfully or failed during execution. By convention, a return code (RC) of 0 (zero) indicates success and any positive number indicates some type of failure. Some sysadmin tools just return a 1 to indicate any failure, but many use other positive numerical codes to indicate the type of failure.
+
+The Bash shell's **$?** variable can be checked very easily by a script, by the next command in a list of commands, or even directly by a sysadmin. Let's look at RCs. We can run a simple command and immediately check the RC, which will always pertain to the last command that ran.
+
+```
+[student@studentvm1 ~]$ ll ; echo "RC = $?"
+total 284
+-rw-rw-r-- 1 student student 130 Sep 15 16:21 ascii-program.sh
+drwxrwxr-x 2 student student 4096 Nov 10 11:09 bin
+
+drwxr-xr-x. 2 student student 4096 Aug 18 10:21 Videos
+RC = 0
+[student@studentvm1 ~]$
+```
+
+This RC is 0, which means the command completed successfully. Now try the same command on a directory where we don't have permissions.
+
+```
+[student@studentvm1 ~]$ ll /root ; echo "RC = $?"
+ls: cannot open directory '/root': Permission denied
+RC = 2
+[student@studentvm1 ~]$
+```
+
+This RC's meaning can be found in the [**ls** command's man page][1].
+
+Let's try the **& &** control operator as it might be used in a command-line program. We'll start with something simple: Create a new directory and, if that is successful, create a new file in it.
+
+We need a directory where we can create other directories. First, create a temporary directory in your home directory where you can do some testing.
+
+```
+[student@studentvm1 ~]$ cd ; mkdir testdir
+```
+
+Create a new directory in **~/testdir** , which should be empty because you just created it, and then create a new, empty file in that new directory. The following command will do those tasks.
+
+```
+[student@studentvm1 ~]$ mkdir ~/testdir/testdir2 && touch ~/testdir/testdir2/testfile1
+[student@studentvm1 ~]$ ll ~/testdir/testdir2/
+total 0
+-rw-rw-r-- 1 student student 0 Nov 12 14:13 testfile1
+[student@studentvm1 ~]$
+```
+
+We know everything worked as it should because the **testdir** directory is accessible and writable. Change the permissions on **testdir** so it is no longer accessible to the user **student** as follows:
+
+```
+[student@studentvm1 ~]$ chmod 076 testdir ; ll | grep testdir
+d---rwxrw-. 3 student student 4096 Nov 12 14:13 testdir
+[student@studentvm1 ~]$
+```
+
+Using the **grep** command after the long list ( **ll** ) shows the listing for **testdir**. You can see that the user **student** no longer has access to the **testdir** directory. Now let's run almost the same command as before but change it to create a different directory name inside **testdir**.
+
+```
+[student@studentvm1 ~]$ mkdir ~/testdir/testdir3 && touch ~/testdir/testdir3/testfile1
+mkdir: cannot create directory ‘/home/student/testdir/testdir3’: Permission denied
+[student@studentvm1 ~]$
+```
+
+Although we received an error message, using the **& &** control operator prevents the **touch** command from running because there was an error in creating **testdir3**. This type of command-line logical flow control can prevent errors from compounding and making a real mess of things. But let's make it a little more complicated.
+
+The **||** control operator allows us to add another command that executes when the initial program statement returns a code larger than zero.
+
+```
+[student@studentvm1 ~]$ mkdir ~/testdir/testdir3 && touch ~/testdir/testdir3/testfile1 || echo "An error occurred while creating the directory."
+mkdir: cannot create directory ‘/home/student/testdir/testdir3’: Permission denied
+An error occurred while creating the directory.
+[student@studentvm1 ~]$
+```
+
+Our compound command syntax using flow control takes this general form when we use the **& &** and **||** control operators:
+
+```
+preceding commands ; command1 && command2 || command3 ; following commands
+```
+
+The compound command using the control operators may be preceded and followed by other commands that can be related to the ones in the flow-control section but which are unaffected by the flow control. All of those commands will execute without regard to anything that takes place inside the flow-control compound command.
+
+These flow-control operators can make working at the command line more efficient by handling decisions and letting us know when a problem has occurred. I use them directly on the command line as well as in scripts.
+
+You can clean up as the root user to delete the directory and its contents.
+
+```
+[root@studentvm1 ~]# rm -rf /home/student/testdir
+```
+
+How do you use Bash control operators? Let us know in the comment section.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/11/control-operators-bash-shell
+
+作者:[David Both][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/dboth
+[b]: https://github.com/lujun9972
+[1]: http://man7.org/linux/man-pages/man1/ls.1.html
diff --git a/sources/tech/20181121 How to swap Ctrl and Caps Lock keys in Linux.md b/sources/tech/20181121 How to swap Ctrl and Caps Lock keys in Linux.md
new file mode 100644
index 0000000000..c9f24938ff
--- /dev/null
+++ b/sources/tech/20181121 How to swap Ctrl and Caps Lock keys in Linux.md
@@ -0,0 +1,113 @@
+Translating by jlztan
+
+How to swap Ctrl and Caps Lock keys in Linux
+======
+Linux desktop environments make it easy to set up your keyboard as you want it. Here's how.
+
+
+For many people who've been computer users for (let's just say) "quite some time now," the Ctrl and Caps Lock keys have been in the wrong place since shortly after the first PC keyboards rolled off the production line. For me, the correct positioning appears in this image of a vintage 1995 Sun Workstation keyboard. (Forgive me for the blurriness of the image; it was taken with a Minox spy camera in low light.)
+
+If you're interested, you can read about the [history of the Ctrl key location][1]. I'm not going to discuss the various rationales for placing the Ctrl key next to the "a" key versus below the Shift key; I'm not going to comment on the overall uselessness of the Caps Lock key (whoops); and I'm not going to argue with those who advocate using the heel of the hand to activate the Ctrl key, even though it's impossible to do on some laptop keyboards where the keys are inset below the level of the wrist rest (whoops).
+
+Rather, I'm going to assume I'm not the only one who prefers the Ctrl key next to the "a" and describe how to use the wonderful flexibility that comes with Linux to swap the Ctrl and Caps Lock keys on various desktop environments. Note that this kind of advice seems to have a limited shelf life, as tools for tweaking desktop settings change fairly often. But I hope this offers a good place for you to start.
+
+### With GNOME 3
+
+[GNOME 3][2] desktop environment users can use the [Tweaks][3] tool to swap their Caps Lock and Ctrl keys, as you can see below.
+
+Here's how to do it:
+
+ 1. Install the Tweaks tool from your distribution's repositories.
+ 2. Start the Tweaks application.
+ 3. Select "Keyboard & Mouse" from the left-hand menu.
+ 4. Click "Additional Layout Options".
+ 5. Click "Ctrl position" on the window that opens and choose "Swap Ctrl and Caps Lock."
+
+
+
+That's it! By the way, you can do lots of cool stuff with the Tweaks tool. For example, I set my right Ctrl key to be a Compose key, which allows me to type all sorts of characters with keyboard shortcuts—such as ç, é, ô, and ñ and with the keystrokes Compose+c+Comma; Compose+e+Right quote; Compose+o+Circumflex; and Compose+n+Tilde.
+
+### With KDE
+
+I don't use [KDE][4], but item 5 in this article about [KDE tweaks that will change your life][5] by my colleague Seth Kenlon will show you how to remap your keys.
+
+### With Xfce
+
+As far as I can tell, the [Xfce][6] desktop environment doesn't have a handy tool for managing these kinds of settings. However, the **ctrl:swapcaps** option to the **setxkbmap** command will help you make these changes. This type of modification has two parts:
+
+ 1. Figuring out the command's usage;
+ 2. Figuring out where to invoke the command so it is activated as the desktop comes up.
+
+
+
+The first part is pretty straightforward: the command is:
+
+```
+/usr/bin/setxkbmap -option "ctrl:nocaps"
+```
+
+It's worth executing this in a terminal window to make sure the results are what you expect.
+
+Assuming it works, where should you invoke the command? That requires some experimentation; one possibility is in the file **.profile** in the user's home directory. Another option is to add the command to the autostart facility in Xfce (look for "Session and Startup" in the Settings Manager).
+
+Another possibility is to use the same option in the file / **etc/default/keyboard** , which might end up looking like this:
+
+```
+# KEYBOARD CONFIGURATION FILE
+
+# Consult the keyboard(5) manual page.
+
+XKBMODEL="pc105"
+XKBLAYOUT="us"
+XKBVARIANT=""
+XKBOPTIONS="ctrl:swapcaps"
+
+BACKSPACE="guess"
+```
+
+Note that this kind of change will affect all users, so if you share your computer, be prepared to do some explaining. Also, system updates may overwrite this file, so you'll need to edit it again if your setup stops working. Putting the same information in the file **.keyboard** in the user's home directory might accomplish the same task on the user's behalf.
+
+Finally, note that these kinds of changes require you to restart Xfce (except when running the command on the command line in the terminal window, but that won't stick past the end of the session).
+
+### With LXQt and other desktop environments
+
+I haven't tried [LXQt][7], but if my memory serves from [LXDE][8], I would try the same recipe used above for Xfce. I'd also expect that the Xfce recipe could work for other Linux desktop environments, but, of course, your favorite search engine is always your friend.
+
+### The console
+
+I haven't tried this, as I have very few opportunities to interact with the console (what you see on a server or when your window system doesn't come up properly). The recipes presented above affect the terminal window in the way one would hope, i.e., consistently with other applications.
+
+However, if the file **/etc/default/keyboard** or **~/.keyboard** has already been edited (as described above), the utility **setupcon** is intended to change the console keyboard setup so it functions the same way.** **This [StackExchange article][9], [this other one][10], and [this third one][11] give some ideas on how to effect these changes from both of these files. The third article also talks about using **dumpkeys** and **loadkeys**. It's also worthwhile to read [the setupcon man page][12] — it's short and to the point, and combined with the comments from the StackExchange articles, should be enough to get a solution in place.
+
+Finally, it's worth emphasizing here the point mentioned in the StackExchange articles - configuring the console IS NOT THE SAME as configuring terminal windows; the latter are configured through the desktop manager as described previously.
+
+### When all else fails
+
+The manual pages for **setxkbmap** , **xkeyboard-config** , **keyboard** , **console-setup** , and **setupcon** are all useful references. Or, if you don't like reading manual pages, there's [this great article][13].
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/11/how-swap-ctrl-and-caps-lock-your-keyboard
+
+作者:[Chris Hermansen][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/clhermansen
+[b]: https://github.com/lujun9972
+[1]: https://en.wikipedia.org/wiki/Control_key
+[2]: https://www.gnome.org/gnome-3/
+[3]: https://wiki.gnome.org/Apps/Tweaks
+[4]: https://www.kde.org/
+[5]: https://opensource.com/article/17/5/7-cool-kde-tweaks-will-improve-your-life
+[6]: https://www.xfce.org/
+[7]: https://lxqt.org/
+[8]: https://lxde.org/
+[9]: https://askubuntu.com/questions/485454/how-to-remap-keys-on-a-user-level-both-with-and-without-x
+[10]: https://unix.stackexchange.com/questions/198791/how-do-i-permanently-change-the-console-tty-font-type-so-it-holds-after-reboot
+[11]: https://superuser.com/questions/290115/how-to-change-console-keymap-in-linux
+[12]: http://man.he.net/man1/setupcon
+[13]: http://www.noah.org/wiki/CapsLock_Remap_Howto
diff --git a/sources/tech/20181122 Getting started with Jenkins X.md b/sources/tech/20181122 Getting started with Jenkins X.md
new file mode 100644
index 0000000000..1c2aab6903
--- /dev/null
+++ b/sources/tech/20181122 Getting started with Jenkins X.md
@@ -0,0 +1,148 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: subject: (Getting started with Jenkins X)
+[#]: via: (https://opensource.com/article/18/11/getting-started-jenkins-x)
+[#]: author: (Dave Johnson https://opensource.com/users/snoopdave)
+[#]: url: ( )
+
+Getting started with Jenkins X
+======
+Jenkins X provides continuous integration, automated testing, and continuous delivery to Kubernetes.
+
+
+[Jenkins X][1] is an open source system that offers software developers continuous integration, automated testing, and continuous delivery, known as CI/CD, in Kubernetes. Jenkins X-managed projects get a complete CI/CD process with a Jenkins pipeline that builds and packages project code for deployment to Kubernetes and access to pipelines for promoting projects to staging and production environments.
+
+Developers are already benefiting from running "classic" open source Jenkins and CloudBees Jenkins on Kubernetes, thanks in part to the Jenkins Kubernetes plugin, which allows you to dynamically spin-up Kubernetes pods to run Jenkins build agents. Jenkins X adds what's missing from Jenkins: comprehensive support for continuous delivery and managing the promotion of projects to preview, staging, and production environments running in Kubernetes.
+
+This article is a high-level explanation of how Jenkins X works; it assumes you have some knowledge of Kubernetes and classic Jenkins.
+
+### What you get with Jenkins X
+
+If you're running on one of the major cloud providers (Amazon Elastic Container Service for Kubernetes, Google Kubernetes Engine, or Microsoft Azure Kubernetes Service), installing and deploying Jenkins X is easy. Download the Jenkins X command-line interface and run the **jx create cluster** command. You'll be prompted for the necessary information and, if you take the defaults, Jenkins X will create a starter-size Kubernetes cluster and install Jenkins X.
+
+When you deploy Jenkins X, a number of services are put in motion to watch your Git repositories and respond by building, testing, and promoting your applications to staging, production, and other environments you define. Jenkins X also deploys a set of supporting services, including [Jenkins][2], [Docker Registry][3], [Chart Museum][4], and [Monocular][5] to manage [Helm][6] charts, and [Nexus][7], which serves as a Maven and npm repository.
+
+The Jenkins X deployment also creates two Git repositories, one for your staging environment and one for production. These are in addition to the Git repositories you use to manage your project source code. Jenkins X uses these repositories to manage what is deployed to each environment, and promotions are done via Git pull requests (PRs)—this approach is known as [GitOps][8]. Each repository contains a Helm chart that specifies the applications to be deployed to the corresponding environment. Each repository also has a Jenkins pipeline to handle promotions.
+
+### Creating a new project with Jenkins X
+
+To create a new project with Jenkins X, use the **jx create quickstart** command. If you don't specify any options, jx will prompt you to select a project name and a platform—which can be just about anything. SpringBoot, Go, Python, Node, ASP.NET, Rust, Angular, and React are all supported, and the list keeps growing. Once you have chosen your project name and platform, Jenkins X will:
+
+ * Create a new project that includes a "hello-world"-style web project
+ * Add the appropriate type of makefile or build script for the chosen platform
+ * Add a Jenkinsfile to manage promotions to staging and production environments
+ * Add a Dockerfile and Helm charts, created via [Draft][9]
+ * Add a [Skaffold][10] configuration for deploying the application to Kubernetes
+ * Create a Git repository and push the new project code there
+
+
+
+Next, a webhook from Git will notify Jenkins X that a project changed, and it will run your project's Jenkins pipeline to build and push your Docker image and Helm charts.
+
+Finally, the pipeline will submit a PR to the staging environment's Git repository with the changes needed to promote the application.
+
+Once the PR is merged, the staging pipeline will run to apply those changes and do the promotion. A couple of minutes after creating your project, you'll have end-to-end CI/CD, and your project will be running in staging and available for use.
+
+![Developer commits changes, project deployed to staging][12]
+
+Developer commits changes, project deployed to the staging environment.
+
+The figure above illustrates the repositories, registries, and pipelines and how they interact in a Jenkins X promotion to staging. Here are the steps:
+
+ 1. The developer commits and pushes the change to the project's Git repository
+ 2. Jenkins X is notified and runs the project's Jenkins pipeline in a Docker image that includes the project's language and supporting frameworks
+ 3. The project pipeline builds, tests, and pushes the project's Helm chart to Chart Museum and its Docker image to the registry
+ 4. The project pipeline creates a PR with changes needed to add the project to the staging environment
+ 5. Jenkins X automatically merges the PR to Master
+ 6. Jenkins X is notified and runs the staging pipeline
+ 7. The staging pipeline runs Helm, which deploys the environment, pulling Helm charts from Chart Museum and Docker images from the Docker registry. Kubernetes creates the project's resources, typically a pod, service, and ingress.
+
+
+
+### Importing your existing projects into Jenkins X
+
+**jx import** , Jenkins X adds the things needed for your project to be deployed to Kubernetes and participate in CI/CD. It will add a Jenkins pipeline, Helm charts, and a Skaffold configuration for deploying the application to Kubernetes. Jenkins X will create a Git repository and push the changes there. Next, a webhook from Git will notify Jenkins X that a project changed, and promotion to staging will happen as described above for new projects.
+
+### Promoting your project to production
+
+When you import a project via, Jenkins X adds the things needed for your project to be deployed to Kubernetes and participate in CI/CD. It will add a Jenkins pipeline, Helm charts, and a Skaffold configuration for deploying the application to Kubernetes. Jenkins X will create a Git repository and push the changes there. Next, a webhook from Git will notify Jenkins X that a project changed, and promotion to staging will happen as described above for new projects.
+
+To promote a version of your project to the production environment, use the **jx promote** command. This command will prepare a Git PR that contains the Helm chart changes needed to deploy into the production environment and submit this request to the production environment's Git repository. Once the request is manually approved, Jenkins X will run the production pipeline to deploy your project via Helm.
+
+![Promoting project to production][14]
+
+Developer promotes the project to production.
+
+This figure illustrates the repositories, registries, and pipelines and how they interact in a Jenkins X promotion to production. Here are the steps:
+
+ 1. The developer runs the **jx promote** command to promote a project to production
+ 2. Jenkins X creates a PR with changes needed to add the project to the production environment
+ 3. The developer manually approves the PR, and it is merged to Master
+ 4. Jenkins X is notified and runs the production pipeline
+ 5. The production pipeline runs Helm, which deploys the environment, pulling Helm charts from Chart Museum and Docker images from the Docker registry. Kubernetes creates the project's resources, typically a pod, service, and ingress.
+
+
+
+### Other features of Jenkins X
+
+Other interesting and appealing features of Jenkins X include:
+
+#### Preview environments
+
+When you create a PR to add a new feature to your project, you can ask Jenkins X to create a preview environment so you can make your new feature available for preview and testing before the PR is merged.
+
+#### Extensions
+
+It is possible to create extensions to Jenkins X. An extension is code that runs at specific times in the CI/CD process. An extension can provide code that runs when the extension is installed, uninstalled, as well as before and after each pipeline.
+
+#### Serverless Jenkins
+
+Instead of running the Jenkins web application, which continually consumes CPU and memory resources, you can run Jenkins only when you need it. During the past year, the Jenkins community created a version of Jenkins that can run classic Jenkins pipelines via the command line with the configuration defined by code instead of HTML forms.
+
+This capability is now available in Jenkins X. When you create a Jenkins X cluster, you can choose to use Serverless Jenkins. If you do, Jenkins X will deploy [Prow][15] to handle webhooks from GitHub and [Knative][16] to run Jenkins pipelines.
+
+### Jenkins X limitations
+
+Jenkins X also has some limitations that should be considered:
+
+ * **Jenkins X is currently limited to projects that use Git:** Jenkins X is opinionated about CI/CD and assumes everybody wants to run and deploy software to Kubernetes and everybody is happy to use Git for source code and defining environments. Also, the Serverless Jenkins feature currently works only with GitHub.
+ * **Jenkins X is limited to Kubernetes:** It is true that Jenkins X can run automated builds, testing, and continuous integration for any type of software, but the continuous delivery part targets a Kubernetes namespace managed by Jenkins X.
+ * **Jenkins X requires cluster-admin level Kubernetes access:** Jenkins X needs cluster-admin access so it can define and manage a Kubernetes custom resource definition. Hopefully, this is a temporary limitation, because it could be a show-stopper for some.
+
+
+
+### Conclusions
+
+Jenkins X looks to be a good way to implement CI/CD for Kubernetes, and I'm looking forward to putting it to the test in production. Using Jenkins X is also a good way to learn about some useful open source tools for deploying to Kubernetes, including Helm, Draft, Skaffold, Prow, and more. These are things you might want to use even if you decide Jenkins X is not for you. If you're deploying to Kubernetes, take Jenkins X for a spin.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/11/getting-started-jenkins-x
+
+作者:[Dave Johnson][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/snoopdave
+[b]: https://github.com/lujun9972
+[1]: https://jenkins-x.io/
+[2]: https://jenkins.io/
+[3]: https://docs.docker.com/registry/
+[4]: https://github.com/helm/chartmuseum
+[5]: https://github.com/helm/monocular
+[6]: https://helm.sh
+[7]: https://www.sonatype.com/nexus-repository-oss
+[8]: https://www.weave.works/blog/gitops-operations-by-pull-request
+[9]: https://draft.sh/
+[10]: https://github.com/GoogleContainerTools/skaffold
+[11]: /file/414941
+[12]: https://opensource.com/sites/default/files/uploads/jenkinsx_fig1.png (Developer commits changes, project deployed to staging)
+[13]: /file/414946
+[14]: https://opensource.com/sites/default/files/uploads/jenkinsx_fig2.png (Promoting project to production)
+[15]: https://github.com/kubernetes/test-infra/tree/master/prow
+[16]: https://cloud.google.com/knative/
diff --git a/sources/tech/20181123 How to Build a Netboot Server, Part 1.md b/sources/tech/20181123 How to Build a Netboot Server, Part 1.md
new file mode 100644
index 0000000000..01bc4a49dd
--- /dev/null
+++ b/sources/tech/20181123 How to Build a Netboot Server, Part 1.md
@@ -0,0 +1,461 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: subject: (How to Build a Netboot Server, Part 1)
+[#]: via: (https://fedoramagazine.org/how-to-build-a-netboot-server-part-1/)
+[#]: author: (Gregory Bartholomew https://fedoramagazine.org/author/glb/)
+[#]: url: ( )
+
+How to Build a Netboot Server, Part 1
+======
+
+
+
+Some computer networks need to maintain identical software installations and configurations on several physical machines. One such environment would be a school computer lab. A [netboot][1] server can be set up to serve an entire operating system over a network so that the client computers can be configured from one central location. This tutorial will show one method of building a netboot server.
+
+Part 1 of this tutorial will cover creating a netboot server and image. Part 2 will show how to add Kerberos-authenticated home directories to the netboot configuration.
+
+### Initial Configuration
+
+Start by downloading one of Fedora Server’s [netinst][2] images, burning it to a CD, and booting the server that will be reformatted from it. We just need a typical “Minimal Install” of Fedora Server for our starting point and we will use the command line to add any additional packages that are needed after the installation is finished.
+
+![][3]
+
+> NOTE: For this tutorial we will be using Fedora 28. Other versions may include a slightly different set of packages in their “Minimal Install”. If you start with a different version of Fedora, then you may need to do some troubleshooting if an expected file or command is not available.
+
+Once you have your minimal installation of Fedora Server up and running, log in as root and set the hostname:
+
+```
+$ MY_HOSTNAME=server-01.example.edu
+$ hostnamectl set-hostname $MY_HOSTNAME
+```
+
+> NOTE: Red Hat recommends that both static and transient names match the fully-qualified domain name (FQDN) used for the machine in DNS, such as host.example.com ([Understanding Host Names][4]).
+>
+> NOTE: This guide is meant to be copy-and-paste friendly. Any value that you might need to customize will be stated as a MY_* variable that you can tweak before running the remaining commands. Beware that if you log out, the variable assignments will be cleared.
+>
+> NOTE: Fedora 28 Server tends to dump a lot of logging output to the console by default. You may want to disable the console logging temporarily by running: sysctl -w kernel.printk=0
+
+Next, we need a static network address on our server. The following sequence of commands should find and reconfigure your default network connection appropriately:
+
+```
+$ MY_DNS1=192.0.2.91
+$ MY_DNS2=192.0.2.92
+$ MY_IP=192.0.2.158
+$ MY_PREFIX=24
+$ MY_GATEWAY=192.0.2.254
+$ DEFAULT_DEV=$(ip route show default | awk '{print $5}')
+$ DEFAULT_CON=$(nmcli d show $DEFAULT_DEV | sed -n '/^GENERAL.CONNECTION:/s!.*:\s*!! p')
+$ nohup bash << END
+nmcli con mod "$DEFAULT_CON" connection.id "$DEFAULT_DEV"
+nmcli con mod "$DEFAULT_DEV" connection.interface-name "$DEFAULT_DEV"
+nmcli con mod "$DEFAULT_DEV" ipv4.method disabled
+nmcli con up "$DEFAULT_DEV"
+nmcli con add con-name br0 ifname br0 type bridge
+nmcli con mod br0 bridge.stp no
+nmcli con mod br0 ipv4.dns $MY_DNS1,$MY_DNS2
+nmcli con mod br0 ipv4.addresses $MY_IP/$MY_PREFIX
+nmcli con mod br0 ipv4.gateway $MY_GATEWAY
+nmcli con mod br0 ipv4.method manual
+nmcli con up br0
+nmcli con add con-name br0-slave0 ifname "$DEFAULT_DEV" type bridge-slave master br0
+nmcli con up br0-slave0
+END
+```
+
+> NOTE: The last set of commands above is wrapped in a “nohup” script because it will disable networking temporarily. The nohup command should allow the nmcli commands to finish running even while your ssh connection is down. Beware that it may take 10 or so seconds for the connection to come back up and that you will have to start a new ssh connection if you changed the server’s IP address.
+>
+> NOTE: The above network configuration creates a [network bridge][5] on top of the default connection so that we can run a virtual machine instance directly on the server for testing later. If you do not want to test the netboot image directly on the server, you can skip creating the bridge and set the static IP address directly on your default network connection.
+
+### Install and Configure NFS4
+
+Start by installing the nfs-utils package:
+
+```
+$ dnf install -y nfs-utils
+```
+
+Create a top-level [pseudo filesystem][6] for the NFS exports and share it out to your network:
+
+```
+$ MY_SUBNET=192.0.2.0
+$ mkdir /export
+$ echo "/export -fsid=0,ro,sec=sys,root_squash $MY_SUBNET/$MY_PREFIX" > /etc/exports
+```
+
+SELinux will interfere with the netboot server’s operation. Configuring exceptions for it is beyond the scope of this tutorial, so we will disable it:
+
+```
+$ sed -i '/GRUB_CMDLINE_LINUX/s/"$/ audit=0 selinux=0"/' /etc/default/grub
+$ grub2-mkconfig -o /boot/grub2/grub.cfg
+$ sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/sysconfig/selinux
+$ setenforce 0
+```
+
+> NOTE: Editing the grub command line should not be necessary, but simply editing /etc/sysconfig/selinux proved ineffective across reboots of Fedora Server 28 during testing, so the “selinux=0” flag has been set here to be doubly sure.
+
+Now, add an exception for the NFS service to the local firewall and start the NFS service:
+
+```
+$ firewall-cmd --add-service nfs
+$ firewall-cmd --runtime-to-permanent
+$ systemctl enable nfs-server.service
+$ systemctl start nfs-server.service
+```
+
+### Create the Netboot Image
+
+Now that our NFS server is up and running, we need to supply it with an operating system image to serve to the client computers. We will start with a very minimal image and add to it after everything is working.
+
+First, create a new directory where our image will be stored:
+
+```
+$ mkdir /fc28
+```
+
+Use the “dnf” command to build the image under the new directory with only a few base packages:
+
+```
+$ dnf -y --releasever=28 --installroot=/fc28 install fedora-release systemd passwd rootfiles sudo dracut dracut-network nfs-utils vim-minimal dnf
+```
+
+It is important that the “kernel” packages were omitted from the above command. Before they are installed, we need to tweak the set of drivers that will be included in the “initramfs” image that is built automatically when the kernel is first installed. In particular, we need to disable “hostonly” mode so that the initramfs image will work on a wider set of hardware platforms and we need to add support for networking and NFS:
+
+```
+$ echo 'hostonly=no' > /fc28/etc/dracut.conf.d/hostonly.conf
+$ echo 'add_dracutmodules+=" network nfs "' > /fc28/etc/dracut.conf.d/netboot.conf
+```
+
+Now, install the kernel:
+
+```
+$ dnf -y --installroot=/fc28 install kernel
+```
+
+Set a rule to prevent the kernel from being updated:
+
+```
+$ echo 'exclude=kernel-*' >> /fc28/etc/dnf/dnf.conf
+```
+
+Set the locale:
+
+```
+$ echo 'LANG="en_US.UTF-8"' > /fc28/etc/locale.conf
+```
+
+> NOTE: Some programs (e.g. GNOME Terminal) will not function if the locale is not properly configured.
+
+Blank root’s passwd:
+
+```
+$ sed -i 's/^root:\*/root:/' /fc28/etc/shadow
+```
+
+Set the client’s hostname:
+
+```
+$ MY_CLIENT_HOSTNAME=client-01.example.edu
+$ echo $MY_CLIENT_HOSTNAME > /fc28/etc/hostname
+```
+
+Disable logging to the console:
+
+```
+$ echo 'kernel.printk = 0 4 1 7' > /fc28/etc/sysctl.d/00-printk.conf
+```
+
+Define a local “liveuser” in the netboot image:
+
+```
+$ echo 'liveuser:x:1000:1000::/home/liveuser:/bin/bash' >> /fc28/etc/passwd
+$ echo 'liveuser::::::::' >> /fc28/etc/shadow
+$ echo 'liveuser:x:1000:' >> /fc28/etc/group
+$ echo 'liveuser:!::' >> /fc28/etc/gshadow
+```
+
+Allow “liveuser” to sudo:
+
+```
+$ echo 'liveuser ALL=(ALL) NOPASSWD: ALL' > /fc28/etc/sudoers.d/liveuser
+```
+
+Enable automatic home directory creation:
+
+```
+$ dnf install -y --installroot=/fc28 authselect oddjob-mkhomedir
+$ echo 'dirs /home' > /fc28/etc/rwtab.d/home
+$ chroot /fc28 authselect select sssd with-mkhomedir --force
+$ chroot /fc28 systemctl enable oddjobd.service
+```
+
+Since multiple clients will be mounting our image concurrently, we need to configure the image so that it will operate in read-only mode:
+
+```
+$ sed -i 's/^READONLY=no$/READONLY=yes/' /fc28/etc/sysconfig/readonly-root
+```
+
+Configure logging to go to RAM rather than permanent storage:
+
+```
+$ sed -i 's/^#Storage=auto$/Storage=volatile/' /fc28/etc/systemd/journald.conf
+```
+
+Configure DNS:
+
+```
+$ MY_DNS1=192.0.2.91
+$ MY_DNS2=192.0.2.92
+$ cat << END > /fc28/etc/resolv.conf
+nameserver $MY_DNS1
+nameserver $MY_DNS2
+END
+```
+
+Work-around a few bugs that exist for read-only root mounts at the time this tutorial is being written ([BZ1542567][7]):
+
+```
+$ echo 'dirs /var/lib/gssproxy' > /fc28/etc/rwtab.d/gssproxy
+$ cat << END > /fc28/etc/rwtab.d/systemd
+dirs /var/lib/systemd/catalog
+dirs /var/lib/systemd/coredump
+END
+```
+
+Finally, we can create the NFS filesystem for our image and share it out to our subnet:
+
+```
+$ mkdir /export/fc28
+$ echo '/fc28 /export/fc28 none bind 0 0' >> /etc/fstab
+$ mount /export/fc28
+$ echo "/export/fc28 -ro,sec=sys,no_root_squash $MY_SUBNET/$MY_PREFIX" > /etc/exports.d/fc28.exports
+$ exportfs -vr
+```
+
+### Create the Boot Loader
+
+Now that we have an operating system available to netboot, we need a boot loader to kickstart it on the client systems. For this setup, we will be using [iPXE][8].
+
+> NOTE: This section and the following section — Testing with QEMU — can be done on a separate computer; they do not have to be run on the netboot server.
+
+Install git and use it to download iPXE:
+
+```
+$ dnf install -y git
+$ git clone http://git.ipxe.org/ipxe.git $HOME/ipxe
+```
+
+Now we need to create a special startup script for our bootloader:
+
+```
+$ cat << 'END' > $HOME/ipxe/init.ipxe
+#!ipxe
+
+prompt --key 0x02 --timeout 2000 Press Ctrl-B for the iPXE command line... && shell ||
+
+dhcp || exit
+set prefix file:///linux
+chain ${prefix}/boot.cfg || exit
+END
+```
+
+Enable the “file” download protocol:
+
+```
+$ echo '#define DOWNLOAD_PROTO_FILE' > $HOME/ipxe/src/config/local/general.h
+```
+
+Install the C compiler and related tools and libraries:
+
+```
+$ dnf groupinstall -y "C Development Tools and Libraries"
+```
+
+Build the boot loader:
+
+```
+$ cd $HOME/ipxe/src
+$ make clean
+$ make bin-x86_64-efi/ipxe.efi EMBED=../init.ipxe
+```
+
+Make note of where the where the newly-compiled boot loader is. We will need it for the next section:
+
+```
+$ IPXE_FILE="$HOME/ipxe/src/bin-x86_64-efi/ipxe.efi"
+```
+
+### Testing with QEMU
+
+This section is optional, but you will need to duplicate the file layout of the [EFI system partition][9] that is shown below on your physical machines to configure them for netbooting.
+
+> NOTE: You could also copy the files to a TFTP server and reference that server from DHCP if you wanted a fully diskless system.
+
+In order to test our boot loader with QEMU, we are going to create a small disk image containing only an EFI system partition and our startup files.
+
+Start by creating the required directory layout for the EFI system partition and copying the boot loader that we created in the previous section to it:
+
+```
+$ mkdir -p $HOME/esp/efi/boot
+$ mkdir $HOME/esp/linux
+$ cp $IPXE_FILE $HOME/esp/efi/boot/bootx64.efi
+```
+
+The below command should identify the kernel version that our netboot image is using and store it in a variable for use in the remaining configuration directives:
+
+```
+$ DEFAULT_VER=$(ls -c /fc28/lib/modules | head -n 1)
+```
+
+Define the boot configuration that our client computers will be using:
+
+```
+$ MY_DNS1=192.0.2.91
+$ MY_DNS2=192.0.2.92
+$ MY_NFS4=server-01.example.edu
+$ cat << END > $HOME/esp/linux/boot.cfg
+#!ipxe
+
+kernel --name kernel.efi \${prefix}/vmlinuz-$DEFAULT_VER initrd=initrd.img ro ip=dhcp rd.peerdns=0 nameserver=$MY_DNS1 nameserver=$MY_DNS2 root=nfs4:$MY_NFS4:/fc28 console=tty0 console=ttyS0,115200n8 audit=0 selinux=0 quiet
+initrd --name initrd.img \${prefix}/initramfs-$DEFAULT_VER.img
+boot || exit
+END
+```
+
+> NOTE: The above boot script shows a minimal example of how to get iPXE to netboot Linux. Much more complex configurations are possible. Most notably, iPXE has support for interactive boot menus which can be configured with a default selection and a timeout. A more advanced iPXE script could, for example, default to booting an operation system from the local disk and only go to the netboot operation if a user pressed a key before a countdown timer reached zero.
+
+Copy the Linux kernel and its associated initramfs to the EFI system partition:
+
+```
+$ cp $(find /fc28/lib/modules -maxdepth 2 -name 'vmlinuz' | grep -m 1 $DEFAULT_VER) $HOME/esp/linux/vmlinuz-$DEFAULT_VER
+$ cp $(find /fc28/boot -name 'init*' | grep -m 1 $DEFAULT_VER) $HOME/esp/linux/initramfs-$DEFAULT_VER.img
+```
+
+Our resulting directory layout should look like this:
+
+```
+esp
+├── efi
+│ └── boot
+│ └── bootx64.efi
+└── linux
+ ├── boot.cfg
+ ├── initramfs-4.18.18-200.fc28.x86_64.img
+ └── vmlinuz-4.18.18-200.fc28.x86_64
+```
+
+To use our EFI system partition with QEMU, we need to create a small “uefi.img” disk image containing it and then connect that to QEMU as the primary boot drive.
+
+Begin by installing the necessary tools:
+
+```
+$ dnf install -y parted dosfstools
+```
+
+Now create the “uefi.img” file and copy the files from the “esp” directory into it:
+
+```
+$ ESP_SIZE=$(du -ks $HOME/esp | cut -f 1)
+$ dd if=/dev/zero of=$HOME/uefi.img count=$((${ESP_SIZE}+5000)) bs=1KiB
+$ UEFI_DEV=$(losetup --show -f $HOME/uefi.img)
+$ parted ${UEFI_DEV} -s mklabel gpt mkpart EFI FAT16 1MiB 100% toggle 1 boot
+$ mkfs -t msdos ${UEFI_DEV}p1
+$ mkdir -p $HOME/mnt
+$ mount ${UEFI_DEV}p1 $HOME/mnt
+$ cp -r $HOME/esp/* $HOME/mnt
+$ umount $HOME/mnt
+$ losetup -d ${UEFI_DEV}
+```
+
+> NOTE: On a physical computer, you need only copy the files from the “esp” directory to the computer’s existing EFI system partition. You do not need the “uefi.img” file to boot a physical computer.
+>
+> NOTE: On a physical computer you can rename the “bootx64.efi” file if a file by that name already exists, but if you do so, you will probably have to edit the computer’s BIOS settings and add the renamed efi file to the boot list.
+
+Next we need to install the qemu package:
+
+```
+$ dnf install -y qemu-system-x86
+```
+
+Allow QEMU to access the bridge that we created in the “Initial Configuration” section of this tutorial:
+
+```
+$ echo 'allow br0' > /etc/qemu/bridge.conf
+```
+
+Create a copy of the “OVMF_VARS.fd” image to store our virtual machine’s persistent BIOS settings:
+
+```
+$ cp /usr/share/edk2/ovmf/OVMF_VARS.fd $HOME
+```
+
+Now, start the virtual machine:
+
+```
+$ qemu-system-x86_64 -machine accel=kvm -nographic -m 1024 -drive if=pflash,format=raw,unit=0,file=/usr/share/edk2/ovmf/OVMF_CODE.fd,readonly=on -drive if=pflash,format=raw,unit=1,file=$HOME/OVMF_VARS.fd -drive if=ide,format=raw,file=$HOME/uefi.img -net bridge,br=br0 -net nic,model=virtio
+```
+
+If all goes well, you should see results similar to what is shown in the below image:
+
+![][10]
+You can use the “shutdown” command to get out of the virtual machine and back to the server:
+
+```
+$ sudo shutdown -h now
+```
+
+> NOTE: If something goes wrong and the virtual machine hangs, you may need to start a new ssh session to the server and use the “kill” command to terminate the “qemu-system-x86_64” process.
+
+### Adding to the Image
+
+Adding to the image should be a simple matter of chroot’ing into the image on the server and running “dnf install ”.
+
+There is no limit to what can be installed on the netboot image. A full graphical installation should function perfectly.
+
+Here is an example of how to bring our minimal netboot image up to a complete graphical installation:
+
+```
+$ for i in dev dev/pts dev/shm proc sys run; do mount -o bind /$i /fc28/$i; done
+$ chroot /fc28 /usr/bin/bash --login
+$ dnf -y groupinstall "Fedora Workstation"
+$ dnf -y remove gnome-initial-setup
+$ systemctl disable sshd.service
+$ systemctl enable gdm.service
+$ systemctl set-default graphical.target
+$ sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/sysconfig/selinux
+$ logout
+$ for i in run sys proc dev/shm dev/pts dev; do umount /fc28/$i; done
+```
+
+Optionally, you may want to enable automatic login for the “liveuser” account:
+
+```
+$ sed -i '/daemon/a AutomaticLoginEnable=true' /fc28/etc/gdm/custom.conf
+$ sed -i '/daemon/a AutomaticLogin=liveuser' /fc28/etc/gdm/custom.conf
+```
+
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/how-to-build-a-netboot-server-part-1/
+
+作者:[Gregory Bartholomew][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://fedoramagazine.org/author/glb/
+[b]: https://github.com/lujun9972
+[1]: https://en.wikipedia.org/wiki/Network_booting
+[2]: https://dl.fedoraproject.org/pub/fedora/linux/releases/28/Server/x86_64/iso/
+[3]: https://fedoramagazine.org/wp-content/uploads/2018/11/installation-summary-1024x768.png
+[4]: https://docs.fedoraproject.org/en-US/Fedora/25/html/Networking_Guide/ch-Configure_Host_Names.html#sec_Understanding_Host_Names
+[5]: https://en.wikipedia.org/wiki/Bridging_(networking)
+[6]: https://www.centos.org/docs/5/html/5.1/Deployment_Guide/s3-nfs-server-config-exportfs-nfsv4.html
+[7]: https://bugzilla.redhat.com/show_bug.cgi?id=1542567
+[8]: https://ipxe.org/
+[9]: https://en.wikipedia.org/wiki/EFI_system_partition
+[10]: https://fedoramagazine.org/wp-content/uploads/2018/11/netboot-liveuser-1024x641.png
diff --git a/sources/tech/20181123 Three SSH GUI Tools for Linux.md b/sources/tech/20181123 Three SSH GUI Tools for Linux.md
new file mode 100644
index 0000000000..9691a737ca
--- /dev/null
+++ b/sources/tech/20181123 Three SSH GUI Tools for Linux.md
@@ -0,0 +1,176 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: subject: (Three SSH GUI Tools for Linux)
+[#]: via: (https://www.linux.com/blog/learn/intro-to-linux/2018/11/three-ssh-guis-linux)
+[#]: author: (Jack Wallen https://www.linux.com/users/jlwallen)
+[#]: url: ( )
+
+Three SSH GUI Tools for Linux
+======
+
+
+
+At some point in your career as a Linux administrator, you’re going to use Secure Shell (SSH) to remote into a Linux server or desktop. Chances are, you already have. In some instances, you’ll be SSH’ing into multiple Linux servers at once. In fact, Secure Shell might well be one of the most-used tools in your Linux toolbox. Because of this, you’ll want to make the experience as efficient as possible. For many admins, nothing is as efficient as the command line. However, there are users out there who do prefer a GUI tool, especially when working from a desktop machine to remote into and work on a server.
+
+If you happen to prefer a good GUI tool, you’ll be happy to know there are a couple of outstanding graphical tools for SSH on Linux. Couple that with a unique terminal window that allows you to remote into multiple machines from the same window, and you have everything you need to work efficiently. Let’s take a look at these three tools and find out if one (or more) of them is perfectly apt to meet your needs.
+
+I’ll be demonstrating these tools on [Elementary OS][1], but they are all available for most major distributions.
+
+### PuTTY
+
+Anyone that’s been around long enough knows about [PuTTY][2]. In fact, PuTTY is the de facto standard tool for connecting, via SSH, to Linux servers from the Windows environment. But PuTTY isn’t just for Windows. In fact, from withing the standard repositories, PuTTY can also be installed on Linux. PuTTY’s feature list includes:
+
+ * Saved sessions.
+
+ * Connect via IP address or hostname.
+
+ * Define alternative SSH port.
+
+ * Connection type definition.
+
+ * Logging.
+
+ * Options for keyboard, bell, appearance, connection, and more.
+
+ * Local and remote tunnel configuration
+
+ * Proxy support
+
+ * X11 tunneling support
+
+
+
+
+The PuTTY GUI is mostly a way to save SSH sessions, so it’s easier to manage all of those various Linux servers and desktops you need to constantly remote into and out of. Once you’ve connected, from PuTTY to the Linux server, you will have a terminal window in which to work. At this point, you may be asking yourself, why not just work from the terminal window? For some, the convenience of saving sessions does make PuTTY worth using.
+
+Installing PuTTY on Linux is simple. For example, you could issue the command on a Debian-based distribution:
+
+```
+sudo apt-get install -y putty
+```
+
+Once installed, you can either run the PuTTY GUI from your desktop menu or issue the command putty. In the PuTTY Configuration window (Figure 1), type the hostname or IP address in the HostName (or IP address) section, configure the port (if not the default 22), select SSH from the connection type, and click Open.
+
+![PuTTY Connection][4]
+
+Figure 1: The PuTTY Connection Configuration Window.
+
+[Used with permission][5]
+
+Once the connection is made, you’ll then be prompted for the user credentials on the remote server (Figure 2).
+
+![log in][7]
+
+Figure 2: Logging into a remote server with PuTTY.
+
+[Used with permission][5]
+
+To save a session (so you don’t have to always type the remote server information), fill out the IP address (or hostname), configure the port and connection type, and then (before you click Open), type a name for the connection in the top text area of the Saved Sessions section, and click Save. This will then save the configuration for the session. To then connect to a saved session, select it from the saved sessions window, click Load, and then click Open. You should then be prompted for the remote credentials on the remote server.
+
+### EasySSH
+
+Although [EasySSH][8] doesn’t offer the amount of configuration options found in PuTTY, it’s (as the name implies) incredibly easy to use. One of the best features of EasySSH is that it offers a tabbed interface, so you can have multiple SSH connections open and quickly switch between them. Other EasySSH features include:
+
+ * Groups (so you can group tabs for an even more efficient experience).
+
+ * Username/password save.
+
+ * Appearance options.
+
+ * Local and remote tunnel support.
+
+
+
+
+Install EasySSH on a Linux desktop is simple, as the app can be installed via flatpak (which does mean you must have Flatpak installed on your system). Once flatpak is installed, add EasySSH with the commands:
+
+```
+sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
+
+sudo flatpak install flathub com.github.muriloventuroso.easyssh
+```
+
+Run EasySSH with the command:
+
+```
+flatpak run com.github.muriloventuroso.easyssh
+```
+
+The EasySSH app will open, where you can click the + button in the upper left corner. In the resulting window (Figure 3), configure your SSH connection as required.
+
+![Adding a connection][10]
+
+Figure 3: Adding a connection in EasySSH is simple.
+
+[Used with permission][5]
+
+Once you’ve added the connection, it will appear in the left navigation of the main window (Figure 4).
+
+![EasySSH][12]
+
+Figure 4: The EasySSH main window.
+
+[Used with permission][5]
+
+To connect to a remote server in EasySSH, select it from the left navigation and then click the Connect button (Figure 5).
+
+![Connecting][14]
+
+Figure 5: Connecting to a remote server with EasySSH.
+
+[Used with permission][5]
+
+The one caveat with EasySSH is that you must save the username and password in the connection configuration (otherwise the connection will fail). This means anyone with access to the desktop running EasySSH can remote into your servers without knowing the passwords. Because of this, you must always remember to lock your desktop screen any time you are away (and make sure to use a strong password). The last thing you want is to have a server vulnerable to unwanted logins.
+
+### Terminator
+
+Terminator is not actually an SSH GUI. Instead, Terminator functions as a single window that allows you to run multiple terminals (and even groups of terminals) at once. Effectively you can open Terminator, split the window vertical and horizontally (until you have all the terminals you want), and then connect to all of your remote Linux servers by way of the standard SSH command (Figure 6).
+
+![Terminator][16]
+
+Figure 6: Terminator split into three different windows, each connecting to a different Linux server.
+
+[Used with permission][5]
+
+To install Terminator, issue a command like:
+
+### sudo apt-get install -y terminator
+
+Once installed, open the tool either from your desktop menu or from the command terminator. With the window opened, you can right-click inside Terminator and select either Split Horizontally or Split Vertically. Continue splitting the terminal until you have exactly the number of terminals you need, and then start remoting into those servers.
+The caveat to using Terminator is that it is not a standard SSH GUI tool, in that it won’t save your sessions or give you quick access to those servers. In other words, you will always have to manually log into your remote Linux servers. However, being able to see your remote Secure Shell sessions side by side does make administering multiple remote machines quite a bit easier.
+
+Few (But Worthwhile) Options
+
+There aren’t a lot of SSH GUI tools available for Linux. Why? Because most administrators prefer to simply open a terminal window and use the standard command-line tools to remotely access their servers. However, if you have a need for a GUI tool, you have two solid options and one terminal that makes logging into multiple machines slightly easier. Although there are only a few options for those looking for an SSH GUI tool, those that are available are certainly worth your time. Give one of these a try and see for yourself.
+
+--------------------------------------------------------------------------------
+
+via: https://www.linux.com/blog/learn/intro-to-linux/2018/11/three-ssh-guis-linux
+
+作者:[Jack Wallen][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.linux.com/users/jlwallen
+[b]: https://github.com/lujun9972
+[1]: https://elementary.io/
+[2]: https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
+[3]: https://www.linux.com/files/images/sshguis1jpg
+[4]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/ssh_guis_1.jpg?itok=DiNTz_wO (PuTTY Connection)
+[5]: https://www.linux.com/licenses/category/used-permission
+[6]: https://www.linux.com/files/images/sshguis2jpg
+[7]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/ssh_guis_2.jpg?itok=4ORsJlz3 (log in)
+[8]: https://github.com/muriloventuroso/easyssh
+[9]: https://www.linux.com/files/images/sshguis3jpg
+[10]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/ssh_guis_3.jpg?itok=bHC2zlda (Adding a connection)
+[11]: https://www.linux.com/files/images/sshguis4jpg
+[12]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/ssh_guis_4.jpg?itok=hhJzhRIg (EasySSH)
+[13]: https://www.linux.com/files/images/sshguis5jpg
+[14]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/ssh_guis_5.jpg?itok=piFEFYTQ (Connecting)
+[15]: https://www.linux.com/files/images/sshguis6jpg
+[16]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/ssh_guis_6.jpg?itok=-kYl6iSE (Terminator)
diff --git a/sources/tech/20181124 14 Best ASCII Games for Linux That are Insanely Good.md b/sources/tech/20181124 14 Best ASCII Games for Linux That are Insanely Good.md
new file mode 100644
index 0000000000..094467698b
--- /dev/null
+++ b/sources/tech/20181124 14 Best ASCII Games for Linux That are Insanely Good.md
@@ -0,0 +1,335 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: subject: (14 Best ASCII Games for Linux That are Insanely Good)
+[#]: via: (https://itsfoss.com/best-ascii-games/)
+[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
+[#]: url: ( )
+
+14 Best ASCII Games for Linux That are Insanely Good
+======
+
+Text-based or should I say [terminal-based games][1] were very popular a decade back – when you didn’t have visual masterpieces like God Of War, Red Dead Redemption 2 or Spiderman.
+
+Of course, the Linux platform has its share of good games – but not always the “latest and greatest”. But, there are some ASCII games out there – to which you can never turn your back on.
+
+I’m not sure if you’d believe me, some of the ASCII games proved to be very addictive (So, it might take a while for me to resume work on the next article, or I might just get fired? – Help me!)
+
+Jokes apart, let us take a look at the best ASCII games.
+
+**Note:** Installing ASCII games could be time-consuming (some might ask you to install additional dependencies or simply won’t work). You might even encounter some ASCII games that require you build from Source. So, we’ve filtered out only the ones that are easy to install/run – without breaking a sweat.
+
+### Things to do before Running or Installing an ASCII Game
+
+Some of the ASCII games might require you to install [Simple DirectMedia Layer][2] unless you already have it installed. So, in case, you should install them first before trying to run any of the games mentioned in this article.
+
+For that, you just need to type in these commands:
+
+```
+sudo apt install libsdl2-2.0
+```
+
+```
+sudo apt install libsdl2_mixer-2.0
+```
+
+
+### Best ASCII Games for Linux
+
+![Best Ascii games for Linux][3]
+
+The games listed are in no particular order of ranking.
+
+#### 1 . [Curse of War][4]
+
+![Curse of War ascii games][5]
+
+Curse of War is an interesting strategy game. You might find it a bit confusing at first but once you get to know it – you’ll love it. I’ll recommend you to take a look at the rules of the game on their [homepage][4] before launching the game.
+
+You will be building infrastructure, secure resources and directing your army to fight. All you have to do is place your flag in a good position to let your army take care of the rest. It’s not just about attacking – you need to manage and secure the resources to help win the fight.
+
+If you’ve never played any ASCII game before, be patient and spend some time learning it – to experience it to its fullest potential.
+
+##### How to install Curse of War?
+
+You will find it in the official repository. So, type in the following command to install it:
+
+```
+sudo apt install curseofwar
+```
+#### 2. ASCII Sector
+
+![ascii sector][6]
+
+Hate strategy games? Fret not, ASCII sector is a game that has a space-setting and lets you explore a lot.
+
+Also, the game isn’t just limited to exploration, you need some action? You got that here as well. Of course, not the best combat experience- but it is fun. It gets even more exciting when you see a variety of bases, missions, and quests. You’ll encounter a leveling system in this tiny game where you have to earn enough money or trade in order upgrade your spaceship.
+
+The best part about this game is – you can create your own quests or play other’s.
+
+###### How to install ASCII Sector?
+
+You need to first download and unpack the archived package from the [official site][7]. After it’s done, open up your terminal and type these commands (replace the **Downloads** folder with your location where the unpacked folder exists, ignore it if the unpacked folder resides inside your home directory):
+
+```
+cd Downloads
+cd asciisec
+chmod +x asciisec
+./asciisec
+```
+
+#### 3. DoomRL
+
+![doom ascii game][8]
+
+You must be knowing the classic game “Doom”. So, if you want the scaled down experience of it as a rogue-like, DoomRL is for you. It is an ASCII-based game, in case you don’t feel like it to be.
+
+It’s a very tiny game with a lot of gameplay hours to have fun with.
+
+###### How to install DoomRL?
+
+Similar to what you did for ASCII Sector, you need to download the official archive from their [download page][9] and then extract it to a folder.
+
+After extracting it, type in these commands:
+
+```
+cd Downloads // navigating to the location where the unpacked folder exists
+```
+
+```
+cd doomrl-linux-x64-0997
+chmod +x doomrl
+./doomrl
+```
+#### 4. Pyramid Builder
+
+![Pyramid Builder ascii game for Linux][10]
+
+Pyramid Builder is an innovative take as an ASCII game where get to improve your civilization by helping build pyramids.
+
+You need to direct the workers to farm, unload the cargo, and move the gigantic stones to successfully build the pyramid.
+
+It is indeed a beautiful ASCII game to download.
+
+###### How to install Pyramid Builder?
+
+Simply head to its official site and download the package to unpack it. After extraction, navigate to the folder and run the executable file.
+
+```
+cd Downloads
+cd pyramid_builder_linux
+chmod +x pyramid_builder_linux.x86_64
+./pyramid_builder_linux.x86_64
+```
+#### 5. DiabloRL
+
+![Diablo ascii RPG game][11]
+
+If you’re an avid gamer, you must have heard about Blizzard’s Diablo 1. It is undoubtedly a good game.
+
+You get the chance to play a unique rendition of the game – which is an ASCII game. DiabloRL is a turn-based rogue-like game that is insanely good. You get to choose from a variety of classes (Warrior, Sorcerer, or Rogue). Every class would result in a different gameplay experience with a set of different stats.
+
+Of course, personal preference will differ – but it’s a decent “unmake” of Diablo. What do you think?
+
+#### 6. Ninvaders
+
+![Ninvaders terminal game for Linux][12]
+
+Ninvaders is one of the best ASCII game just because it’s so simple and an arcade game to kill time.
+
+You have to defend against a hord of invaders – just finish them off before they get to you. It sounds very simple – but it is a challenging game.
+
+##### How to install Ninvaders?
+
+Similar to Curse of War, you can find this in the official repository. So, just type in this command to install it:
+
+```
+sudo apt install ninvaders
+```
+#### 7. Empire
+
+![Empire terminal game][13]
+
+A real-time strategy game for which you will need an active Internet connection. I’m personally not a fan of Real-Time strategy games, but if you are a fan of such games – you should really check out their [guide][14] to play this game – because it can be very challenging to learn.
+
+The rectangle contains cities, land, and water. You need to expand your city with an army, ships, planes and other resources. By expanding quickly, you will be able to capture other cities by destroying them before they make a move.
+
+##### How to install Empire?
+
+Install this is very simple, just type in the following command:
+
+```
+sudo apt install empire
+```
+
+#### 8. Nudoku
+
+![Nudoku is a terminal version game of Sudoku][15]
+
+Love Sudoku? Well, you have Nudoku – a clone for it. A perfect time-killing ASCII game while you relax.
+
+It presents you with three difficulty levels – Easy, normal, and hard. If you want to put up a challenge with the computer, the hard difficulty will be perfect! If you just want to chill, go for the easy one.
+
+##### How to install Nudoku?
+
+It’s very easy to get it installed, just type in the following command in the terminal:
+
+```
+sudo apt install nudoku
+```
+
+#### 9\. Nethack
+
+A dungeons and dragon-style ASCII game which is one of the best out there. I believe it’s one of your favorites if you already knew about ASCII games for Linux – in general.
+
+It features a lot of different levels (about 45) and comes packed in with a bunch of weapons, scrolls, potions, armor, rings, and gems. You can also choose permadeath as your mode to play it.
+
+It’s not just about killing here – you got a lot to explore.
+
+##### How to install Nethack?
+
+Simply follow the command below to install it:
+
+```
+sudo apt install nethack
+```
+
+#### 10. ASCII Jump
+
+![ascii jump game][16]
+
+ASCII Jump is a dead simple game where you have to slide along a varierty of tracks – while jumping, changing position, and moving as long as you can to cover maximum distance.
+
+It’s really amazing to see how this ASCII game looks like (visually) even it seems so simple. You can start with the training mode and then proceed to the world cup. You also get to choose your competitors and the hills on which you want to start the game.
+
+##### How to install Ascii Jump?
+
+To install the game, just type the following command:
+
+```
+sudo apt install asciijump
+```
+
+#### 11. Bastet
+
+![Bastet is tetris game in ascii form][17]
+
+Let’s just not pay any attention to the name – it’s actually a fun clone of Tetris game.
+
+You shouldn’t expect it to be just another ordinary tetris game – but it will present you the worst possible bricks to play with. Have fun!
+
+##### How to install Bastet?
+
+Open the terminal and type in the following command:
+
+```
+sudo apt install bastet
+```
+
+#### 12\. Bombardier
+
+![Bomabrdier game in ascii form][18]
+
+Bombardier is yet another simple ASCII game which will keep you hooked on to it.
+
+Here, you have a helicopter (or whatever you’d like to call your aircraft) which lowers down every cycle and you need to throw bombs in order to destroy the blocks/buildings under you. The game also puts a pinch of humor for the messages it displays when you destroy a block. It is fun.
+
+##### How to install Bombardier?
+
+Bombardier is available in the official repository, so just type in the following in the terminal to install it:
+
+```
+sudo apt install bombardier
+```
+
+#### 13\. Angband
+
+![Angband ascii game][19]
+
+A cool dungeon exploration game with a neat interface. You can see all the vital information in a single screen while you explore the game.
+
+It contains different kinds of race to pick a character. You can either be an Elf, Hobbit, Dwarf or something else – there’s nearly a dozen to choose from. Remember, that you need to defeat the lord of darkness at the end – so make every upgrade possible to your weapon and get ready.
+
+How to install Angband?
+
+Simply type in the following command:
+
+```
+sudo apt install angband
+```
+
+#### 14\. GNU Chess
+
+![GNU Chess is a chess game that you can play in Linux terminal][20]
+
+How can you not play chess? It is my favorite strategy game!
+
+But, GNU Chess can be tough to play with unless you know the Algebraic notation to describe the next move. Of course, being an ASCII game – it isn’t quite possible to interact – so it asks you the notation to detect your move and displays the output (while it waits for the computer to think its next move).
+
+##### How to install GNU Chess?
+
+If you’re aware of the algebraic notations of Chess, enter the following command to install it from the terminal:
+
+```
+sudo apt install gnuchess
+```
+
+#### Some Honorable Mentions
+
+As I mentioned earlier, we’ve tried to recommend you the best (but also the ones that are the easiest to install on your Linux machine).
+
+However, there are some iconic ASCII games which deserve the attention and requires a tad more effort to install (You will get the source code and you need to build it / install it).
+
+Some of those games are:
+
++ [Cataclysm: Dark Days Ahead][22]
++ [Brogue][23]
++ [Dwarf Fortress][24]
+
+You should follow our [guide to install software from source code][21].
+
+### Wrapping Up
+
+Which of the ASCII games mentioned seem perfect for you? Did we miss any of your favorites?
+
+Let us know your thoughts in the comments below.
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/best-ascii-games/
+
+作者:[Ankush Das][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/ankush/
+[b]: https://github.com/lujun9972
+[1]: https://itsfoss.com/best-command-line-games-linux/
+[2]: https://www.libsdl.org/
+[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2018/11/best-ascii-games-featured.png?resize=800%2C450&ssl=1
+[4]: http://a-nikolaev.github.io/curseofwar/
+[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/11/curseofwar-ascii-game.jpg?fit=800%2C479&ssl=1
+[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2018/11/ascii-sector-game.jpg?fit=800%2C424&ssl=1
+[7]: http://www.asciisector.net/download/
+[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2018/11/doom-rl-ascii-game.jpg?ssl=1
+[9]: https://drl.chaosforge.org/downloads
+[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2018/11/pyramid-builder-ascii-game.jpg?fit=800%2C509&ssl=1
+[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2018/11/diablo-rl-ascii-game.jpg?ssl=1
+[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2018/11/ninvaders-ascii-game.jpg?fit=800%2C426&ssl=1
+[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2018/11/empire-ascii-game.jpg?fit=800%2C570&ssl=1
+[14]: http://www.wolfpackempire.com/infopages/Guide.html
+[15]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/11/nudoku-ascii-game.jpg?fit=800%2C434&ssl=1
+[16]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/11/ascii-jump.jpg?fit=800%2C566&ssl=1
+[17]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2018/11/bastet-tetris-clone-ascii.jpg?fit=800%2C465&ssl=1
+[18]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/11/bombardier.jpg?fit=800%2C571&ssl=1
+[19]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2018/11/angband-ascii-game.jpg?ssl=1
+[20]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2018/11/gnuchess-ascii-game.jpg?ssl=1
+[21]: https://itsfoss.com/install-software-from-source-code/
+[22]: https://github.com/CleverRaven/Cataclysm-DDA
+[23]: https://sites.google.com/site/broguegame/
+[24]: http://www.bay12games.com/dwarves/index.html
+
diff --git a/sources/tech/20181124 How To Configure IP Address In Ubuntu 18.04 LTS.md b/sources/tech/20181124 How To Configure IP Address In Ubuntu 18.04 LTS.md
new file mode 100644
index 0000000000..b1ba4ebd97
--- /dev/null
+++ b/sources/tech/20181124 How To Configure IP Address In Ubuntu 18.04 LTS.md
@@ -0,0 +1,144 @@
+[#]: collector: (lujun9972)
+[#]: translator: (chenxinlong)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: subject: (How To Configure IP Address In Ubuntu 18.04 LTS)
+[#]: via: (https://www.ostechnix.com/how-to-configure-ip-address-in-ubuntu-18-04-lts/)
+[#]: author: (SK https://www.ostechnix.com/author/sk/)
+[#]: url: ( )
+
+翻译中 ...
+
+How To Configure IP Address In Ubuntu 18.04 LTS
+======
+
+
+
+The method of configuring IP address on Ubuntu 18.04 LTS is significantly different than the older methods. Unlike the previous versions, the Ubuntu 18.04 uses **Netplan** , a new command line network configuration utility, to configure IP address. Netplan has been introduced by Ubuntu developers in Ubuntu 17.10. In this new approach, we no longer use **/etc/network/interfaces** file to configure IP address rather we use a YAML file. The default configuration files of Netplan are found under **/etc/netplan/** directory. In this brief tutorial, we are going to learn to configure static and dynamic IP address in **Ubuntu 18.04 LTS** minimal server.
+
+### Configure Static IP Address In Ubuntu 18.04 LTS
+
+Let us find out the default network configuration file:
+
+```
+$ ls /etc/netplan/
+50-cloud-init.yaml
+```
+
+As you can see, the default network configuration file is **50-cloud-init.yaml** and it is obviously a YAML file.
+
+Now, let check the contents of this file:
+
+```
+$ cat /etc/netplan/50-cloud-init.yaml
+```
+
+I have configured my network card to obtain IP address from the DHCP server when I am installing Ubuntu 18.04, so here is my network configuration details:
+
+
+
+As you can see, I have two network cards, namely **enp0s3** and **enp0s8** , and both are configured to accept IPs from the DHCP server.
+
+Let us now configure static IP addresses to both network cards.
+
+To do so, open the default network configuration file in any editor of your choice.
+
+```
+$ sudo nano /etc/netplan/50-cloud-init.yaml
+```
+
+Now, update the file by adding the IP address, netmask, gateway and DNS server. For the purpose of this file, I have used **192.168.225.50** as my IP for **enp0s3** and **192.168.225.51** for **enp0s8** , **192.168.225.1** as gateway, **255.255.255.0** as netwmask and **8.8.8.8** , **8.8.4.4** as DNS servers.
+
+
+
+Please mind the space between the lines. Don’t use **TAB** to align the lines as it will not work in Ubuntu 18.04. Instead, just use SPACEBAR key to make them in a consistent order as shown in the above picture.
+
+Also, we don’t use a separate line to define netmask (255.255.255.0) in Ubuntu 18.04. For instance, in older Ubuntu versions, we configure IP and netmask like below:
+
+```
+address = 192.168.225.50
+netmask = 255.255.255.0
+```
+
+However, with netplan, we combine those two lines with a single line as shown below:
+
+```
+addresses : [192.168.225.50/24]
+```
+
+Once you’re done, Save and close the file.
+
+Apply the network configuration using command:
+
+```
+$ sudo netplan apply
+```
+
+If there are any issues, run the following command to investigate and check what is the problem in the configuration.
+
+```
+$ sudo netplan --debug apply
+```
+
+Output:
+
+```
+** (generate:1556): DEBUG: 09:14:47.220: Processing input file //etc/netplan/50-cloud-init.yaml..
+** (generate:1556): DEBUG: 09:14:47.221: starting new processing pass
+** (generate:1556): DEBUG: 09:14:47.221: enp0s8: setting default backend to 1
+** (generate:1556): DEBUG: 09:14:47.222: enp0s3: setting default backend to 1
+** (generate:1556): DEBUG: 09:14:47.222: Generating output files..
+** (generate:1556): DEBUG: 09:14:47.223: NetworkManager: definition enp0s8 is not for us (backend 1)
+** (generate:1556): DEBUG: 09:14:47.223: NetworkManager: definition enp0s3 is not for us (backend 1)
+DEBUG:netplan generated networkd configuration exists, restarting networkd
+DEBUG:no netplan generated NM configuration exists
+DEBUG:device enp0s3 operstate is up, not replugging
+DEBUG:netplan triggering .link rules for enp0s3
+DEBUG:device lo operstate is unknown, not replugging
+DEBUG:netplan triggering .link rules for lo
+DEBUG:device enp0s8 operstate is up, not replugging
+DEBUG:netplan triggering .link rules for enp0s8
+```
+
+Now, let us check the Ip address using command:
+
+```
+$ ip addr
+```
+
+Sample output from my Ubuntu 18.04 LTS:
+
+
+Congratulations! We have successfully configured static IP address in Ubuntu 18.04 LTS with Netplan configuration tool.
+
+For more details, refer the Netplan man pages.
+
+```
+$ man netplan
+```
+
+### Configure Dynamic IP Address In Ubuntu 18.04 LTS
+
+To configure dynamic address, just leave the default configuration file as the way it is. If you already have configured static IP address, just remove the newly added lines and make the YAML file look like exactly as shown in the **figure 1** in the previous section.
+
+That’s all. You know now how to configure static and dynamic IP in Ubuntu 18.04 LTS server. Personally, I don’t like this new method. The old method is much easier and better. How about you? Did you find it easy or hard? Let me know in the comment section below.
+
+More good stuffs to come. Stay tuned!
+
+Cheers!
+
+
+
+--------------------------------------------------------------------------------
+
+via: https://www.ostechnix.com/how-to-configure-ip-address-in-ubuntu-18-04-lts/
+
+作者:[SK][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.ostechnix.com/author/sk/
+[b]: https://github.com/lujun9972
diff --git a/sources/tech/20181126 How to use the sudo command to deploy superuser powers on Linux.md b/sources/tech/20181126 How to use the sudo command to deploy superuser powers on Linux.md
new file mode 100644
index 0000000000..322bb8f303
--- /dev/null
+++ b/sources/tech/20181126 How to use the sudo command to deploy superuser powers on Linux.md
@@ -0,0 +1,173 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: subject: (How to use the sudo command to deploy superuser powers on Linux)
+[#]: via: (https://www.networkworld.com/article/3322504/linux/selectively-deploying-your-superpowers-on-linux.html)
+[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
+[#]: url: ( )
+
+How to use the sudo command to deploy superuser powers on Linux
+======
+
+
+
+The **sudo** command is very handy when you need to run occasional commands with superuser power, but you can sometimes run into problems when it doesn’t do everything you expect it should. Say you want to add an important message at the end of some log file and you try something like this:
+
+```
+$ echo "Important note" >> /var/log/somelog
+-bash: /var/log/somelog: Permission denied
+```
+
+OK, it looks like you need to employ some extra privilege. In general, you can't write to a system log file with your user account. Let’s try that again with **sudo**.
+
+```
+$ sudo !!
+sudo echo "Important note" >> /var/log/somelog
+-bash: /var/log/somelog: Permission denied
+```
+
+Hmm, that didn't work either. Let's try something a little different.
+
+```
+$ sudo 'echo "Important note" >> /var/log/somelog'
+sudo: echo "Important note" >> /var/log/somelog: command not found
+```
+
+**[ Also see:[Invaluable tips and tricks for troubleshooting Linux][1] ]**
+
+### What's going on here?
+
+The response to the first of the commands shown above indicates that you lack the required privilege to write to the log file. In the second, you have simply tried to run the previously entered command with root privilege, but that resulted in a **Permission denied** error. In the third, you've tried to rerun the command by putting the entire command in quotes and ran into a **command not found** error. So, what went wrong?
+
+ * First command: You can’t write to that log without root privilege.
+ * Second command: Your superpowers don't extend to the redirect.
+ * Third command: Sudo doesn’t recognize everything you’ve put into the quotes as a "command."
+
+
+
+And if you had tried to use sudo when you had no sudo access at all, you would have seen an error like this:
+
+```
+nemo is not in the sudoers file. This incident will be reported.
+```
+
+### What can you do?
+
+One fairly simple option is to use the sudo command to briefly become root. Given you have sudo privileges, you might be able to do that with a command like this one:
+
+```
+$ sudo su
+[sudo] password for nemo:
+#
+```
+
+Notice that the prompt has changed to indicate your new authority. Then you can run the original command as root:
+
+```
+# echo "Important note" >> /var/log/somelog
+```
+
+And then you can enter **^d** and go back to being yourself. Of course, some sudo configurations might prevent you from using sudo to become root.
+
+Another option is to switch user to root with just the **su** command, but that requires knowing the root password. Many people will be given access to sudo without being provided with the root password, so this won't always work.
+
+If you switch user to root, you can then run commands as root to your heart’s content. The problems with this approach are 1) everyone exercising root privilege will have to know the root password (not very secure) and 2) you won't be protected from the repercussions of making big mistakes if you fail to exit your privileged status after you run the specific commands that require root privilege. The sudo command is intended to allow you to use root privilege _only_ when you really need it and to control how much of root’s power each sudo user ought to have. It’s also intended to easily revert to having you working in your normal user state.
+
+Note also that this entire discussion is predicated on the assumption that you have access to sudo and that your access is not narrowly defined. More on that in a moment.
+
+Another option is to use a different command. If adding to a file by editing it is an option, you might use a command such as "sudo vi /var/log/somelog", though editing an active log file isn't generally a good idea because of how frequently the system might need to write to it.
+
+A final but more complex option is to use one of the following commands that get around the problems we saw earlier, but they involve more complex syntax. The first command allows you to repeat your command using !! after getting the "Permission denied" rejection:
+
+```
+$ sudo echo "Important note" >> /var/log/somelog
+-bash: /var/log/somelog: Permission denied
+$ !!:gs/>/|sudo tee -a / <=====
+$ tail -1 /var/log/somelog
+Important note
+```
+
+The second allows you to add your message by passing your message to **tee** using the sudo command. Note that the **-a** specifies that the text should be appended to the file:
+
+```
+$ echo "Important note" | sudo tee -a /var/log/somelog
+$ tail -1 /var/log/somelog
+Important note
+```
+
+### How controllable is sudo?
+
+The quick answer to this question is that it depends on the person administering it. Most Linux systems default to a very simple setup. If a user is assigned to a particular group, which might be called **wheel** or **admin** , that user will have the ability to run any command as root without having to know the root password. This is the default setup on most Linux systems. Once a user is added to the privileged group in the **/etc/group** file, that person can run any command with root privilege. On the other hand, sudo can be set up so that some users can only run a single command or any in a set of commands as root and nothing more.
+
+If lines like those shown below were added to the **/etc/sudoers** file, for example, the user "nemo" would be allowed to run the **whoami** command with root authority. While this might not make any sense in the "real world," it works fairly well as an example.
+
+```
+# User alias specification
+nemo ALL=(root) NOPASSWD: WHOAMI
+
+# Cmnd alias specification
+Cmnd_Alias WHOAMI = /usr/bin/whoami
+```
+
+Note that we've added both a command alias (Cmnd_Alias) that specifies the command that can be run — with their full paths — and a user alias that allows that user to run that single command with sudo without even entering a password.
+
+When nemo runs the command **sudo whoami** , he will see this:
+
+```
+$ sudo whoami
+root
+```
+
+Notice that, since nemo is running the command using sudo, the response to **whoami** shows that when the command is running, the user is **root**.
+
+For other commands, nemo will see something like this:
+
+```
+$ sudo date
+[sudo] password for nemo:
+Sorry, user nemo is not allowed to execute '/bin/date' as root on butterfly.
+```
+
+### Default sudo setup
+
+In the default approach, we'd be taking advantage of a line like one of those shown below from the **/etc/sudoers** file:
+
+```
+$ sudo egrep "admin|sudo" /etc/sudoers
+# Members of the admin group may gain root privileges
+%admin ALL=(ALL) ALL <=====
+# Allow members of group sudo to execute any command
+%sudo ALL=(ALL:ALL) ALL <=====
+```
+
+In these lines, **%admin** and **%sudo** both refer to groups that permit anyone added to one of these groups to run any command as root using the sudo command.
+
+A line like the one shown below from the /etc/group file makes the individuals listed members of the group, thereby giving them sudo privileges without any changes required in the /etc/sudoers file.
+
+```
+sudo:x:27:shs,nemo
+```
+
+### Wrap-up
+
+The sudo command is meant to allow you to easily deploy superuser access on an as-needed basis, but also to endow users with very limited privileged access when that's all that is required. You can run into problems that require a different approach than a simple "sudo command," and the responses that you get from **sudo** should indicate what problem you've run into.
+
+Join the Network World communities on [Facebook][2] and [LinkedIn][3] to comment on topics that are top of mind.
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3322504/linux/selectively-deploying-your-superpowers-on-linux.html
+
+作者:[Sandra Henry-Stocker][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/
+[b]: https://github.com/lujun9972
+[1]: https://www.networkworld.com/article/3242170/linux/invaluable-tips-and-tricks-for-troubleshooting-linux.html
+[2]: https://www.facebook.com/NetworkWorld/
+[3]: https://www.linkedin.com/company/network-world
diff --git a/sources/tech/20181128 Building custom documentation workflows with Sphinx.md b/sources/tech/20181128 Building custom documentation workflows with Sphinx.md
new file mode 100644
index 0000000000..7d9137fa40
--- /dev/null
+++ b/sources/tech/20181128 Building custom documentation workflows with Sphinx.md
@@ -0,0 +1,126 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: subject: (Building custom documentation workflows with Sphinx)
+[#]: via: (https://opensource.com/article/18/11/building-custom-workflows-sphinx)
+[#]: author: ([Mark Meyer](https://opensource.com/users/ofosos))
+[#]: url: ( )
+
+Building custom documentation workflows with Sphinx
+======
+Create documentation the way that works best for you.
+
+
+[Sphinx][1] is a popular application for creating documentation, similar to JavaDoc or Jekyll. However, Sphinx's reStructured Text input allows for a higher degree of customization than those other tools.
+
+This tutorial will explain how to customize Sphinx to suit your workflow. You can follow along using sample code on [GitHub][2].
+
+### Some definitions
+
+Sphinx goes far beyond just enabling you to style text with predefined tags. It allows you to shape and automate your documentation by defining new roles and directives. A role is a single word element that usually is rendered inline in your documentation, while a directive can contain more complex content. These can be contained in a domain.
+
+A Sphinx domain is a collection of directives and roles as well as a few other things, such as an index definition. Your next Sphinx domain could be a specific programming language (Sphinx was developed to create Python's documentation). Or you might have a command line tool that implements the same command pattern (e.g., **tool \--args**) over and over. You can document it with a custom domain, adding directives and indexes along the way.
+
+Here's an example from our **recipe** domain:
+
+```
+The recipe contains `tomato` and `cilantro`.
+
+.. rcp:recipe:: TomatoSoup
+ :contains: tomato cilantro salt pepper
+
+ This recipe is a tasty tomato soup, combine all ingredients
+ and cook.
+```
+
+Now that we've defined the recipe **TomatoSoup** , we can reference it anywhere in our documentation using the custom role **refef**. For example:
+
+```
+You can use the :rcp:reref:`TomatoSoup` recipe to feed your family.
+```
+
+This enables our recipes to show up in two indices: the first lists all recipes, and the second lists all recipes by ingredient.
+
+### What's in a domain?
+
+A Sphinx domain is a specialized container that ties together roles, directives, and indices, among other things. The domain has a name ( **rcp** ) to address its components in the documentation source. It announces its existence to Sphinx in the **setup()** method of the package. From there, Sphinx can find roles and directives, since these are part of the domain.
+
+This domain also serves as the central catalog of objects in this sample. Using initial data, it defines two variables, **objects** and **obj2ingredient**. These contain a list of all objects defined (all recipes) and a hash that maps a canonical ingredient name to the list of objects.
+
+```
+initial_data = {
+ 'objects': [], # object list
+ 'obj2ingredient': {}, # ingredient -> [objects]
+}
+```
+
+The way we name objects is common across our extension. For each object created, the canonical name is **rcp. .**, where **< typename>** is the Python type of the object, and **< objectname>** is the name the documentation writer gives the object. This enables the extension to use different object types that share the same name.
+
+Having a canonical name and central place for our objects is a huge advantage. Both our indices and our cross-referencing code use this feature.
+
+### Custom roles and directives
+
+In our example, **.. rcp:recipe::** indicates a custom directive. You might think it's overly specific to create custom syntax for these items, but it illustrates the degree of customization you can get in Sphinx. This provides rich markup that structures documents and leads to better docs. Specialization allows us to extract information from our docs.
+
+Our definition for this directive will provide minimal formatting, but it will be functional.
+
+```
+class RecipeNode(ObjectDescription):
+ """A custom node that describes a recipe."""
+
+ required_arguments = 1
+
+ option_spec = {
+ 'contains': rst.directives.unchanged_required
+ }
+```
+
+For this directive, **required_arguments** tells Sphinx to expect one parameter, the recipe name. **option_spec** lists the optional arguments, including their names. Finally, **has_content** specifies that there will be more reStructured Text as a child to this node.
+
+We also implement multiple methods:
+
+ * **handle_signature()** implements parsing the signature of the directive and passes on the object's name and type to its superclass
+ * **add_taget_and_index()** adds a target (to link to) and an entry to the index for this node
+
+
+
+### Creating indices
+
+Both **IngredientIndex** and **RecipeIndex** are derived from Sphinx's **Index** class. They implement custom logic to generate a tuple of values that define the index. Note that **RecipeIndex** is a degenerate index that has only one entry. Extending it to cover more object types—and moving from a **RecipeDomain** to a **CookbookDomain** —is not yet part of the code.
+
+Both indices use the method **generate()** to do their work. This method combines the information from our domain, sorts it, and returns it in a list structure that will be accepted by Sphinx. See the [Sphinx Domain API][3] page for more information.
+
+The first time you visit the Domain API page, you may be a little overwhelmed by the structure. But our ingredient index is just a list of tuples, like **('tomato', 'TomatoSoup', 'test', 'rec-TomatoSoup',...)**.
+
+### Referencing recipes
+
+Adding cross-references is not difficult (but it's also not a given). Add an **XRefRole** to the domain and implement the method **resolve_xref()**. Having a custom role to reference a type allows us to unambiguously reference any object, even if two objects have the same name. If you look at the parameters of **resolve_xref()** in **Domain** , you'll see **typ** and **target**. These define the cross-reference type and its target name. We'll use **target** to resolve our destination from our domain's **objects** because we currently have only one type of node.
+
+We can add the cross-reference role to **RecipeDomain** in the following way:
+
+```
+roles = {
+ 'reref': XRefRole()
+}
+```
+
+There's nothing for us to implement. Defining a working **resolve_xref()** and attaching an **XRefRole** to the domain is all you need to do.
+
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/11/building-custom-workflows-sphinx
+
+作者:[Mark Meyer][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/ofosos
+[b]: https://github.com/lujun9972
+[1]: http://www.sphinx-doc.org/en/master/
+[2]: https://github.com/ofosos/sphinxrecipes
+[3]: https://www.sphinx-doc.org/en/master/extdev/domainapi.html#sphinx.domains.Index.generate
diff --git a/sources/tech/20181128 OpenSnitch - an Application Firewall for Linux -Review.md b/sources/tech/20181128 OpenSnitch - an Application Firewall for Linux -Review.md
new file mode 100644
index 0000000000..2a1602a6bb
--- /dev/null
+++ b/sources/tech/20181128 OpenSnitch - an Application Firewall for Linux -Review.md
@@ -0,0 +1,145 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: subject: (OpenSnitch – an Application Firewall for Linux [Review])
+[#]: via: (https://itsfoss.com/opensnitch-firewall-linux/)
+[#]: author: ([John Paul](https://itsfoss.com/author/john/))
+[#]: url: ( )
+
+OpenSnitch – an Application Firewall for Linux [Review]
+======
+
+Just because Linux is a lot more secure than Windows, there is no reason you should not be cautious. There are a number of firewalls available for Linux that you can use to make your Linux system more secure. Today we will be taking a look at one of such firewall tool called OpenSnitch.
+
+### What is OpenSnitch?
+
+![Linux firewall and security][1]
+
+[OpenSnitch][2] is a port of Little Snitch. Little Snitch, in turn, is an application firewall designed solely for Mac OS. OpenSnitch is created by [Simone Margaritelli][3], also known as [evilsocket][4].
+
+The main thing that OpenSnitch does is track internet requests made by applications you have installed. OpenSnitch allows you to create rules for which apps to allow to access the internet and which to block. Each time an application that does not have a rule in place tries to access the internet, a dialog box appears. This dialog box gives you the option to allow or block the connection.
+
+You can also decide whether this new rule applies to the process, the exact URL it is attempting to reach, the domain that it is attempting to reach, to this single instance, to this session or forever.
+
+![OpenSnitch firewall app in Linux][5]OpenSnatch rule request
+
+All of the rules that you create are stored as [JSON files][6] so you can change them later if you need to. For example, if you incorrectly blocked an application.
+
+OpenSnitch also has a nice graphical user interface that lets you see at a glance:
+
+ * What applications are accessing the web
+ * What IP address they are using
+ * What User owns it
+ * What port is being used
+
+
+
+You can also export the information to a CSV file if you wish.
+
+OpenSnitch is available under the GPL v3 license.
+
+![OpenSnitch firewall interface][7]OpenSnitch processes tab
+
+### Installing OpenSnitch in Linux
+
+The installation instructions on the [OpenSnitch GitHub page][8] are aimed at Ubuntu users. If you are using another distro, you will have to adjust the commands. As far as I know, this application is only packaged in the [Arch User Repository][9].
+
+Before you start, you need to have Go properly installed and the `$GOPATH` environment variable is defined.
+
+First, install the necessary dependencies.
+
+```
+sudo apt-get install protobuf-compiler libpcap-dev libnetfilter-queue-dev python3-pip
+
+go get github.com/golang/protobuf/protoc-gen-go
+
+go get -u github.com/golang/dep/cmd/dep
+
+python3 -m pip install --user grpcio-tools
+```
+
+Next, you will need to clone the OpenSnitch repo. There will probably be a message that no Go files where found. Ignore it. If you get a message that git is missing, just install it.
+
+```
+go get github.com/evilsocket/opensnitch
+
+cd $GOPATH/src/github.com/evilsocket/opensnitch
+```
+
+If the `$GOPATH` environment variable is not setup correctly, you will get a “no such folder found” error on the previous command. just `cd` into the location of the “evilsocket/opensnitch” folder that was listed when you cloned it to your system.
+
+Now, we build and install it.
+
+```
+make
+
+sudo make install
+```
+
+If you get an error that the `dep` command could not be found, add `GOPATH/bin` is in the `PATH`.
+
+Once that is finished, we will initiate the daemon and start the graphical user environment.
+
+```
+sudo systemctl enable opensnitchd
+
+sudo service opensnitchd start
+
+opensnitch-ui
+```
+
+![OpenSnitch firewall interface][10]OpenSnitch on Manjaro
+
+### Experience
+
+I’ll be honest: my experience with OpenSnitch was not great. I started by trying to install it on Fedora. I had trouble finding some of the dependencies. I switched over to Manjaro and was happy to find it in the Arch User Repository.
+
+Unfortunately, after I ran the installation, I could not launch the graphical user interface. So I ran the last three steps by hand. Everything seemed to be working fine. The dialog box popped up asking me if I wanted to let Firefox visit the Manjaro website.
+
+Interestingly, when I ran an [AUR tool][11] `yay` to update my system, the dialog box requested rules for `yay`, `pacman`, `pamac`, and `git`. Later, I had to close and restart the GUI because it was acting up. When I restart it, it stopped asking me to create rules. I installed Falkon and OpenSnitch did not ask me to give it any permissions. It did not even list Falkon in the OpenSnithch GUI. I reinstalled OpenSnitch. Same issue.
+
+Then I moved to Ubuntu Mate. Since the installation instructions were written for Ubuntu, things went easier. However, I ran into a couple issues. I tweaked the installation instructions above to fix the problems I encountered.
+
+Installation was not the only issue that I ran into. The dialog box that appeared every time a new app created a connection only lasted for 10 seconds. That was barely enough time to explore the available options. Most of the time, I only had time to allow an application (only the ones I trust) to access the web forever.
+
+The GUI also left a bit to be desired. For some reason, the window was set to be on top all of the time. On top of that, there are no setting to change it. It would also have been nice to have the option to change rules from the GUI.
+
+![][12]OpenSnitch hosts tab
+
+### Final Thoughts on OpenSnitch
+
+I like what OpenSnitch is aiming for: any easy way to control what information leaves your computer. However, it has too many rough edges for me to recommend it to a regular or hobby user. If you are a power user, who likes to tinker and dig for answers then maybe this is for you.
+
+It’s kinda disappointing. I would have hoped that an application that recently hit 1.0 would be in a little better shape.
+
+Have you ever used OpenSnitch? If not, what is your favorite firewall app? How do you make your Linux system more secure? Let us know in the comments below.
+
+If you found this article interesting, please take a minute to share it on social media, Hacker News or [Reddit][13].
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/opensnitch-firewall-linux/
+
+作者:[John Paul][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/john/
+[b]: https://github.com/lujun9972
+[1]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2018/11/linux-firewall-security.jpg?fit=800%2C450&ssl=1
+[2]: https://www.opensnitch.io/
+[3]: https://github.com/evilsocket
+[4]: https://twitter.com/evilsocket
+[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2018/11/opensnitch-dialog.jpg?fit=800%2C421&ssl=1
+[6]: https://www.json.org/
+[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2018/11/opensnitch-processes.jpg?fit=800%2C651&ssl=1
+[8]: https://github.com/evilsocket/opensnitch
+[9]: https://aur.archlinux.org/packages/opensnitch-git
+[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2018/11/opensnitch-manjaro.jpg?fit=800%2C651&ssl=1
+[11]: https://itsfoss.com/best-aur-helpers/
+[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/11/opensnitch-hosts.jpg?fit=800%2C651&ssl=1
+[13]: http://reddit.com/r/linuxusersgroup
diff --git a/sources/tech/20181128 Turn an old Linux desktop into a home media center.md b/sources/tech/20181128 Turn an old Linux desktop into a home media center.md
new file mode 100644
index 0000000000..f87750b513
--- /dev/null
+++ b/sources/tech/20181128 Turn an old Linux desktop into a home media center.md
@@ -0,0 +1,87 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: subject: (Turn an old Linux desktop into a home media center)
+[#]: via: (https://opensource.com/article/18/11/old-linux-desktop-new-home-media-center)
+[#]: author: ([Alan Formy-Duval](https://opensource.com/users/alanfdoss))
+[#]: url: ( )
+
+Turn an old Linux desktop into a home media center
+======
+Repurpose an outdated computer to browse the internet and watch videos on your big screen TV.
+
+
+My first attempt to set up an "entertainment PC" was back in the late 1990s, using a plain old desktop computer with a Trident ProVidia 9685 PCI graphics card. I used what was known as a "TV-out" card, which had an extra output to connect to a standard television set. The onscreen result didn't look very nice and there was no audio output. And it was ugly: I had an S-Video cable running across my living room floor to my 19" Sony Trinitron CRT TV set.
+
+I had the same sad result from Linux and Windows 98. After struggling with systems that never looked right, I gave up for a few years. Thankfully, today we have HDMI with its vastly better performance and standardized resolution, which makes an inexpensive home media center a reality.
+
+My new media center entertainment computer is actually my old Ubuntu Linux desktop, which I recently replaced with something faster. The computer became too slow for work, but its AMD Phenom II X4 965 processor at 3.4GHz and 8GB of RAM are good enough for general browsing and video streaming.
+
+Here are the steps I took to get the best possible performance out of this old system for its new role.
+
+### Hardware
+
+First, I removed unnecessary devices including a card reader, hard drives, DVD drive, and a rear-mounted USB card, and I added a PCI-Express WiFi card. I installed Ubuntu to a single solid-state drive (SSD), which can really improve the performance of any older system.
+
+### BIOS
+
+In the BIOS, I disabled all unused devices, such as floppy and IDE drive controllers. I disabled onboard video because I installed an NVidia GeForce GTX 650 PCI Express graphics card with an HDMI output. I also disabled onboard audio because the NVidia graphics card chipset provides audio.
+
+### Audio
+
+The Nvidia GeForce GTX audio device is listed in the GNOME Control Center's sound settings as a GK107 HDMI Audio Controller, so a single HDMI cable handles both audio and video. There's no need for an audio cable connected to the onboard audio output jack.
+
+![Sound settings screenshot][2]
+
+HDMI audio controller shown in GNOME sound settings.
+
+### Keyboard and mouse
+
+I have a wireless keyboard and mouse, both from Logitech. When I installed them, I plugged in both peripherals' USB receivers; they worked, but I often had signal-response problems. Then I discovered one was labeled a Unifying Receiver, which meant it can handle multiple Logitech input devices on its own. Logitech doesn't provide software to configure Unifying Receivers in Linux; fortunately, the open source utility [Solaar][3] does. Using a single receiver solved my input performance issues.
+
+![Solaar][5]
+
+Solaar Unifying Receiver interface.
+
+### Video
+
+It was initially hard to read fonts on my 47" flat-panel TV, so I enabled "Large Text" under Universal Access. I downloaded some wallpapers matching the TV's 1920x1080 resolution that look fantastic!
+
+### Final touches
+
+I needed to balance the computer's cooling needs with my desire for unimpeded entertainment. Since this is a standard ATX mini-tower computer, I made sure I had just enough fans with carefully configured temperature settings in the BIOS to reduce fan noise. I also placed the computer behind my entertainment console to further block fan noise but positioned so I can reach the power button.
+
+The result is a simple machine that is not overly loud and uses only two cables—AC power and HDMI. It should be able to run any mainstream or specialized media center Linux distribution. I don't expect to do too much high-end gaming because that may require more processing horsepower.
+
+![Showing Ubuntu Linux About page onscreen][7]
+
+Ubuntu Linux About page.
+
+![YouTube on the big screen][9]
+
+Testing a YouTube video on the big screen.
+
+I haven't yet installed a dedicated media center distribution of Linux like [Kodi][10]. For now, it is running Ubuntu Linux 18.04.1 LTS and is very stable.
+
+This was a fun challenge to make the best of what I already had rather than buying new hardware. This is just one benefit of open source software. Eventually, I will probably replace it with a smaller, quieter system with a media-center case or another small box, but for now, it meets my needs quite well.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/11/old-linux-desktop-new-home-media-center
+
+作者:[Alan Formy-Duval][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/alanfdoss
+[b]: https://github.com/lujun9972
+[2]: https://opensource.com/sites/default/files/uploads/soundsettings.png (Sound settings screenshot)
+[3]: https://pwr.github.io/Solaar/
+[5]: https://opensource.com/sites/default/files/uploads/solaar_interface.png (Solaar)
+[7]: https://opensource.com/sites/default/files/uploads/finalresult1.png (Showing Ubuntu Linux About page onscreen)
+[9]: https://opensource.com/sites/default/files/uploads/finalresult2.png (YouTube on the big screen)
+[10]: https://kodi.tv/
diff --git a/translated/talk/20180409 5 steps to building a cloud that meets your users- needs.md b/translated/talk/20180409 5 steps to building a cloud that meets your users- needs.md
new file mode 100644
index 0000000000..09ac1aced2
--- /dev/null
+++ b/translated/talk/20180409 5 steps to building a cloud that meets your users- needs.md
@@ -0,0 +1,108 @@
+
+构建满足客户需求的一套云环境的5个步骤
+======
+
+
+这篇文是和[Ian Teksbury][1]共同完成的。
+
+无论你如何定义,云就是你的用户展现组织价值的另一个工具。当谈论新的范例或者技术的时候是很容易被,(云是两者兼有)它的新特性所分心。由一系列无止境的问题引发的对话能够很快的被发展为功能愿景清单,所有的这些都是你可能已经考虑到的。
+ * 是公有云,私有云还是混合云?
+ * 将会使用虚拟机还是容器,或者是两者?
+ * 将会提供自助服务吗?
+ * 将会完全自动的从开发转移到生产,还是它将需要手动操作?
+ * 我们能以多块的速度创建?
+ * 关于工具X,Y,还有Z?
+
+这样的清单还可以列举很多。
+
+开始现代化,或者数字转型,无论你是如何称呼的,通常方法是开始回答高级管理层的一些高层次问题,这种方法的结果是可以预想到的:失败。经过大范围的调研并且花费了数月的时间,如果不是几年,部署这个最炫的新技术,新的云技术从未被使用过而且陷入了荒废直到它最终被丢弃或者遗忘在数据中心的一角和预算中。
+
+因为无论你交付的是什么工具都不是用户所想要或者需要的。更加糟糕的是,当用户真正需要的是一个单独的工具时,一系列其他的工具就会被用户抛弃因为新的,闪光的
+升级的工具能够更好的满足他们的需求。
+
+### 议题聚焦
+
+问题是关注,传统一直是关注工具。但工具并不是要增加到组织价值中的东西;终端用户利用它做什么。你需要将你的注意力从创建云(列入技术和工具)转移到你的人员和用户身上。
+
+事实上,使用工具的用户(而不是工具本身)是驱动价值的因素,聚焦注意力在用户身上也是由其他原因的。工具是给用户使用去解决他们的问题并允许他们创造价值的,
+所有这就导致了如果那些工具不能满足那些用户的需求,那么那些工具将不会被使用。如果你交付给你的用户的工具并不是他们喜欢的,他们将不会使用,这就是人类的
+人性行为。
+
+数十年来,IT产业只为用户提供一种解决方案,因为仅有一个或两个选项,用户是没有权力去改变的。现在情况已经不同了。我们现在生活在一个技术选择的世界中。
+不给用户一个选择的机会的情况将不会被接受的;他们在个人的科技生活中有选择,同时希望在工作中也有选择。现在的用户都是受过教育的并且知道将会有比你提供的机会更好的选择。
+
+因此,在物理上的最安全的地点之外,没有能够阻止他们只做他们自己想要的东西的方法,我们称之为“影子IT。”如果你的组织由如此严格的安全策略和承诺策略,许多员工将会感到灰心丧气并且会离职去其他能提供更好机会的公司。
+
+基于以上所有的原因,你必须牢记要首先和你的终端用户设计你的昂贵又费时的云项目。
+
+### 创建满足用户需求的云五个步骤的过程
+
+既然我们已经知道了为什么,接下来我们来讨论一下怎么做。你如何去为终端用户创建一个云?你怎样重新将你的注意力从技术转移到使用技术的用户身上?
+根据以往的经验,我们知道最好的方法中包含两件重要的事情:从你的用户中得到及时的反馈,创建中和用户进行更多的互动。
+
+你的云环境将继续随着你的组织不段发展。下面的五个步骤将会帮助你创建满足用户需求的云环境。
+
+### 1\. 识别谁将是你的用户
+
+在你开始询问用户问题之前,你首先必须识别谁将是你的新的云环境的用户。他们可能包括将在云上创建开发应用的开发者。也可能是运营,维护或者或者创建云的运维团队;还可能是保护组织的安全团队。在第一次迭代时,将你的用户数量缩小至人数较少的小组防止你被大量的反馈所淹没,让你识别的每个小组指派两个代表(一个主要的一个辅助的)。这将使你的第一次交付在大小和时间上都很小。
+
+#### 2\. 和你的用户面对面的交谈来收获有价值的输入。
+
+The best way to get users' feedback is through direct communication. Mass emails asking for input will self-select respondents—if you even get a response. Group discussions can be helpful, but people tend to be more candid when they have a private, attentive audience.
+获得反馈的最佳途径是和用户直接交谈。如果你收到回复,大量的邮件要求你输入信息,你会选择自动回复。小组讨论会很有帮助的,但是当人们有私密的,吸引人注意的观众,他们会比较的坦诚。
+
+和你的第一批用户安排面对面的个人的会谈并且向他们询问以下的问题:
+
+ * 为了完成你的任务,你需要什么?
+ * 为了完成你的任务,你想要什么?
+ * 你现在最头疼的技术点是什么?
+ * 你现在最头疼的政策或者程序是哪个?
+ * 为了满足你的需求你有什么想法,欲望还是疼痛?
+
+这些问题只是指导性的并不一定适合每个组。你不应该只询问这些问题,他们应该导向更深层次的讨论。确保告诉用户任何所说的和被问的都会被反馈的。所有的反馈都是有帮助的,无论是消极的还是积极的。这些对话将会帮助你设置你的开发优先级。
+
+收集这种个性化的反馈是保持初始用户群较小的另一个原因:将会花费你大量的时间来和每个用户交流,但是我们已经发现这是相当值得付出的投入。
+
+#### 3\. 设计并交付你的解决方案的第一个版本
+
+一旦你收到初始用户的反馈,就是时候开始去设计并交付一部分的功能了。我们不推荐尝试一次性交付整个解决方案。设计和交付的时期要短;这是为了避免犯一个需要你花费一年的时间去寻找解决方案的错误,只会让你的用户拒绝它,因为对他们来说毫无用处。创建你的云所需要的工具取决于你的组织和它的特殊需求。只需确保你的解决方案是建立在用户的反馈的基础上的,你将功能小块化的交付并且要经常的去征求用户的反馈。
+
+#### 4\. 询问用户对第一个版本的反馈
+
+太棒了,现在你已经设计并向你的用户交付了你的炫酷的新的云环境的第一个版本!你并不是花费一整年去完成它而是将它处理成小的模块。为什么将其分为小的模块如此重要呢?因为你要回归你的用户并且向他们收集关于你的设计和交付的功能。他们喜欢什么?不喜欢什么?你正确的处理了他们所关注的吗?是技术功能上很厉害,但系统进程或者策略方面仍然欠缺?
+
+再重申一次,你要问的问题取决于你的组织;这里的关键是继续前一个阶段的讨论。毕竟你正在为用户创建云环境,所以确保它对用户来说是有用的并且能够有效利用每个人的时间。
+
+#### 5\. 回到第一步。
+
+这是一个互动的过程。你的第一次交付应该是快速而小规模的,而且以后的迭代也应该是这样的。不要期待仅仅按照这个流程完成了一次,两次即使是三次就能完成。
+一旦你持续的迭代,你将会吸引更多的用户从而能够在这个过程中得到更好的回报。你将会从用户那里得到更多的支持。你能狗迭代的更迅速并且更可靠。到最后,你
+将会通过改变你的进程来满足用户的需求。
+
+用户是这个过程中最重要的一部分,但迭代是第二重要的因为它让你能够回到用户中进行持续沟通从而得到更多有用的信息。在每个阶段,记录那些是有效的哪些没有起到应有的效果。要自省,要对自己诚实。我们所花费的时间提供了最有价值的了吗?如果不是,在下一个阶段尝试些不同的。在每次循环中不要花费太多时间的重要部分是,如果某部分在这次不起作用,你能够很容易的在写一次中调整它,知道你找到能够在你组织中起作用的方法。
+
+### 这仅仅是开始
+
+通过许多客户的约定,从他们那里收集反馈,以及在这个领域的同行的经验,我们一次次的发现在你创建云的时候最重要事就是和你的用户交谈。这看起来是很明显的,
+但很让人惊讶的是很多组织却偏离了这个方向去花费数月或者数年的时间去创建,然后最终发现它对终端用户甚至一点用处都没有。
+
+现在你已经知道为什么你需要将你的注意力集中到终端用户身上并且在中心节点和用户有一个一起创建云的互动过程。剩下的是我们所喜欢的部分,你出去做的部分。
+
+这篇文章是基于"[为终端用户设计混合云或者失败],"一篇作者将在[Red Hat Summit 2018][3]上发表的文章,并且将于5月8日至10日在旧金山举行
+
+[在5月7号前注册][3]将会节省US$500。在支付页面使用折扣码**OPEN18**将会享受到折扣。
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/4/5-steps-building-your-cloud-correctly
+
+作者:[Cameron Wyatt][a]
+译者:[FelixYFZ](https://github.com/FelixYFZ)
+校对:[校对者ID](https://github.com/校对者ID)
+选题:[lujun9972](https://github.com/lujun9972)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:https://opensource.com/users/cameronmwyatt
+[1]:https://opensource.com/users/itewk
+[2]:https://agenda.summit.redhat.com/SessionDetail.aspx?id=154225
+[3]:https://www.redhat.com/en/summit/2018
diff --git a/translated/talk/20180817 Mixing software development roles produces great results.md b/translated/talk/20180817 Mixing software development roles produces great results.md
new file mode 100644
index 0000000000..d753f6f027
--- /dev/null
+++ b/translated/talk/20180817 Mixing software development roles produces great results.md
@@ -0,0 +1,71 @@
+混合软件开发角色效果更佳
+======
+
+
+
+大多数开源社区没有很多正式的角色。当然, 也有一些固定人员帮助处理系统管理员任务、测试、编写文档以及翻译或开发代码。但开源社区的人员通常在不同的角色之间流动, 往往同时履行几个角色的职责。
+
+相反, 大多数传统公司的团队成员都定义了角色,例如, 负责文档、技术支持、质量检验和其他领域。
+
+为什么开源社区采取共享角色的方法, 更重要的是, 这种协作方式如何影响产品和客户?
+
+[Nextcloud][1] 采用了这种社区式的混合角色的做法, 我们看到了我们的客户和用户受益颇多。
+
+### 1\.更好的产品测试
+
+ 任何测试人员都会说测试是一项困难的工作。你需要了解工程师开发的产品, 并且需要设计测试案例、执行测试案例并将结果返回给开发人员。完成该过程后, 开发人员将进行更改, 然后重复该过程, 根据需要来回进行多次,直到任务完成。
+
+在社区中, 贡献者通常会对他们开发的项目负责, 因此他们会对这些项目进行广泛的测试和记录, 然后再将其交给用户。贴近项目的用户通常会与开发人员协作, 帮助测试、翻译和编写文档。这将创建一个更紧密、更快的反馈循环, 从而加快开发速度并提高质量。
+
+当开发人员不断面对他们的工作结果时, 它鼓励他们以最大限度地减少测试和调试的方式去书写。自动化测试是开发中的一个重要元素, 反馈循环可以确保正确地完成操作: 开发人员主观能动的来实现自动化--而不过于简化也不过于复杂。当然, 他们可能希望别人做更多的测试或自动化的测试 但当测试是正确的选择时, 他们就会这样做。此外, 他们还审查对方的代码, 因为他们知道问题往往会在以后让他们付出代价。
+
+因此, 虽然我不认为放弃专用测试人员更好, 但在没有社区志愿者进行测试的项目中, 测试人员应该是开发人员, 并密切嵌入到开发团队中。结果如何?客户得到的产品是由100% 有动机的人测试和开发的, 以确保它是稳定和可靠的。
+
+### 2\. 开发和客户需求之间的密切协作
+
+要使产品开发与客户需求保持一致是非常困难的。每个客户都有自己独特的需求, 有长期和短期的因素需要考虑--当然, 作为一家公司, 你对你的方向有想法。你如何整合所有这些想法和愿景?
+
+公司通常创建与工程和产品开发分开的角色, 如产品管理、支持、质量检测等。这背后的想法是, 人们在专攻的时候做得最好, 工程师不应该为测试或支持等 "简单" 的任务而烦恼。
+
+实际上, 这种角色分离是一项削减成本的措施。它使管理层能够进行微观管理, 并更能掌握全局, 因为他们可以简单地进行产品管理, 例如, 确定路线图项目的优先次序。(它还创建了更多的会议!)
+
+另一方面, 在社区, "决定权在工作者手上"。开发人员通常也是用户 (或由用户支付报酬), 因此他们自然地与用户的需求保持一致。当用户帮助进行测试时 (如上所述), 开发人员会不断地与他们合作, 因此双方都完全了解什么是可行的, 什么是需要的。
+
+这种开放的合作方式使用户和项目紧密协作。在没有管理层干涉和指手画脚的情况下, 用户最迫切的需求可以迅速得到满足, 因为工程师已经非常了解这些需求。
+
+在 nextcloud 中, 客户永远不需要解释两次, 也不需要依靠初级支持团队成员将问题准确地传达给工程师。我们的工程师根据客户的实际需求不断调整他们的优先级。同时, 基于对客户的深入了解, 合作制定长期目标。
+
+### 3\. 最佳支持
+
+与专有的或 [open core][2](开放源核心)的开发商不同, 开源供应商有强大的动力提供尽可能最好的支持: 它是与其他公司在其生态系统中的关键区别。
+
+为什么项目背后有动力?—比如 [Collabora][3] 在 [LibreOffice][4] 背后, [The Qt Company][5] 在 [Qt][6] 背后, 或者 [Red Hat][7] 在 [RHEL][8] 背后—最佳来源于客户的支持?
+
+当然, 直接接触工程师。许多公司并阻断工程的支持, 而是为客户提供了获得工程师专业知识的机会。这有助于确保客户始终尽快获得最佳答案。虽然一些工程师可能比其他人在支持上花费更多的时间, 但整个工程团队在客户成功方面发挥着作用。自营供应商可能会为客户提供一个专门的现场工程师, 费用相当高, 例如,但一个开源公司, 如 [OpenNMS][9] 在您的支持合同中提供相同级别的服务, 即使您不是财富500强客户也是如此。
+
+还有一个好处, 那就是与测试和客户协作有关: 共享角色可确保工程师每天处理客户问题和愿望, 从而促使他们快速解决最常见的问题。他们还倾向于构建额外的工具和功能, 以满足客户预期。
+
+简单地说, 将 质量检测、支持、产品管理和其他工程角色合并为一个团队, 可确保优秀开发人员的三大优点--[laziness, impatience, and hubris][10](从简,精益求精,高度自我要求)—与客户紧密保持一致。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/8/mixing-roles-engineering
+
+作者:[Jos Poortvliet][a]
+选题:[lujun9972](https://github.com/lujun9972)
+译者:[lixinyuxx](https://github.com/lixinyuxx)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:https://opensource.com/users/jospoortvliet
+[1]:https://nextcloud.com/
+[2]:https://en.wikipedia.org/wiki/Open_core
+[3]:https://www.collaboraoffice.com/
+[4]:https://www.libreoffice.org/
+[5]:https://www.qt.io/
+[6]:https://www.qt.io/developers/
+[7]:https://www.redhat.com/en
+[8]:https://www.redhat.com/en/technologies/linux-platforms/enterprise-linux
+[9]:https://www.opennms.org/en
+[10]:http://threevirtues.com/
diff --git a/translated/talk/20181026 Directing traffic- Demystifying internet-scale load balancing.md b/translated/talk/20181026 Directing traffic- Demystifying internet-scale load balancing.md
new file mode 100644
index 0000000000..e3b26f4a29
--- /dev/null
+++ b/translated/talk/20181026 Directing traffic- Demystifying internet-scale load balancing.md
@@ -0,0 +1,109 @@
+流量引导:网络世界的负载均衡解密
+======
+
+均衡网络流量的常用技术,它们的优势和利弊权衡。
+
+
+
+大型的多站点互联网系统,包括内容分发网络(CDN)和云服务提供商,用一些方法来均衡来访的流量。这篇文章我们讲一下常见的流量均衡设计,包括它们的技术手段和利弊权衡。
+
+如果你很早就用云计算技术来提供服务的话,你可能在单台云服务器上搭建 web 服务,分配一个 IP 地址,然后配置一个给人读的域名(DNS)指向这个 IP 地址,再将 IP 地址通过边界网关协议(BGP)宣告出去,BGP 是在不同网络之间交换路由信息的标准方式。
+
+这本身并不是负载均衡,但是在冗余的多条网络路径中,很可能是有流量分发的,而且利用网络技术让流量绕过不可用的网络,从而提高了可用性(也引起了[非对称路由][1]的现象)。
+
+### 简单的 DNS 负载均衡
+
+随着来自客户的流量变大,老板希望服务是高可用的。你上线第二台 web 服务器,它有自己独立的公网 IP 地址,然后你更新了 DNS 记录,把用户流量引到两台服务器上(内心希望它们均衡地提供服务)。在其中一台服务器出故障之前,这样做一直是没有问题的。假设你能很快地监测到故障,可以更新一下 DNS 配置(手动更新或者通过软件)删除解析到故障机器的记录。
+
+不幸的是,因为 DNS 记录会被缓存,在客户端缓存和它们依赖的 DNS 服务器上的缓存失效之前,大约一半的请求会失败。DNS 记录都有一个几分钟或更长的生命周期(TTL),所以这种方式会对系统可用性造成严重的影响。
+
+更糟糕的是,部分客户端会完全忽略 TTL,所以有一些请求会持续被引导到你的故障机器上。设置很短的 TTL 也不是个好办法,因为这意味着更高的 DNS 服务负载,还有更长的访问时延,因为客户端要做更多的 DNS 查询。如果 DNS 服务由于某种原因不可用了,那设置更短的 TTL 会让服务的访问量更快地下降,因为没那么多客户端有你网站 IP 地址的缓存了。
+
+### 增加网络负载均衡
+
+要解决上述问题,可以增加一对相互冗余的[四层][2](L4)网络负载均衡器,配置一样的虚拟 IP 地址(VIP)。均衡器可以是硬件的,也可以是像 [HAProxy][3] 这样的软件。域名的 DNS 记录指向 VIP,不再承担负载均衡的功能。
+
+![Layer 4 load balancers balance connections across webservers.][5]
+
+四层负载均衡器能够均衡用户和两台 web 服务器的连接
+
+四层均衡器将网络流量均衡地引导至后端服务器。通常这是基于对 IP 数据包的五元组做散列(数学函数)来完成的,五元组包括:源地址,源端口,目的地址,目的端口,协议(比如 TCP 或 UDP)。这种方法是快速和高效的(还维持了 TCP 的基本属性),而且不需要均衡器维持每个连接的状态。(更多信息请阅读[谷歌发表的 Maglev 论文][6],这篇论文详细讨论了四层软件负载均衡器的实现细节。)
+
+四层均衡器可以对后端服务做健康检查,只把流量分发到健康的机器上。和使用 DNS 做负载均衡不同的是,在某个后端 web 服务故障的时候,它可以很快地把流量重新分发到其他机器上,虽然故障机器的已有连接会被重置。
+
+当后端服务器的能力不同时,四层均衡器可以根据权重做流量分发。它为运维人员提供了强大的能力和灵活性,而且硬件成本相对较小。
+
+### 扩展到多站点
+
+系统规模在持续增长。你的客户希望能一直使用服务,即使数据中心发生故障的时候。所以你建设了一个新的数据中心,独立部署了一套服务和四层负载均衡器集群,仍然使用同样的 VIP。DNS 的设置不变。
+
+两个站点的边缘路由器都把自己的地址空间宣告出去,包括 VIP 地址。发往该 VIP 的请求可能到达任何一个站点,取决于用户和系统之间的网络是如何连接的,以及各个网络的路由策略是如何配置的。这就是泛播。大部分时候这种机制可以很好的工作。如果一个站点出问题了,你可以停止通过 BGP 宣告 VIP 地址,客户的请求就会迅速地转移到另外一个站点去。
+
+![Serving from multiple sites using anycast][8]
+
+多个站点使用泛播提供服务
+
+这种设置有一些问题。最大的问题是,不能控制请求流向哪个站点,或者限制某个站点的流量。也没有一个明确的方式把用户的请求转到距离他最近的站点(为了降低网络延迟),不过,网络协议和路由选路配置在大部分情况下应该能把用户请求路由到最近的站点。
+
+### 控制多站点系统中的入方向请求
+
+为了维持稳定性,需要能够控制每个站点的流量大小。要实现这种控制,可以给每个站点分配不同的 VIP 地址,然后用简单的或者有权重的 DNS [轮询][9]来做负载均衡。
+
+![Serving from multiple sites using a primary VIP][11]
+
+多站点提供服务,每个站点使用一个主 VIP,另外一个站点作为备份。基于能感知地理位置的 DNS。
+
+现在有两个问题。
+
+第一,使用 DNS 均衡意味着会有被缓存的记录,如果你要快速重定向流量的话就麻烦了。
+
+第二,用户每次做新的 DNS 查询,都可能连上任意一个站点,可能不是距离最近的。如果你的服务运行在分布广泛的很多站点上,用户会感受到响应时间有明显的变化,取决于用户和提供服务的站点之间有多大的网络延迟。
+
+让每个站点都配置上其他所有站点的 VIP 地址,并宣告出去(因此也会包含故障的站点),这样可以解决第一个问题。有一些网络上的小技巧,比如备份站点宣告路由时,不像主站点使用那么具体的目的地址,这样可以保证每个 VIP 的主站点只要可用就会优先提供服务。这是通过 BGP 来实现的,所以我们应该可以看到,流量在 BGP 更新后的一两分钟内就开始转移了。
+
+即使离用户最近的站点是健康而且有服务能力的,但是用户真正访问到的却不一定是这个站点,这个问题还没有很好的解决方案。很多大型的互联网服务利用 DNS 给不同地域的用户返回不同的解析结果,也能有一定的效果。不过,因为网络地址的结构和地理位置无关,一个地址段也可能会改变所在位置(例如,当一个公司重新规划网络时),而且很多用户可能使用了同一个 DNS 缓存服务器。所以这种方案有一定的复杂度,而且容易出错。
+
+### 增加七层负载均衡
+
+又过了一段时间,你的客户开始要更多的高级功能。
+
+虽然四层负载均衡可以高效地在多个 web 服务器之间分发流量,但是它们只针对源地址、目标地址、协议和端口来操作,请求的内容是什么就不得而知了,所以很多高级功能在四层负载均衡上实现不了。而七层(L7)负载均衡知道请求的内容和结构,所以能做更多的事情。
+
+七层负载均衡可以实现缓存,限速,错误注入,做负载均衡时可以感知到请求的代价(有些请求需要服务器花更多的时间去处理)。
+
+七层负载均衡还可以基于请求的属性(比如 HTTP cookies)来分发流量,可以终结 SSL 连接,还可以帮助防御应用层的拒绝服务(DoS)攻击。规模大的 L7 负载均衡的缺点是成本——处理请求需要更多的计算,而且每个活跃的请求都占用一些系统资源。在一个或者多个 L7 均衡器前面运行 L4 均衡器集群,对扩展规模有帮助。
+
+### 结论
+
+负载均衡是一个复杂的难题。除了上面说过的策略,还有不同的[负载均衡算法][13],用来实现负载均衡器的高可用技术,客户端负载均衡技术,以及最近兴起的服务网络等等。
+
+核心的负载均衡模式随着云计算的发展而不断发展,而且,随着大型 web 服务商致力于让负载均衡技术更可控和更灵活,这项技术会持续发展下去。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/10/internet-scale-load-balancing
+
+作者:[Laura Nolan][a]
+选题:[lujun9972][b]
+译者:[BeliteX](https://github.com/belitex)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/lauranolan
+[b]: https://github.com/lujun9972
+[1]: https://www.noction.com/blog/bgp-and-asymmetric-routing
+[2]: https://en.wikipedia.org/wiki/Transport_layer
+[3]: https://www.haproxy.com/blog/failover-and-worst-case-management-with-haproxy/
+[4]: /file/412596
+[5]: https://opensource.com/sites/default/files/uploads/loadbalancing1_l4-network-loadbalancing.png "Layer 4 load balancers balance connections across webservers."
+[6]: https://ai.google/research/pubs/pub44824
+[7]: /file/412601
+[8]: https://opensource.com/sites/default/files/uploads/loadbalancing2_going-multisite.png "Serving from multiple sites using anycast"
+[9]: https://en.wikipedia.org/wiki/Round-robin_scheduling
+[10]: /file/412606
+[11]: https://opensource.com/sites/default/files/uploads/loadbalancing3_controlling-inbound-requests.png "Serving from multiple sites using a primary VIP"
+[12]: https://landing.google.com/sre/book/chapters/load-balancing-frontend.html
+[13]: https://medium.com/netflix-techblog/netflix-edge-load-balancing-695308b5548c
+[14]: https://www.usenix.org/conference/lisa18/presentation/suriar
+[15]: https://www.usenix.org/conference/lisa18
diff --git a/translated/talk/20181116 Akash Angle- How do you Fedora.md b/translated/talk/20181116 Akash Angle- How do you Fedora.md
new file mode 100644
index 0000000000..9ed990094a
--- /dev/null
+++ b/translated/talk/20181116 Akash Angle- How do you Fedora.md
@@ -0,0 +1,61 @@
+Akash Angle: 你如何使用 Fedora?
+======
+
+
+我们最近采访了Akash Angle 来了解他如何使用 Fedora。这是 Fedora Magazine 上 Fedora [系列的一部分[1]。该系列介绍 Fedora 用户以及他们如何使用 Fedora 完成工作。请通过[反馈栏][2]与我们联系表达你对成为受访者的兴趣。
+
+### Akash Angle 是谁?
+
+Akash 是一位不久前抛弃 Windows 的 Linux 用户。作为一名过去 9 年的狂热 Fedora 用户,他已经尝试了几乎所有的 Fedora 定制版和桌面环境来完成他的日常任务。他被一位学校朋友介绍给 Fedora。
+
+### 使用什么硬件?
+
+Akash 在工作时使用联想 B490。它配备了英特尔酷睿 i3-3310 处理器和 240GB 金士顿 SSD。Akash 说:“这台笔记本电脑非常适合一些日常任务,如上网、写博客,以及一些照片编辑和视频编辑。虽然不是专业的笔记本电脑,而且规格并不是那么高端,但它完美地完成了工作。“
+
+他使用一个入门的罗技无线鼠标,并希望能有一个机械键盘。他的 PC 是一台定制桌面电脑,拥有最新的第 7 代 Intel i5 7400 处理器和 8GB Corsair Vengeance 内存。
+
+![][3]
+
+### 使用什么软件?
+
+Akash 是 GNOME 3 桌面环境的粉丝。他喜欢操作系统为完成基本任务而加入的华丽功能。
+
+出于实际原因,他更喜欢全新安来升级到最新 Fedora 版本。他认为 Fedora 29 可以说是最好的工作站。Akash 说这得到了各种科技传播网站和开源新闻网站评论的支持。。
+
+为了播放视频,他的首选是打包为 [Flatpak][4] 的 VLC 视频播放器 ,它提供了最新的稳定版本。当 Akash 想截图时,他的终极工具是 [Shutter,Magazine 曾介绍过][5]。对于图形处理,GIMP 是他不能离开的工具。
+
+Google Chrome 稳定版和开发版是他最常用的网络浏览器。他还使用 Chromium 和 Firefox 的默认版本,有时甚至会使用 Opera。
+
+由于他是一名资深用户,所以 Akash 其余时候都使用终端。GNOME Terminal 是他使用的一个终端。
+
+#### 最喜欢的壁纸
+
+他最喜欢的壁纸之一是下面最初来自 Fedora 16 的壁纸:
+
+![][6]
+
+这是他目前在 Fedora 29 工作站上使用的壁纸之一:
+
+![][7]
+
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/akash-angle-how-do-you-fedora/
+
+作者:[Adam Šamalík][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://fedoramagazine.org/author/asamalik/
+[b]: https://github.com/lujun9972
+[1]: https://fedoramagazine.org/tag/how-do-you-fedora/
+[2]: https://fedoramagazine.org/submit-an-idea-or-tip/
+[3]: https://fedoramagazine.org/wp-content/uploads/2018/11/akash-angle-desktop-300x259.png
+[4]: https://fedoramagazine.org/getting-started-flatpak/
+[5]: https://fedoramagazine.org/screenshot-everything-shutter-fedora/
+[6]: https://fedoramagazine.org/wp-content/uploads/2018/11/Fedora-16-300x188.png
+[7]: https://fedoramagazine.org/wp-content/uploads/2018/11/wallpaper2you_72588-300x169.jpg
\ No newline at end of file
diff --git a/sources/tech/20180221 12 useful zypper command examples.md b/translated/tech/20180221 12 useful zypper command examples.md
similarity index 52%
rename from sources/tech/20180221 12 useful zypper command examples.md
rename to translated/tech/20180221 12 useful zypper command examples.md
index 2e5e2c59a9..018c5da7c3 100644
--- a/sources/tech/20180221 12 useful zypper command examples.md
+++ b/translated/tech/20180221 12 useful zypper command examples.md
@@ -1,138 +1,129 @@
-12 useful zypper command examples
+12 条实用的 zypper 命令范例
======
-Learn zypper command with 12 useful examples along with sample outputs. zypper is used for package and patch management in Suse Linux systems.
+zypper 是 Suse Linux 系统的包和补丁管理器,你可以根据下面的 12 条附带输出示例的实用范例来学习 zypper 命令的使用。
-![zypper command examples][1]
+![zypper 命令示例][1]
-zypper is package management system powered by [ZYpp package manager engine][2]. Suse Linux uses zypper for package management. In this article we will be sharing 12 useful zypper commands along with examples whcih are helpful for your day today sysadmin tasks.
+Suse Linux 使用 zypper 进行包管理,其是一个由 [ZYpp 包管理引擎][2]提供技术支持的包管理系统。在此篇文章中我们将分享 12 条附带输出示例的实用 zypper 命令,能帮助你处理日常的系统管理任务。
-Without any argument `zypper` command will list you all available switches which can be used. Its quite handy than referring to man page which is pretty much in detail.
+不带参数的 `zypper` 命令将列出所有可用的选项,这比参考详细的 man 手册要容易上手得多。
```
root@kerneltalks # zypper
- Usage:
+ 用法:
zypper [--global-options] [--command-options] [arguments]
zypper [--command-options] [arguments]
- Global Options:
- --help, -h Help.
- --version, -V Output the version number.
- --promptids Output a list of zypper's user prompts.
- --config, -c Use specified config file instead of the default .
- --userdata User defined transaction id used in history and plugins.
- --quiet, -q Suppress normal output, print only error
- messages.
- --verbose, -v Increase verbosity.
+ 全局选项:
+ --help, -h 帮助
+ --version, -V 输出版本号
+ --promptids 输出 zypper 用户提示符列表
+ --config, -c 使用制定的配置文件来替代默认的
+ --userdata 在历史和插件中使用的用户自定义事务 id
+ --quiet, -q 忽略正常输出,只打印错误信息
+ --verbose, -v 增加冗长程度
--color
- --no-color Whether to use colors in output if tty supports it.
- --no-abbrev, -A Do not abbreviate text in tables.
- --table-style, -s Table style (integer).
- --non-interactive, -n Do not ask anything, use default answers
- automatically.
+ --no-color 是否启用彩色模式如果 tty 支持
+ --no-abbrev, -A 表格中的文字不使用缩写
+ --table-style, -s 表格样式(整型)
+ --non-interactive, -n 不询问任何选项,自动使用默认答案
--non-interactive-include-reboot-patches
- Do not treat patches as interactive, which have
- the rebootSuggested-flag set.
- --xmlout, -x Switch to XML output.
- --ignore-unknown, -i Ignore unknown packages.
+ 针对带有重启标志的补丁,不使用交互模式
+ --xmlout, -x 切换至 XML 输出
+ --ignore-unknown, -i 忽略未知的包
- --reposd-dir, -D Use alternative repository definition file
- directory.
- --cache-dir, -C Use alternative directory for all caches.
- --raw-cache-dir Use alternative raw meta-data cache directory.
- --solv-cache-dir Use alternative solv file cache directory.
- --pkg-cache-dir Use alternative package cache directory.
+ --reposd-dir, -D 使用自定义仓库文件目录
+ --cache-dir, -C 为所有缓存启用可选路径
+ --raw-cache-dir 启用可选 raw 元数据缓存路径
+ --solv-cache-dir 启用可选 solv 文件缓存路径
+ --pkg-cache-dir 启用可选包缓存路径
- Repository Options:
- --no-gpg-checks Ignore GPG check failures and continue.
- --gpg-auto-import-keys Automatically trust and import new repository
- signing keys.
- --plus-repo, -p Use an additional repository.
- --plus-content Additionally use disabled repositories providing a specific keyword.
- Try '--plus-content debug' to enable repos indic ating to provide debug packages.
- --disable-repositories Do not read meta-data from repositories.
- --no-refresh Do not refresh the repositories.
- --no-cd Ignore CD/DVD repositories.
- --no-remote Ignore remote repositories.
- --releasever Set the value of $releasever in all .repo files (default: distribution version)
+ 仓库选项:
+ --no-gpg-checks 忽略 GPG 检查失败并跳过
+ --gpg-auto-import-keys 自动信任并导入新仓库的签名密钥
+ --plus-repo, -p 使用附加仓库
+ --plus-content 另外使用禁用的仓库来提供特定的关键词
+ 尝试 '--plus-content debug' 选项来启用仓库
+ --disable-repositories 不从仓库中读取元数据
+ --no-refresh 不刷新仓库
+ --no-cd 忽略 CD/DVD 中的仓库
+ --no-remote 忽略远程仓库
+ --releasever 设置所有 .repo 文件中的 $releasever 变量(默认值:发行版版本)
Target Options:
- --root, -R Operate on a different root directory.
+ --root, -R 在另一个根路径下进行操作
--disable-system-resolvables
- Do not read installed packages.
+ 不读取已安装包
- Commands:
- help, ? Print help.
- shell, sh Accept multiple commands at once.
+ 命令:
+ help, ? 打印帮助
+ shell, sh 允许多命令
- Repository Management:
- repos, lr List all defined repositories.
- addrepo, ar Add a new repository.
- removerepo, rr Remove specified repository.
- renamerepo, nr Rename specified repository.
- modifyrepo, mr Modify specified repository.
- refresh, ref Refresh all repositories.
- clean Clean local caches.
+ 仓库管理:
+ repos, lr 列出所有自定义仓库
+ addrepo, ar 添加一个新仓库
+ removerepo, rr 移除指定仓库
+ renamerepo, nr 重命名指定仓库
+ modifyrepo, mr 修改指定仓库
+ refresh, ref 刷新所有仓库
+ clean 清除本地缓存
- Service Management:
- services, ls List all defined services.
- addservice, as Add a new service.
- modifyservice, ms Modify specified service.
- removeservice, rs Remove specified service.
- refresh-services, refs Refresh all services.
+ 服务管理:
+ services, ls 列出所有自定义服务
+ addservice, as 添加一个新服务
+ modifyservice, ms 修改指定服务
+ removeservice, rs 移除指定服务
+ refresh-services, refs 刷新所有服务
- Software Management:
- install, in Install packages.
- remove, rm Remove packages.
- verify, ve Verify integrity of package dependencies.
- source-install, si Install source packages and their build
- dependencies.
+ 软件管理:
+ install, in 安装包
+ remove, rm 移除包
+ verify, ve 确认包依赖的完整性
+ source-install, si 安装源码包及其构建依赖
install-new-recommends, inr
- Install newly added packages recommended
- by installed packages.
+ 安装由已安装包建议一并安装的新包
- Update Management:
- update, up Update installed packages with newer versions.
- list-updates, lu List available updates.
- patch Install needed patches.
- list-patches, lp List needed patches.
- dist-upgrade, dup Perform a distribution upgrade.
- patch-check, pchk Check for patches.
+ 更新管理:
+ update, up 更新已安装包至更新版本
+ list-updates, lu 列出可用更新
+ patch 安装必要的补丁
+ list-patches, lp 列出必要的补丁
+ dist-upgrade, dup 进行发行版更新
+ patch-check, pchk 检查补丁
- Querying:
- search, se Search for packages matching a pattern.
- info, if Show full information for specified packages.
- patch-info Show full information for specified patches.
- pattern-info Show full information for specified patterns.
- product-info Show full information for specified products.
- patches, pch List all available patches.
- packages, pa List all available packages.
- patterns, pt List all available patterns.
- products, pd List all available products.
- what-provides, wp List packages providing specified capability.
+ 查询:
+ search, se 查找符合匹配模式的包
+ info, if 展示特定包的完全信息
+ patch-info 展示特定补丁的完全信息
+ pattern-info 展示特定模式的完全信息
+ product-info 展示特定产品的完全信息
+ patches, pch 列出所有可用的补丁
+ packages, pa 列出所有可用的包
+ patterns, pt 列出所有可用的模式
+ products, pd 列出所有可用的产品
+ what-provides, wp 列出提供特定功能的包
- Package Locks:
- addlock, al Add a package lock.
- removelock, rl Remove a package lock.
- locks, ll List current package locks.
- cleanlocks, cl Remove unused locks.
+ 包锁定:
+ addlock, al 添加一个包锁定
+ removelock, rl 移除一个包锁定
+ locks, ll 列出当前的包锁定
+ cleanlocks, cl 移除无用的锁定
- Other Commands:
- versioncmp, vcmp Compare two version strings.
- targetos, tos Print the target operating system ID string.
- licenses Print report about licenses and EULAs of
- installed packages.
- download Download rpms specified on the commandline to a local directory.
- source-download Download source rpms for all installed packages
- to a local directory.
+ 其他命令:
+ versioncmp, vcmp 比较两个版本字符串
+ targetos, tos 打印目标操作系统 ID 字符串
+ licenses 打印已安装包的证书和 EULAs 报告
+ download 使用命令行下载指定 rpm 包到本地目录
+ source-download 下载所有已安装包的源码 rpm 包到本地目录
- Subcommands:
- subcommand Lists available subcommands.
+ 子命令:
+ subcommand 列出可用子命令
-Type 'zypper help ' to get command-specific help.
+输入 'zypper help ' 来获得特定命令的帮助。
```
-##### How to install package using zypper
+##### 如何使用 zypper 安装包
-`zypper` takes `in` or `install` switch to install package on your system. Its same as [yum package installation][3], supplying package name as argument and package manager (zypper here) will resolve all dependencies and install them along with your required package.
+`zypper` 通过 `in` 或 `install` 开关来在你的系统上安装包。它的用法与 [yum package installation][3] 相同。你只需要提供包名作为参数,包管理器(此处是 zypper)就会处理所有的依赖并与你指定的包一并安装。
```
# zypper install telnet
@@ -154,13 +145,13 @@ Checking for file conflicts: ...................................................
(1/1) Installing: telnet-1.2-165.63.x86_64 .......................................................................................................................[done]
```
-Above output for your reference in which we installed `telnet` package.
+以上是我们安装 `telnet` 包时的输出,供你参考。
-Suggested read : [Install packages in YUM and APT systems][3]
+推荐阅读 : [在 YUM 和 APT 系统中安装包][3]
-##### How to remove package using zypper
+##### 如何使用 zypper 移除包
-For erasing or removing packages in Suse Linux, use `zypper` with `remove` or `rm` switch.
+要在 Suse Linux 中擦除或移除包,使用 `zypper` 命令附带 `remove` 或 `rm` 开关。
```
root@kerneltalks # zypper rm telnet
@@ -176,13 +167,13 @@ After the operation, 113.3 KiB will be freed.
Continue? [y/n/...? shows all options] (y): y
(1/1) Removing telnet-1.2-165.63.x86_64 ..........................................................................................................................[done]
```
-We removed previously installed telnet package here.
+我们在此处移除了先前安装的 telnet 包。
-##### Check dependencies and verify integrity of installed packages using zypper
+##### 使用 zypper 检查依赖或者认证已安装包的完整性
-There are times when one can install package by force ignoring dependencies. `zypper` gives you power to scan all installed packages and checks for their dependencies too. If any dependency is missing, it offers you to install/rempve it and hence maintain integrity of your installed packages.
+有时可以通过强制忽略依赖关系来安装软件包。`zypper` 使你能够扫描所有已安装的软件包并检查其依赖性。如果缺少任何依赖项,它将提供你安装或重新安装它的机会,从而保持已安装软件包的完整性。
-Use `verify` or `ve` switch with `zypper` to check integrity of installed packages.
+使用附带 `verify` 或 `ve` 开关的 `zypper` 命令来检查已安装包的完整性。
```
root@kerneltalks # zypper ve
@@ -193,11 +184,11 @@ Reading installed packages...
Dependencies of all installed packages are satisfied.
```
-In above output, you can see last line confirms that all dependencies of installed packages are completed and no action required.
+在上面的输出中,你能够看到最后一行说明已安装包的所有依赖都已安装完全,并且无需更多操作。
-##### How to download package using zypper in Suse Linux
+##### 如何在 Suse Linux 中使用 zypper 下载包
-`zypper` offers way to download package in local directory without installation. You can use this downloaded package on another system with same configuration. Packages will be downloaded to `/var/cache/zypp/packages///` directory.
+`zypper` 提供了一种方法使得你能够将包下载到本地目录而不去安装它。你可以在其他具有同样配置的系统上使用这个已下载的软件包。包会被下载至 `/var/cache/zypp/packages///` 目录。
```
root@kerneltalks # zypper download telnet
@@ -215,13 +206,13 @@ total 52
-rw-r--r-- 1 root root 53025 Feb 21 03:17 telnet-1.2-165.63.x86_64.rpm
```
-You can see we have downloaded telnet package locally using `zypper`
+你能看到我们使用 `zypper` 将 telnet 包下载到了本地。
-Suggested read : [Download packages in YUM and APT systems without installing][4]
+推荐阅读 : [在 YUM 和 APT 系统中只下载包而不安装][4]
-##### How to list available package update in zypper
+##### 如何使用 zypper 列出可用包更新
-`zypper` allows you to view all available updates for your installed packages so that you can plan update activity in advance. Use `list-updates` or `lu` switch to show you list of all available updates for installed packages.
+`zypper` 允许你浏览已安装包的所有可用更新,以便你可以提前计划更新活动。使用 `list-updates` 或 `lu` 开关来显示已安装包的所有可用更新。
```
root@kerneltalks # zypper lu
@@ -238,11 +229,11 @@ v | SLE-Module-Containers12-Updates | containerd | 0.2.5+gitr6
v | SLES12-SP3-Updates | crash | 7.1.8-4.3.1 | 7.1.8-4.6.2 | x86_64
v | SLES12-SP3-Updates | rsync | 3.1.0-12.1 | 3.1.0-13.10.1 | x86_64
```
-Output is properly formatted for easy reading. Column wise it shows name of repo where package belongs, package name, installed version, new updated available version & architecture.
+输出特意被格式化以便于阅读。每一列分别代表包所属仓库名称、包名、已安装版本、可用的更新版本和架构。
-##### List and install patches in Suse linux
+##### 在 Suse Linux 中列出和安装补丁
-Use `list-patches` or `lp` switch to display all available patches for your Suse Linux system which needs to be applied.
+使用 `list-patches` 或 `lp` 开关来显示你的 Suse Linux 系统需要被应用的所有可用补丁。
```
root@kerneltalks # zypper lp
@@ -265,13 +256,13 @@ Found 37 applicable patches:
37 patches needed (18 security patches)
```
-Output is pretty much nicely organised with respective headers. You can easily figure out and plan your patch update accordingly. We can see out of 37 patches available on our system 18 are security ones and needs to be applied on high priority!
+使用相应的表头可以很好地组织输出。你可以轻松地找出并根据情况计划你的补丁更新。我们能看到在我们的系统中,37 个可用补丁中有 18 个是安全补丁,需要被高优先级应用!
-You can install all needed patches by issuing `zypper patch` command.
+你可以通过发出 `zypper patch` 命令安装所有需要的补丁。
-##### How to update package using zypper
+##### 如何使用 zypper 更新包
-To update package using zypper, use `update` or `up` switch followed by package name. In above list updates command we learned that `rsync` package update is available on our server. Let update it now –
+要使用 zypper 更新包,使用 `update` 或 `up` 开关后接包名。在上述列出的更新命令中,我们知道在我们的服务器上 `rsync` 包更新可用。让我们现在来更新它吧!
```
root@kerneltalks # zypper update rsync
@@ -293,9 +284,9 @@ Checking for file conflicts: ...................................................
(1/1) Installing: rsync-3.1.0-13.10.1.x86_64 .....................................................................................................................[done]
```
-##### Search package using zypper in Suse Linux
+##### 在 Suse Linux 上使用 zypper 查找包
-If you are not sure about full package name, no worries. You can search packages in zypper by supplying search string with `se` or `search` switch
+如果你不确定包的全名也不要担心。你可以使用 zypper 附带 `se` 或 `search` 开关并提供查找字符串来查找包。
```
root@kerneltalks # zypper se lvm
@@ -315,11 +306,11 @@ i+ | lvm2 | Logical Volume Manager Tools | package
| lvm2-devel | Development files for LVM2 | package
```
-In above example we searched `lvm` string and came up with the list shown above. You can use `Name` in zypper install/remove/update commands.
+在上述示例中我们查找了 `lvm` 字符串并得到了如上输出列表。你能在 zypper install/remove/update 命令中使用 `Name` 字段的名字。
-##### Check installed package information using zypper
+##### 使用 zypper 检查已安装包信息
-You can check installed packages details using zypper. `info` or `if` switch will list out information of installed package. It can also displays package details which is not installed. In that case, `Installed` parameter will reflect `No` value.
+你能够使用 zypper 检查已安装包的详细信息。`info` 或 `if` 开关将列出已安装包的信息。它也可以显示未安装包的详细信息,在该情况下,`Installed` 参数将返回 `No` 值。
```
root@kerneltalks # zypper info rsync
Refreshing service 'SMT-http_smt-ec2_susecloud_net'.
@@ -352,9 +343,9 @@ Description :
for backups and mirroring and as an improved copy command for everyday use.
```
-##### List repositories using zypper
+##### 使用 zypper 列出仓库
-To list repo use `lr` or `repos` switch with zypper command. It will list all available repos which includes enabled and not-enabled both repos.
+使用 zypper 命令附带 `lr` 或 `repos` 开关列出仓库。
```
root@kerneltalks # zypper lr
@@ -371,11 +362,11 @@ Repository priorities are without effect. All enabled repositories share the sam
6 | SMT-http_smt-ec2_susecloud_net:SLE-Module-Containers12-Debuginfo-Updates | SLE-Module-Containers12-Debuginfo-Updates | No | ---- | ----
```
-here you need to check enabled column to check which repos are enabled and which are not.
+此处你需要检查 `enabled` 列来确定哪些仓库是已被启用的而哪些没有。
-##### Add and remove repo in Suse Linux using zypper
+##### 在 Suse Linux 中使用 zypper 添加或移除仓库
-To add repo you will need URI of repo/.repo file or else you end up in below error.
+要添加仓库你需要仓库或 .repo 文件的 URI,否则你会遇到如下错误。
```
root@kerneltalks # zypper addrepo -c SLES12-SP3-Updates
@@ -383,7 +374,7 @@ If only one argument is used, it must be a URI pointing to a .repo file.
```
-With URI, you can add repo like below :
+使用 URI,你可以像如下方式添加仓库:
```
root@kerneltalks # zypper addrepo -c http://smt-ec2.susecloud.net/repo/SUSE/Products/SLE-SDK/12-SP3/x86_64/product?credentials=SMT-http_smt-ec2_susecloud_net SLE-SDK12-SP3-Pool
@@ -399,18 +390,18 @@ Priority : 99 (default priority)
Repository priorities are without effect. All enabled repositories share the same priority.
```
-Use `addrepo` or `ar` switch with `zypper` to add repo in Suse. Followed by URI and lastly you need to provide alias as well.
+在 Suse 中使用附带 `addrepo` 或 `ar` 开关的 `zypper` 命令添加仓库,后接 URI 以及你需要提供一个别名。
-To remove repo in Suse, use `removerepo` or `rr` switch with `zypper`.
+要在 Suse 中移除一个仓库,使用附带 `removerepo` 或 `rr` 开关的 `zypper` 命令。
```
root@kerneltalks # zypper removerepo nVidia-Driver-SLE12-SP3
Removing repository 'nVidia-Driver-SLE12-SP3' ....................................................................................................................[done]
Repository 'nVidia-Driver-SLE12-SP3' has been removed.
```
-##### Clean local zypper cache
+##### 清除 zypper 本地缓存
-Cleaning up local zypper caches with `zypper clean` command –
+使用 `zypper clean` 命令清除 zypper 本地缓存。
```
root@kerneltalks # zypper clean
@@ -422,7 +413,7 @@ All repositories have been cleaned up.
via: https://kerneltalks.com/commands/12-useful-zypper-command-examples/
作者:[KernelTalks][a]
-译者:[译者ID](https://github.com/译者ID)
+译者:[cycoe](https://github.com/cycoe)
校对:[校对者ID](https://github.com/校对者ID)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/translated/tech/20180331 Emacs -4- Automated emails to org-mode and org-mode syncing.md b/translated/tech/20180331 Emacs -4- Automated emails to org-mode and org-mode syncing.md
new file mode 100644
index 0000000000..976979192f
--- /dev/null
+++ b/translated/tech/20180331 Emacs -4- Automated emails to org-mode and org-mode syncing.md
@@ -0,0 +1,71 @@
+Emacs #4:使用org-mode自动管理邮件及同步文档
+======
+这是 [Emacs 和 org-mode 系类][4]的第四篇。
+
+至今为止,你已经见识到了 org-mode 的强大和高效,如果你像我一样,你可能会想:
+
+“我真的很想让它在我所有的设备上同步。”
+
+或者是说:
+
+“我能在 org-mode 中转发邮件吗?”
+
+答案当然是肯定的,因为这就是 Emacs。
+
+### 同步
+
+由于 org-mode 只使用文本文件,所以使用任意工具都可以很容易地实现同步。我使用的是 git 的 git-remote-gcrypt。由于 git-remote-gcrypt 的一些限制,每台机器都倾向于推到自己的分支,并使用命令来控制。每台机子都会先合并其他所有的 branch 然后再将合并后的结果 push 到 master 上。cron 作业可以实现将机器上的 branch push 上去,而 elisp 会协调这一切--确保在同步之前保存缓冲区,在同步之后从磁盘刷新缓冲区,等等。
+
+这篇文章的代码有点多,所以我将把它链接到 github 上,而不是写在这里。
+
+
+我有一个用来存放我所有的 org-stuff 的目录 $HOME/org,在 ~/org 目录下有个 [Makefile][2] 文件来处理同步。该文件定义了一下目标:
+ * push: 添加,提交和 push 到以主机命名的 branch 上
+ * fetch: 一个简单的 git fetch
+ * sync: 添加,提交和 pull 远程的修改,合并并将其 push 到以主机命名的 branch 和 master 上(假设合并成功)
+
+
+现在,在我的用户 crontab 中有这个:
+```
+*/15 * * * * make -C $HOME/org push fetch 2>&1 | logger --tag 'orgsync'
+
+```
+[accompanying elisp code][3] 定义了一个快捷键(C-c s)来调用同步。多亏了 cronjob,只要文件被保存 -- 即使我没有在另一个 boxen 上同步 -- 它们也会被 pull 进来。
+
+我发现这个设置非常好用。
+
+### 用 org-mode 发邮件
+
+在继续下去之前,首先要问自己一下:你真的需要它吗? 我用的是带有 [mu4e][4] 的 org-mode,而且它集成的也很好;任何组织任务都可以通过 message-id 链接到电子邮件,这很理想 -- 它可以让一个人做一些事情,比如提醒他在一周内回复一条消息。
+
+然而,org 不仅仅只有提醒。它还是一个知识库、创作系统等,但是并不是我所有的邮件客户端都使用 mu4e。(注意:像 MobileOrg 是存在于移动设备中)。我并没有像我想的那样经常使用它,但是它有它的用途,所以我认为我也应该在这里记录它。
+
+现在我不仅想处理纯文本电子邮件。我希望能够处理附件、HTML 邮件等。这听起来很快就有问题了 -- 但是通过使用 ripmime 和 pandoc 这样的工具,情况还不错。
+
+第一步就是要用某些方法将获取到的邮件放入指定的文件夹下。扩展名,特殊用户等。然后我用 [fetchmail configuration][5] 来将它 pull 下来并运行我自己的 [insorgmail][6] 脚本。
+
+这个脚本就是处理所有有趣的部分了。它从 ripmime 开始处理消息,用 pandoc 将HTML 的部分转换为 org 格式。 org 的层次结构是用来尽可能最好地表示 email 的结构。使用HTML和其他工具时,email 可能会变得相当复杂,但我发现这对于我来说是可以接受的。
+
+### 下一篇
+
+我最后一篇关于 org-mode 的文章将讨论如何使用它来编写文档和准备幻灯片 -- 我发现自己对 org-mode 的使用非常满意,但这需要一些调整。
+
+
+
+--------------------------------------------------------------------------------
+
+via: http://changelog.complete.org/archives/9898-emacs-4-automated-emails-to-org-mode-and-org-mode-syncing
+
+作者:[John Goerzen][a]
+译者:[oneforalone](https://github.com/oneforalone)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:http://changelog.complete.org/
+[1]:https://changelog.complete.org/archives/tag/emacs2018
+[2]:https://github.com/jgoerzen/public-snippets/blob/master/emacs/org-tools/Makefile
+[3]:https://github.com/jgoerzen/public-snippets/blob/master/emacs/org-tools/emacs-config.org
+[4]:https://www.emacswiki.org/emacs/mu4e
+[5]:https://github.com/jgoerzen/public-snippets/blob/master/emacs/org-tools/fetchmailrc.orgmail
+[6]:https://github.com/jgoerzen/public-snippets/blob/master/emacs/org-tools/insorgmail
diff --git a/translated/tech/20180403 17 Ways To Check Size Of Physical Memory (RAM) In Linux.md b/translated/tech/20180403 17 Ways To Check Size Of Physical Memory (RAM) In Linux.md
deleted file mode 100644
index 6e873551b3..0000000000
--- a/translated/tech/20180403 17 Ways To Check Size Of Physical Memory (RAM) In Linux.md
+++ /dev/null
@@ -1,456 +0,0 @@
-在 Linux 中 17 种方法来查看物理内存(RAM)
-=======
-
-大多数系统管理员在遇到性能问题时会检查 CPU 和内存利用率。
-
-Linux 中有许多实用程序可以用于检查物理内存。
-
-这些命令有助于我们检查系统中存在的物理 RAM,还允许用户检查各种方面的内存利用率。
-
-我们大多数人只知道很少的命令,在本文中我们试图包含所有可能的命令。
-
-你可能会想,为什么我想知道所有这些命令,而不是知道一些特定的和例行的命令。
-
-不要认为不好或采取负面的方式,因为每个人都有不同的需求和看法,所以,对于那些在寻找其它目的的人,这对于他们非常有帮助。
-
-### 什么是 RAM
-
-计算机内存是能够临时或永久存储信息的物理设备。RAM 代表随机存取存储器,它是一种易失性存储器,用于存储操作系统,软件和硬件使用的信息。
-
-有两种类型的内存可供选择:
- * 主存
- * 辅助内存
-
-主存是计算机的主存储器。CPU 可以直接读取或写入此内存。它固定在电脑的主板上。
-
- * **`RAM:`** 随机存取存储器是临时存储。关闭计算机后,此信息将消失。
- * **`ROM:`** 只读存储器是永久存储,即使系统关闭也能保存数据。
-
-### 方法-1 : 使用 free 命令
-
-free 显示系统中空闲和已用的物理内存和交换内存的总量,以及内核使用的缓冲区和缓存。它通过解析 /proc/meminfo 来收集信息。
-
-**建议阅读:** [free – 在 Linux 系统中检查内存使用情况统计(空闲和已用)的标准命令][1]
-```
-$ free -m
- total used free shared buff/cache available
-Mem: 1993 1681 82 81 228 153
-Swap: 12689 1213 11475
-
-$ free -g
- total used free shared buff/cache available
-Mem: 1 1 0 0 0 0
-Swap: 12 1 11
-
-```
-
-### 方法-2 : 使用 /proc/meminfo 文件
-
-/proc/meminfo 是一个虚拟文本文件,它包含有关系统 RAM 使用情况的大量有价值的信息。
-
-它报告系统上的空闲和已用内存(物理和交换)的数量。
-```
-$ grep MemTotal /proc/meminfo
-MemTotal: 2041396 kB
-
-$ grep MemTotal /proc/meminfo | awk '{print $2 / 1024}'
-1993.55
-
-$ grep MemTotal /proc/meminfo | awk '{print $2 / 1024 / 1024}'
-1.94683
-
-```
-
-### 方法-3 : 使用 top 命令
-
-Top 命令是 Linux 中监视实时系统进程的基本命令之一。它显示系统信息和运行的进程信息,如正常运行时间,平均负载,正在运行的任务,登录的用户数,CPU 数量和 CPU 利用率,以及内存和交换信息。运行 top 命令,然后按下 `E` 来使内存利用率以 MB 为单位。
-
-**建议阅读:** [TOP 命令示例监视服务器性能][2]
-```
-$ top
-
-top - 14:38:36 up 1:59, 1 user, load average: 1.83, 1.60, 1.52
-Tasks: 223 total, 2 running, 221 sleeping, 0 stopped, 0 zombie
-%Cpu(s): 48.6 us, 11.2 sy, 0.0 ni, 39.3 id, 0.3 wa, 0.0 hi, 0.5 si, 0.0 st
-MiB Mem : 1993.551 total, 94.184 free, 1647.367 used, 252.000 buff/cache
-MiB Swap: 12689.58+total, 11196.83+free, 1492.750 used. 306.465 avail Mem
-
- PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
- 9908 daygeek 20 0 2971440 649324 39700 S 55.8 31.8 11:45.74 Web Content
-21942 daygeek 20 0 2013760 308700 69272 S 35.0 15.1 4:13.75 Web Content
- 4782 daygeek 20 0 3687116 227336 39156 R 14.5 11.1 16:47.45 gnome-shell
-
-```
-
-### 方法-4 : 使用 vmstat 命令
-
-vmstat 是一个标准且漂亮的工具,它报告 Linux 系统的虚拟内存统计信息。vmstat 报告有关进程,内存,分页,块 IO,陷阱和 CPU 活动的信息。它有助于 Linux 管理员在故障检修时识别系统瓶颈。
-
-**建议阅读:** [vmstat – 一个报告虚拟内存统计信息的标准且漂亮的工具][3]
-```
-$ vmstat -s | grep "total memory"
- 2041396 K total memory
-
-$ vmstat -s -S M | egrep -ie 'total memory'
- 1993 M total memory
-
-$ vmstat -s | awk '{print $1 / 1024 / 1024}' | head -1
-1.94683
-
-```
-
-### 方法-5 : 使用 nmon 命令
-
-nmon 是另一个很棒的工具,用于监视各种系统资源,如 CPU,内存,网络,磁盘,文件系统,NFS,top 进程,Power 微分区和 Linux 终端上的资源(Linux 版本和处理器)。
-
-只需按下 `m` 键,即可查看内存利用率统计数据(缓存,活动,非活动,缓冲,空闲,以 MB 和百分比为单位)。
-
-**建议阅读:** [nmon – Linux 中一个监视系统资源的漂亮的工具][4]
-```
-┌nmon─14g──────[H for help]───Hostname=2daygeek──Refresh= 2secs ───07:24.44─────────────────┐
-│ Memory Stats ─────────────────────────────────────────────────────────────────────────────│
-│ RAM High Low Swap Page Size=4 KB │
-│ Total MB 32079.5 -0.0 -0.0 20479.0 │
-│ Free MB 11205.0 -0.0 -0.0 20479.0 │
-│ Free Percent 34.9% 100.0% 100.0% 100.0% │
-│ MB MB MB │
-│ Cached= 19763.4 Active= 9617.7 │
-│ Buffers= 172.5 Swapcached= 0.0 Inactive = 10339.6 │
-│ Dirty = 0.0 Writeback = 0.0 Mapped = 11.0 │
-│ Slab = 636.6 Commit_AS = 118.2 PageTables= 3.5 │
-│───────────────────────────────────────────────────────────────────────────────────────────│
-│ │
-│ │
-│ │
-│ │
-│ │
-│ │
-└───────────────────────────────────────────────────────────────────────────────────────────┘
-
-```
-
-### 方法-6 : 使用 dmidecode 命令
-
-Dmidecode 是一个读取计算机 DMI表内容的工具,它以人类可读的格式显示系统硬件信息。(DMI 代表桌面管理接口,有人说 SMBIOS 代表系统管理 BIOS)
-
-此表包含系统硬件组件的描述,以及其它有用信息,如序列号,制造商信息,发布日期和 BIOS 修改等。
-
-**建议阅读:**
-[Dmidecode – 获取 Linux 系统硬件信息的简便方法][5]
-```
-# dmidecode -t memory | grep Size:
- Size: 8192 MB
- Size: No Module Installed
- Size: No Module Installed
- Size: 8192 MB
- Size: No Module Installed
- Size: No Module Installed
- Size: No Module Installed
- Size: No Module Installed
- Size: No Module Installed
- Size: No Module Installed
- Size: No Module Installed
- Size: No Module Installed
- Size: 8192 MB
- Size: No Module Installed
- Size: No Module Installed
- Size: 8192 MB
- Size: No Module Installed
- Size: No Module Installed
- Size: No Module Installed
- Size: No Module Installed
- Size: No Module Installed
- Size: No Module Installed
- Size: No Module Installed
- Size: No Module Installed
-
-```
-
-只打印已安装的 RAM 模块。
-```
-
-# dmidecode -t memory | grep Size: | grep -v "No Module Installed"
- Size: 8192 MB
- Size: 8192 MB
- Size: 8192 MB
- Size: 8192 MB
-
-```
-
-汇总所有已安装的 RAM 模块。
-```
-# dmidecode -t memory | grep Size: | grep -v "No Module Installed" | awk '{sum+=$2}END{print sum}'
-32768
-
-```
-
-### 方法-7 : 使用 hwinfo 命令
-
-hwinfo 代表硬件信息,它是另一个很棒的实用工具,用于探测系统中存在的硬件,并以人类可读的格式显示有关各种硬件组件的详细信息。
-
-它报告有关 CPU,RAM,键盘,鼠标,图形卡,声音,存储,网络接口,磁盘,分区,BIOS 和网桥等的信息。
-
-**建议阅读:** [hwinfo(硬件信息)– 一个在 Linux 系统上检测系统硬件信息的好工具][6]
-```
-$ hwinfo --memory
-01: None 00.0: 10102 Main Memory
- [Created at memory.74]
- Unique ID: rdCR.CxwsZFjVASF
- Hardware Class: memory
- Model: "Main Memory"
- Memory Range: 0x00000000-0x7a4abfff (rw)
- Memory Size: 1 GB + 896 MB
- Config Status: cfg=new, avail=yes, need=no, active=unknown
-
-```
-
-### 方法-8 : 使用 lshw 命令
-
-lshw(代表 Hardware Lister)是一个小巧的工具,可以生成机器上各种硬件组件的详细报告,如内存配置,固件版本,主板配置,CPU 版本和速度,缓存配置,USB,网卡,显卡,多媒体,打印机,总线速度等。
-
-它通过读取 /proc 目录和 DMI 表中的各种文件来生成硬件信息。
-
-**建议阅读:** [LSHW (Hardware Lister) – 一个在 Linux 上获取硬件信息的好工具][7]
-```
-$ sudo lshw -short -class memory
-[sudo] password for daygeek:
-H/W path Device Class Description
-==================================================
-/0/0 memory 128KiB BIOS
-/0/1 memory 1993MiB System memory
-
-```
-
-### 方法-9 : 使用 inxi 命令
-
-inxi 是一个很棒的工具,它可以检查 Linux 上的硬件信息,并提供了大量的选项来获取 Linux 系统上的所有硬件信息,这些特性是我在 Linux 上的其它工具中从未发现的。它是从 locsmif 编写的古老的但至今看来都异常灵活的 infobash 演化而来的。
-
-inxi 是一个脚本,它可以快速显示系统硬件,CPU,驱动程序,Xorg,桌面,内核,GCC 版本,进程,RAM 使用情况以及各种其它有用的信息,还可以用于论坛技术支持和调试工具。
-
-**建议阅读:** [inxi – 一个检查 Linux 上硬件信息的好工具][8]
-```
-$ inxi -F | grep "Memory"
-Info: Processes: 234 Uptime: 3:10 Memory: 1497.3/1993.6MB Client: Shell (bash) inxi: 2.3.37
-
-```
-
-### 方法-10 : 使用 screenfetch 命令
-
-screenFetch 是一个 bash 脚本。它将自动检测你的发行版,并在右侧显示该发行版标识的 ASCII 艺术版本和一些有价值的信息。
-
-**建议阅读:** [ScreenFetch – 以 ASCII 艺术标志在终端显示 Linux 系统信息][9]
-```
-$ screenfetch
- ./+o+- [email protected]
- yyyyy- -yyyyyy+ OS: Ubuntu 17.10 artful
- ://+//////-yyyyyyo Kernel: x86_64 Linux 4.13.0-37-generic
- .++ .:/++++++/-.+sss/` Uptime: 44m
- .:++o: /++++++++/:--:/- Packages: 1831
- o:+o+:++.`..```.-/oo+++++/ Shell: bash 4.4.12
- .:+o:+o/. `+sssoo+/ Resolution: 1920x955
- .++/+:+oo+o:` /sssooo. DE: GNOME
- /+++//+:`oo+o /::--:. WM: GNOME Shell
- \+/+o+++`o++o ++////. WM Theme: Adwaita
- .++.o+++oo+:` /dddhhh. GTK Theme: Azure [GTK2/3]
- .+.o+oo:. `oddhhhh+ Icon Theme: Papirus-Dark
- \+.++o+o``-````.:ohdhhhhh+ Font: Ubuntu 11
- `:o+++ `ohhhhhhhhyo++os: CPU: Intel Core i7-6700HQ @ 2x 2.592GHz
- .o:`.syhhhhhhh/.oo++o` GPU: llvmpipe (LLVM 5.0, 256 bits)
- /osyyyyyyo++ooo+++/ RAM: 1521MiB / 1993MiB
- ````` +oo+++o\:
- `oo++.
-
-```
-
-### 方法-11 : 使用 neofetch 命令
-
-Neofetch 是一个跨平台且易于使用的命令行(CLI)脚本,它收集你的 Linux 系统信息,并将其作为一张图片显示在终端上,也可以是你的发行版徽标,或者是你选择的任何 ascii 艺术。
-
-**建议阅读:** [Neofetch – 以 ASCII 分发标志来显示 Linux 系统信息][10]
-```
-$ neofetch
- .-/+oossssoo+/-. [email protected]
- `:+ssssssssssssssssss+:` --------------
- -+ssssssssssssssssssyyssss+- OS: Ubuntu 17.10 x86_64
- .ossssssssssssssssssdMMMNysssso. Host: VirtualBox 1.2
- /ssssssssssshdmmNNmmyNMMMMhssssss/ Kernel: 4.13.0-37-generic
- +ssssssssshmydMMMMMMMNddddyssssssss+ Uptime: 47 mins
- /sssssssshNMMMyhhyyyyhmNMMMNhssssssss/ Packages: 1832
-.ssssssssdMMMNhsssssssssshNMMMdssssssss. Shell: bash 4.4.12
-+sssshhhyNMMNyssssssssssssyNMMMysssssss+ Resolution: 1920x955
-ossyNMMMNyMMhsssssssssssssshmmmhssssssso DE: ubuntu:GNOME
-ossyNMMMNyMMhsssssssssssssshmmmhssssssso WM: GNOME Shell
-+sssshhhyNMMNyssssssssssssyNMMMysssssss+ WM Theme: Adwaita
-.ssssssssdMMMNhsssssssssshNMMMdssssssss. Theme: Azure [GTK3]
- /sssssssshNMMMyhhyyyyhdNMMMNhssssssss/ Icons: Papirus-Dark [GTK3]
- +sssssssssdmydMMMMMMMMddddyssssssss+ Terminal: gnome-terminal
- /ssssssssssshdmNNNNmyNMMMMhssssss/ CPU: Intel i7-6700HQ (2) @ 2.591GHz
- .ossssssssssssssssssdMMMNysssso. GPU: VirtualBox Graphics Adapter
- -+sssssssssssssssssyyyssss+- Memory: 1620MiB / 1993MiB
- `:+ssssssssssssssssss+:`
- .-/+oossssoo+/-.
-
-```
-
-### 方法-12 : 使用 dmesg 命令
-
-dmesg(代表显示消息或驱动消息)是大多数类 unix 操作系统上的命令,用于打印内核的消息缓冲区。
-```
-$ dmesg | grep "Memory"
-[ 0.000000] Memory: 1985916K/2096696K available (12300K kernel code, 2482K rwdata, 4000K rodata, 2372K init, 2368K bss, 110780K reserved, 0K cma-reserved)
-[ 0.012044] x86/mm: Memory block size: 128MB
-
-```
-
-### 方法-13 : 使用 atop 命令
-
-Atop 是一个用于 Linux 的 ASCII 全屏系统性能监视工具,它能报告所有服务器进程的活动(即使进程在间隔期间已经完成)。
-
-它记录系统和进程活动以进行长期分析(默认情况下,日志文件保存 28 天),通过使用颜色等来突出显示过载的系统资源。它结合可选的内核模块 netatop 显示每个进程或线程的网络活动。
-
-**建议阅读:** [Atop – 实时监控系统性能,资源,进程和检查资源利用历史][11]
-```
-$ atop -m
-
-ATOP - ubuntu 2018/03/31 19:34:08 ------------- 10s elapsed
-PRC | sys 0.47s | user 2.75s | | | #proc 219 | #trun 1 | #tslpi 802 | #tslpu 0 | #zombie 0 | clones 7 | | | #exit 4 |
-CPU | sys 7% | user 22% | irq 0% | | | idle 170% | wait 0% | | steal 0% | guest 0% | | curf 2.59GHz | curscal ?% |
-cpu | sys 3% | user 11% | irq 0% | | | idle 85% | cpu001 w 0% | | steal 0% | guest 0% | | curf 2.59GHz | curscal ?% |
-cpu | sys 4% | user 11% | irq 0% | | | idle 85% | cpu000 w 0% | | steal 0% | guest 0% | | curf 2.59GHz | curscal ?% |
-CPL | avg1 1.98 | | avg5 3.56 | avg15 3.20 | | | csw 14894 | | intr 6610 | | | numcpu 2 | |
-MEM | tot 1.9G | free 101.7M | cache 244.2M | dirty 0.2M | buff 6.9M | slab 92.9M | slrec 35.6M | shmem 97.8M | shrss 21.0M | shswp 3.2M | vmbal 0.0M | hptot 0.0M | hpuse 0.0M |
-SWP | tot 12.4G | free 11.6G | | | | | | | | | vmcom 7.9G | | vmlim 13.4G |
-PAG | scan 0 | steal 0 | | stall 0 | | | | | | | swin 3 | | swout 0 |
-DSK | sda | busy 0% | | read 114 | write 37 | KiB/r 21 | KiB/w 6 | | MBr/s 0.2 | MBw/s 0.0 | avq 6.50 | | avio 0.26 ms |
-NET | transport | tcpi 11 | tcpo 17 | udpi 4 | udpo 8 | tcpao 3 | tcppo 0 | | tcprs 3 | tcpie 0 | tcpor 0 | udpnp 0 | udpie 0 |
-NET | network | ipi 20 | | ipo 33 | ipfrw 0 | deliv 20 | | | | | icmpi 5 | | icmpo 0 |
-NET | enp0s3 0% | pcki 11 | pcko 28 | sp 1000 Mbps | si 1 Kbps | so 1 Kbps | | coll 0 | mlti 0 | erri 0 | erro 0 | drpi 0 | drpo 0 |
-NET | lo ---- | pcki 9 | pcko 9 | sp 0 Mbps | si 0 Kbps | so 0 Kbps | | coll 0 | mlti 0 | erri 0 | erro 0 | drpi 0 | drpo 0 |
-
- PID TID MINFLT MAJFLT VSTEXT VSLIBS VDATA VSTACK VSIZE RSIZE PSIZE VGROW RGROW SWAPSZ RUID EUID MEM CMD 1/1
- 2536 - 941 0 188K 127.3M 551.2M 144K 2.3G 281.2M 0K 0K 344K 6556K daygeek daygeek 14% Web Content
- 2464 - 75 0 188K 187.7M 680.6M 132K 2.3G 226.6M 0K 0K 212K 42088K daygeek daygeek 11% firefox
- 2039 - 4199 6 16K 163.6M 423.0M 132K 3.5G 220.2M 0K 0K 2936K 109.6M daygeek daygeek 11% gnome-shell
- 10822 - 1 0 4K 16680K 377.0M 132K 3.4G 193.4M 0K 0K 0K 0K root root 10% java
-
-```
-
-### 方法-14 : 使用 htop 命令
-
-htop 是由 Hisham 用 ncurses 库开发的用于 Linux 的交互式进程查看器。与 top 命令相比,htop 有许多特性和选项。
-
-**建议阅读:** [使用 Htop 命令监视系统资源][12]
-```
-$ htop
-
- 1 [||||||||||||| 13.0%] Tasks: 152, 587 thr; 1 running
- 2 [||||||||||||||||||||||||| 25.0%] Load average: 0.91 2.03 2.66
- Mem[||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||1.66G/1.95G] Uptime: 01:14:53
- Swp[|||||| 782M/12.4G]
-
- PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command
- 2039 daygeek 20 0 3541M 214M 46728 S 36.6 10.8 22:36.77 /usr/bin/gnome-shell
- 2045 daygeek 20 0 3541M 214M 46728 S 10.3 10.8 3:02.92 /usr/bin/gnome-shell
- 2046 daygeek 20 0 3541M 214M 46728 S 8.3 10.8 3:04.96 /usr/bin/gnome-shell
- 6080 daygeek 20 0 807M 37228 24352 S 2.1 1.8 0:11.99 /usr/lib/gnome-terminal/gnome-terminal-server
- 2880 daygeek 20 0 2205M 164M 17048 S 2.1 8.3 7:16.50 /usr/lib/firefox/firefox -contentproc -childID 6 -isForBrowser -intPrefs 6:50|7:-1|19:0|34:1000|42:20|43:5|44:10|51:0|57:128|58:10000|63:0|65:400|66
- 6125 daygeek 20 0 1916M 159M 92352 S 2.1 8.0 2:09.14 /usr/lib/firefox/firefox -contentproc -childID 7 -isForBrowser -intPrefs 6:50|7:-1|19:0|34:1000|42:20|43:5|44:10|51:0|57:128|58:10000|63:0|65:400|66
- 2536 daygeek 20 0 2335M 243M 26792 S 2.1 12.2 6:25.77 /usr/lib/firefox/firefox -contentproc -childID 1 -isForBrowser -intPrefs 6:50|7:-1|19:0|34:1000|42:20|43:5|44:10|51:0|57:128|58:10000|63:0|65:400|66
- 2653 daygeek 20 0 2237M 185M 20788 S 1.4 9.3 3:01.76 /usr/lib/firefox/firefox -contentproc -childID 4 -isForBrowser -intPrefs 6:50|7:-1|19:0|34:1000|42:20|43:5|44:10|51:0|57:128|58:10000|63:0|65:400|66
-
-```
-
-### 方法-15 : 使用 corefreq 实用程序
-
-CoreFreq 是为 Intel 64 位处理器设计的 CPU 监控软件,支持的架构有 Atom,Core2,Nehalem,SandyBridge 和 superior,AMD 家族。(to 校正:这里 OF 最后什么意思)
-
-CoreFreq 提供了一个框架来以高精确度检索 CPU 数据。
-
-**建议阅读:** [CoreFreq – 一个用于 Linux 系统的强大的 CPU 监控工具][13]
-```
-$ ./corefreq-cli -k
-Linux:
-|- Release [4.13.0-37-generic]
-|- Version [#42-Ubuntu SMP Wed Mar 7 14:13:23 UTC 2018]
-|- Machine [x86_64]
-Memory:
-|- Total RAM 2041396 KB
-|- Shared RAM 99620 KB
-|- Free RAM 108428 KB
-|- Buffer RAM 8108 KB
-|- Total High 0 KB
-|- Free High 0 KB
-
-$ ./corefreq-cli -k | grep "Total RAM" | awk '{print $4 / 1024 }'
-1993.55
-
-$ ./corefreq-cli -k | grep "Total RAM" | awk '{print $4 / 1024 / 1024}'
-1.94683
-
-```
-
-### 方法-16 : 使用 glances 命令
-
-Glances 是用 Python 编写的跨平台基于 curses(LCTT 译注:curses 是一个 Linux/Unix 下的图形函数库)的系统监控工具。我们可以说一物俱全,就像在最小的空间含有最大的信息。它使用 psutil 库从系统中获取信息。
-
-Glances 可以监视 CPU,内存,负载,进程列表,网络接口,磁盘 I/O,Raid,传感器,文件系统(和文件夹),Docker,监视器,警报,系统信息,正常运行时间,快速预览(CPU,内存,负载)等。
-
-**建议阅读:** [Glances (一物俱全)– 一个 Linux 的高级的实时系统性能监控工具][14]
-```
-$ glances
-
-ubuntu (Ubuntu 17.10 64bit / Linux 4.13.0-37-generic) - IP 192.168.1.6/24 Uptime: 1:08:40
-
-CPU [|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| 90.6%] CPU - 90.6% nice: 0.0% ctx_sw: 4K MEM \ 78.4% active: 942M SWAP - 5.9% LOAD 2-core
-MEM [||||||||||||||||||||||||||||||||||||||||||||||||||||||||| 78.0%] user: 55.1% irq: 0.0% inter: 1797 total: 1.95G inactive: 562M total: 12.4G 1 min: 4.35
-SWAP [|||| 5.9%] system: 32.4% iowait: 1.8% sw_int: 897 used: 1.53G buffers: 14.8M used: 749M 5 min: 4.38
- idle: 7.6% steal: 0.0% free: 431M cached: 273M free: 11.7G 15 min: 3.38
-
-NETWORK Rx/s Tx/s TASKS 211 (735 thr), 4 run, 207 slp, 0 oth sorted automatically by memory_percent, flat view
-docker0 0b 232b
-enp0s3 12Kb 4Kb Systemd 7 Services loaded: 197 active: 196 failed: 1
-lo 616b 616b
-_h478e48e 0b 232b CPU% MEM% VIRT RES PID USER NI S TIME+ R/s W/s Command
- 63.8 18.9 2.33G 377M 2536 daygeek 0 R 5:57.78 0 0 /usr/lib/firefox/firefox -contentproc -childID 1 -isForBrowser -intPrefs 6:50|7:-1|19:0|34:1000|42:20|43:5|44:10|51
-DefaultGateway 83ms 78.5 10.9 3.46G 217M 2039 daygeek 0 S 21:07.46 0 0 /usr/bin/gnome-shell
- 8.5 10.1 2.32G 201M 2464 daygeek 0 S 8:45.69 0 0 /usr/lib/firefox/firefox -new-window
-DISK I/O R/s W/s 1.1 8.5 2.19G 170M 2653 daygeek 0 S 2:56.29 0 0 /usr/lib/firefox/firefox -contentproc -childID 4 -isForBrowser -intPrefs 6:50|7:-1|19:0|34:1000|42:20|43:5|44:10|51
-dm-0 0 0 1.7 7.2 2.15G 143M 2880 daygeek 0 S 7:10.46 0 0 /usr/lib/firefox/firefox -contentproc -childID 6 -isForBrowser -intPrefs 6:50|7:-1|19:0|34:1000|42:20|43:5|44:10|51
-sda1 9.46M 12K 0.0 4.9 1.78G 97.2M 6125 daygeek 0 S 1:36.57 0 0 /usr/lib/firefox/firefox -contentproc -childID 7 -isForBrowser -intPrefs 6:50|7:-1|19:0|34:1000|42:20|43:5|44:10|51
-
-```
-
-### 方法-17 : 使用 gnome-system-monitor
-
-系统监视器是一个管理正在运行的进程和监视系统资源的工具。它向你显示正在运行的程序以及耗费的处理器时间,内存和磁盘空间。
-![][16]
-
-
-
---------------------------------------------------------------------------------
-
-via: https://www.2daygeek.com/easy-ways-to-check-size-of-physical-memory-ram-in-linux/
-
-作者:[Ramya Nuvvula][a]
-译者:[MjSeven](https://github.com/MjSeven)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://www.2daygeek.com/author/ramya/
-[1]:https://www.2daygeek.com/free-command-to-check-memory-usage-statistics-in-linux/
-[2]:https://www.2daygeek.com/top-command-examples-to-monitor-server-performance/
-[3]:https://www.2daygeek.com/linux-vmstat-command-examples-tool-report-virtual-memory-statistics/
-[4]:https://www.2daygeek.com/nmon-system-performance-monitor-system-resources-on-linux/
-[5]:https://www.2daygeek.com/dmidecode-get-print-display-check-linux-system-hardware-information/
-[6]:https://www.2daygeek.com/hwinfo-check-display-detect-system-hardware-information-linux/
-[7]:https://www.2daygeek.com/lshw-find-check-system-hardware-information-details-linux/
-[8]:https://www.2daygeek.com/inxi-system-hardware-information-on-linux/
-[9]:https://www.2daygeek.com/screenfetch-display-linux-systems-information-ascii-distribution-logo-terminal/
-[10]:https://www.2daygeek.com/neofetch-display-linux-systems-information-ascii-distribution-logo-terminal/
-[11]:https://www.2daygeek.com/atop-system-process-performance-monitoring-tool/
-[12]:https://www.2daygeek.com/htop-command-examples-to-monitor-system-resources/
-[13]:https://www.2daygeek.com/corefreq-linux-cpu-monitoring-tool/
-[14]:https://www.2daygeek.com/install-glances-advanced-real-time-linux-system-performance-monitoring-tool-on-centos-fedora-ubuntu-debian-opensuse-arch-linux/
-[15]:data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
-[16]:https://www.2daygeek.com/wp-content/uploads/2018/03/check-memory-information-using-gnome-system-monitor.png
diff --git a/translated/tech/20180404 Emacs -5- Documents and Presentations with org-mode.md b/translated/tech/20180404 Emacs -5- Documents and Presentations with org-mode.md
new file mode 100644
index 0000000000..ad420da202
--- /dev/null
+++ b/translated/tech/20180404 Emacs -5- Documents and Presentations with org-mode.md
@@ -0,0 +1,176 @@
+Emacs #5: org-mode 之文档与 Presentations
+======
+
+### 1 org-mode 的输出
+
+#### 1.1 背景
+
+org-mode 不仅仅只是一个议程生成程序, 它也能输出许多不同的格式: LaTeX,PDF,Beamer,iCalendar(议程),HTML,Markdown,ODT,普通文本,帮助页面(man pages)和其它更多的复杂的格式,比如说网页文件。
+
+这也不只是一些事后的想法,这是 org-mode 的设计核心部分并且集成的很好。
+
+一个文件可以同时是源代码,自动生成的输出,任务列表,文档和 presentation。
+
+有些人将 org-mode 作为他们首选的标记格式,甚至对于 LaTeX 文档也是如此。org-mode 手册中的 [section on exporting][13] 有更详细的介绍。
+
+#### 1.2 开始
+
+对于任意的 org-mode 的文档,只要按下 C-c C-e键,就会弹出一个让你选择多种输出格式和选项的菜单。这些选项通常是次键选择,所以很容易设置和执行。例如:要输出一个 PDF 文档,按 C-c C-e l p,要输出 HMTL 格式的, 按 C-c C-e h h。
+
+对于所有的输出选项,都有许多可用的设置;详情参见手册。事实上,使用 LaTeX 格式相当于同时使用 LaTeX 和 HTML 模式,在不同的模式中插入任意的前言和设置等。
+
+#### 1.3 第三方插件
+
+[ELPA][19] 中也包含了许多额外的输出格式,详情参见 [ELPA][19].
+
+### 2 org-mode 的 Beamer 演示
+
+#### 2.1 关于 Beamer
+
+[Beamer][14] 是一个生成 presentation 的 LaTeX 环境. 它包括了一下特性:
+
+* 在 presentation 中自动生成结构化的元素(例如 [the Marburg theme][1])。 在 presentation 时,这个特性可以为观众提供了视觉参考。
+
+* 对组织 presentation 有很大的帮助。
+
+* 主题
+
+* 完全支持 LaTeX
+
+#### 2.2 org-mode 中 Beamer 的优点
+
+在 org-mode 中用 Beamer 有很多好处,总的来说:
+
+* org-mode 很简单而且对可视化支持的很好,同时改变结构可以快速的重组你的材料。
+
+* 与 org-babel 绑定在一起,实时语法高亮源码和内嵌结果。
+
+* 语法通常更容易使用。
+
+我已经完全用 org-mode 和 beamer 替换掉 LibreOffice/Powerpoint/GoogleDocs 的使用。事实上,当我必须使用其中一种工具时,这是相当令人沮丧的,因为它们在可视化表示结构方面远远比不上 org-mode。
+
+#### 2.3 标题层次
+
+org-mode 的 Beamer 会将你文档中的部分(文中定义了标题的)转换成幻灯片。当然,问题是:哪些部分?这是由 H [export setting][15](org-export-headline-levels)决定的。
+
+针对不同的人,有许多不同的方法。我比较喜欢我的 presentation 这样:
+
+```
+#+OPTIONS: H:2
+#+BEAMER_HEADER: \AtBeginSection{\frame{\sectionpage}}
+```
+
+这将为每个主题提供了独立部分,以突出主题的改变然后使用级别 2(两个星号)的标题来设置幻灯片。许多 Beamer 主题也有第三个间接层次,所以你可以将 H 设为 3。
+
+#### 2.4 主题和配置
+
+你可以在 org 文件的顶部来插入几行来配置 Beamer 和 LaTeX。在本文中,例如,你可以这样定义:
+
+```
+#+TITLE: Documents and presentations with org-mode
+#+AUTHOR: John Goerzen
+#+BEAMER_HEADER: \institute{The Changelog}
+#+PROPERTY: comments yes
+#+PROPERTY: header-args :exports both :eval never-export
+#+OPTIONS: H:2
+#+BEAMER_THEME: CambridgeUS
+#+BEAMER_COLOR_THEME: default
+```
+
+#### 2.5 高级设置
+
+我比教喜欢修改颜色、项目符号样式等。我的配置如下:
+
+```
+# We can't just +BEAMER_INNER_THEME: default because that picks the theme default.
+# Override per https://tex.stackexchange.com/questions/11168/change-bullet-style-formatting-in-beamer
+#+BEAMER_INNER_THEME: default
+#+LaTeX_CLASS_OPTIONS: [aspectratio=169]
+#+BEAMER_HEADER: \definecolor{links}{HTML}{0000A0}
+#+BEAMER_HEADER: \hypersetup{colorlinks=,linkcolor=,urlcolor=links}
+#+BEAMER_HEADER: \setbeamertemplate{itemize items}[default]
+#+BEAMER_HEADER: \setbeamertemplate{enumerate items}[default]
+#+BEAMER_HEADER: \setbeamertemplate{items}[default]
+#+BEAMER_HEADER: \setbeamercolor*{local structure}{fg=darkred}
+#+BEAMER_HEADER: \setbeamercolor{section in toc}{fg=darkred}
+#+BEAMER_HEADER: \setlength{\parskip}{\smallskipamount}
+```
+
+在这里, aspectratio=169 将纵横比设为 16:9, 其它部分都是标准的 LaTeX/Beamer 配置。
+
+#### 2.6 缩小 (适应屏幕)
+
+有时你会遇到一些非常大的代码示例,你可能更倾向与将幻灯片缩小以适应它们。
+
+只要按下 C-c C-c p 将 BEAMER_opt属性设为 shrink=15\.(或者设为更大的 shrink 值)。上一张幻灯片就用到了这个。
+
+#### 2.7 效果
+
+这就是最终的效果:
+
+ [][16]
+
+### 3 幻灯片之间的交互
+
+#### 3.1 交互式的 Emacs 幻灯片
+
+使用 [org-tree-slide package][17] 这个插件的话, 就可以在 Emacs 的右侧显示幻灯片了。 只要按下 M-x,然后输入 org-tree-slide-mode,回车,然后你就可以用 C-> 和 C-< 在幻灯片之间切换了。
+
+你可能会发现 C-c C-x C-v (即 org-toggle-inline-images)有助于使系统显示内嵌的图像。
+
+#### 3.2 HTML 幻灯片
+
+有许多方式可以将 org-mode 的 presentation 导出为 HTML,并有不同级别的 JavaScript 集成。有关详细信息,请参见 org-mode 的 wiki 中的 [non-beamer presentations section][18]。
+
+### 4 更多
+
+#### 4.1 本文中的附加资源
+
+* [orgmode.org beamer tutorial][2]
+
+* [LaTeX wiki][3]
+
+* [Generating section title slides][4]
+
+* [Shrinking content to fit on slide][5]
+
+* 很棒的资源: refcard-org-beamer 详情参见其 [Github repo][6] 中的 PDF 和 .org 文件。
+
+* 很漂亮的主题: [Theme matrix][7]
+
+#### 4.2 下一个 Emacs 系列
+
+mu4e 邮件!
+
+
+--------------------------------------------------------------------------------
+
+via: http://changelog.complete.org/archives/9900-emacs-5-documents-and-presentations-with-org-mode
+
+作者:[John Goerzen][a]
+译者:[oneforalone](https://github.com/oneforalone)
+校对:[校对者ID](https://github.com/校对者ID)
+选题:[lujun9972](https://github.com/lujun9972)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:http://changelog.complete.org/archives/author/jgoerzen
+[1]:https://hartwork.org/beamer-theme-matrix/all/beamer-albatross-Marburg-1.png
+[2]:https://orgmode.org/worg/exporters/beamer/tutorial.html
+[3]:https://en.wikibooks.org/wiki/LaTeX/Presentations
+[4]:https://tex.stackexchange.com/questions/117658/automatically-generate-section-title-slides-in-beamer/117661
+[5]:https://tex.stackexchange.com/questions/78514/content-doesnt-fit-in-one-slide
+[6]:https://github.com/fniessen/refcard-org-beamer
+[7]:https://hartwork.org/beamer-theme-matrix/
+[8]:https://changelog.complete.org/archives/tag/emacs2018
+[9]:https://github.com/jgoerzen/public-snippets/blob/master/emacs/emacs-org-beamer/emacs-org-beamer.org
+[10]:http://changelog.complete.org/archives/9900-emacs-5-documents-and-presentations-with-org-mode
+[11]:https://github.com/jgoerzen/public-snippets/raw/master/emacs/emacs-org-beamer/emacs-org-beamer.pdf
+[12]:https://github.com/jgoerzen/public-snippets/raw/master/emacs/emacs-org-beamer/emacs-org-beamer-document.pdf
+[13]:https://orgmode.org/manual/Exporting.html#Exporting
+[14]:https://en.wikipedia.org/wiki/Beamer_(LaTeX)
+[15]:https://orgmode.org/manual/Export-settings.html#Export-settings
+[16]:https://www.flickr.com/photos/jgoerzen/26366340577/in/dateposted/
+[17]:https://orgmode.org/worg/org-tutorials/non-beamer-presentations.html#org-tree-slide
+[18]:https://orgmode.org/worg/org-tutorials/non-beamer-presentations.html
+[19]:https://www.emacswiki.org/emacs/ELPA
diff --git a/translated/tech/20180525 How to Set Different Wallpaper for Each Monitor in Linux.md b/translated/tech/20180525 How to Set Different Wallpaper for Each Monitor in Linux.md
new file mode 100644
index 0000000000..b0b698b764
--- /dev/null
+++ b/translated/tech/20180525 How to Set Different Wallpaper for Each Monitor in Linux.md
@@ -0,0 +1,89 @@
+如何在 Linux 中为每个屏幕设置不同的壁纸
+======
+**简介:如果你想在 Ubuntu 18.04 或任何其他 Linux 发行版上使用 GNOME、MATE 或 Budgie 桌面环境在多个显示器上显示不同的壁纸,这个小工具将帮助你实现这一点。**
+
+多显示器设置通常会在 Linux 上出现多个问题,但我不打算在本文中讨论这些问题。我有一篇关于 Linux 上多显示器支持的文章。
+
+如果你使用多台显示器,也许你想为每台显示器设置不同的壁纸。我不确定其他 Linux 发行版和桌面环境,但是 [GNOME 桌面][1] 的 Ubuntu 本身并不提供此功能。
+
+不要烦恼!在本教程中,我将向你展示如何使用 GNOME 桌面环境为 Linux 发行版上的每个显示器设置不同的壁纸。
+
+### 在 Ubuntu 18.04 和其他 Linux 发行版上为每个显示器设置不同的壁纸
+
+![Different wallaper on each monitor in Ubuntu][2]
+
+我将使用一个名为 [HydraPaper][3] 的小工具在不同的显示器上设置不同的背景。HydraPaper 是一个基于 [GTK][4] 的应用,用于为 [GNOME 桌面环境][5]中的每个显示器设置不同的背景。
+
+它还支持 [MATE][6] 和 [Budgie][7] 桌面环境。这意味着 Ubuntu MATE 和 [Ubuntu Budgie][8] 用户也可以从这个应用中受益。
+
+#### 使用 FlatPak 在 Linux 上安装 HydraPaper
+
+使用 [FlatPak][9] 可以轻松安装 HydraPaper。Ubuntu 18.04已 经提供对 FlatPaks 的支持,所以你需要做的就是下载应用文件并双击在 GNOME 软件中心中打开它。
+
+你可以参考这篇文章来了解如何在你的发行版[启用 FlatPak 支持][10]。启用 FlatPak 支持后,只需从 [FlatHub][11] 下载并安装即可。
+
+[Download HydraPaper][12]
+
+#### 使用 HydraPaper 在不同的显示器上设置不同的背景
+
+安装完成后,只需在应用菜单中查找 HydraPaper 并启动应用。你将在此处看到“图片”文件夹中的图像,因为默认情况下,应用会从用户的“图片”文件夹中获取图像。
+
+你可以添加自己的文件夹来保存壁纸。请注意,它不会递归地查找图像。如果你有嵌套文件夹,它将只显示顶部文件夹中的图像。
+
+![Setting up different wallpaper for each monitor on Linux][13]
+
+使用 HydraPaper 很简单。只需为每个显示器选择壁纸,然后单击顶部的应用按钮。你可以轻松地用 HDMI 标识来识别外部显示器。
+
+![Setting up different wallpaper for each monitor on Linux][14]
+
+你还可以将选定的壁纸添加到“收藏夹”以便快速访问。这样做会将“最喜欢的壁纸”从“壁纸”选项卡移动到“收藏夹”选项卡。
+
+![Setting up different wallpaper for each monitor on Linux][15]
+
+你不需要在每次启动时启动 HydraPaper。为不同的显示器设置不同的壁纸后,设置将被保存,即使重新启动后你也会看到所选择的壁纸。这当然是预期的行为,但我想特别提一下。
+
+HydraPaper 的一大缺点在于它的设计工作方式。你可以看到,HydraPaper 将你选择的壁纸拼接成一张图像并将其拉伸到屏幕上,给人的印象是每个显示器上都有不同的背景。当你移除外部显示器时,这将成为一个问题。
+
+例如,当我尝试使用没有外接显示器的笔记本电脑时,它向我展示了这样的背景图像。
+
+![Dual Monitor wallpaper HydraPaper][16]
+
+很明显,这不是我所期望的。
+
+#### 你喜欢它吗?
+
+HydraPaper 使得在不同的显示器上设置不同的背景变得很方便。它支持超过两个显示器和不同的显示器方向。只有所需功能的简单界面使其成为那些总是使用双显示器的人的理想应用。
+
+如何在 Linux 上为不同的显示器设置不同的壁纸?你认为 HydraPaper 是值得安装的应用吗?
+
+请分享您的观点,另外如果你看到这篇文章,请在各种社交媒体渠道上分享,如 Twitter 和 [Reddit][17]。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/wallpaper-multi-monitor/
+
+作者:[Abhishek Prakash][a]
+选题:[lujun9972](https://github.com/lujun9972)
+译者:[geekpi](https://github.com/geekpi)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/abhishek/
+[1]:https://www.gnome.org/
+[2]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/05/multi-monitor-wallpaper-setup-800x450.jpeg
+[3]:https://github.com/GabMus/HydraPaper
+[4]:https://www.gtk.org/
+[5]:https://itsfoss.com/gnome-tricks-ubuntu/
+[6]:https://mate-desktop.org/
+[7]:https://budgie-desktop.org/home/
+[8]:https://itsfoss.com/ubuntu-budgie-18-review/
+[9]:https://flatpak.org
+[10]:https://flatpak.org/setup/
+[11]:https://flathub.org
+[12]:https://flathub.org/apps/details/org.gabmus.hydrapaper
+[13]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/05/different-wallpaper-each-monitor-hydrapaper-2-800x631.jpeg
+[14]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/05/different-wallpaper-each-monitor-hydrapaper-1.jpeg
+[15]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/05/different-wallpaper-each-monitor-hydrapaper-3.jpeg
+[16]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/05/hydra-paper-dual-monitor-800x450.jpeg
+[17]:https://www.reddit.com/r/LinuxUsersGroup/
\ No newline at end of file
diff --git a/translated/tech/20180530 How To Add, Enable And Disable A Repository In Linux.md b/translated/tech/20180530 How To Add, Enable And Disable A Repository In Linux.md
deleted file mode 100644
index c8cd4ded1b..0000000000
--- a/translated/tech/20180530 How To Add, Enable And Disable A Repository In Linux.md
+++ /dev/null
@@ -1,430 +0,0 @@
-如何在 Linux 中添加,启用和禁用一个仓库
-======
-
-在基于 RPM 的系统上,例如 RHEL, CentOS 等,我们中的许多人使用 yum 包管理器来管理软件的安装,删除,更新,搜索等。
-
-Linux 发行版的大部分软件都来自发行版官方仓库。官方仓库包含大量免费和开源的应用和软件。它很容易安装和使用。
-
-由于一些限制和专有问题,基于 RPM 的发行版在其官方仓库中没有提供某些包。另外,出于稳定性考虑,它不会提供最新版本的核心包。
-
-为了克服这种情况,我们需要安装或启用需要的第三方仓库。对于基于 RPM 的系统,有许多第三方仓库可用,但建议使用的仓库很少,因为它们不会替换大量的基础包。
-
-**建议阅读:**
-**(#)** [在 RHEL/CentOS 系统中使用 YUM 命令管理包][1]
-**(#)** [在 Fedora 系统中使用 DNF (YUM 的分支) 命令来管理包][2]
-**(#)** [命令行包管理器和用法列表][3]
-**(#)** [Linux 包管理器的图形化工具][4]
-
-这可以在基于 RPM 的系统上完成,比如 RHEL, CentOS, OEL, Fedora 等。
- * Fedora 系统使用 “dnf config-manager [options] [section …]”
- * 其它基于 RPM 的系统使用 “yum-config-manager [options] [section …]”
-
-### 如何列出启用的仓库
-
-只需运行以下命令即可检查系统上启用的仓库列表。
-
-对于 CentOS/RHEL/OLE 系统:
-```
-# yum repolist
-Loaded plugins: fastestmirror, security
-Loading mirror speeds from cached hostfile
-repo id repo name status
-base CentOS-6 - Base 6,706
-extras CentOS-6 - Extras 53
-updates CentOS-6 - Updates 1,255
-repolist: 8,014
-
-```
-
-对于 Fedora 系统:
-```
-# dnf repolist
-
-```
-
-### 如何在系统中添加一个新仓库
-
-每个仓库通常都提供自己的 `.repo` 文件。要将此类仓库添加到系统中,使用 root 用户运行以下命令。在我们的例子中将添加 `EPEL Repository` 和 `IUS Community Repo`,见下文。
-
-但是没有 `.repo` 文件可用于这些仓库。因此,我们使用以下方法进行安装。
-
-对于 **EPEL Repository**,因为它可以从 CentOS 额外仓库获得(to 校正:额外仓库什么意思?),所以运行以下命令来安装它。
-```
-# yum install epel-release -y
-
-```
-
-对于 **IUS Community Repo**,运行以下 bash 脚本来安装。
-```
-# curl 'https://setup.ius.io/' -o setup-ius.sh
-# sh setup-ius.sh
-
-```
-
-如果你有 `.repo` 文件,在 RHEL/CentOS/OEL 中,只需运行以下命令来添加一个仓库。
-```
-# yum-config-manager --add-repo http://www.example.com/example.repo
-
-Loaded plugins: product-id, refresh-packagekit, subscription-manager
-adding repo from: http://www.example.com/example.repo
-grabbing file http://www.example.com/example.repo to /etc/yum.repos.d/example.repo
-example.repo | 413 B 00:00
-repo saved to /etc/yum.repos.d/example.repo
-
-```
-
-对于 Fedora 系统,运行以下命令来添加一个仓库。
-```
-# dnf config-manager --add-repo http://www.example.com/example.repo
-
-adding repo from: http://www.example.com/example.repo
-
-```
-
-如果在添加这些仓库之后运行 `yum repolist` 命令,你就可以看到新添加的仓库了。Yes,我看到了。
-
-注意:每当运行 “yum repolist” 命令时,该命令会自动从相应的仓库获取更新,并将缓存保存在本地系统中。
-```
-# yum repolist
-
-Loaded plugins: fastestmirror, security
-Loading mirror speeds from cached hostfile
-epel/metalink | 6.1 kB 00:00
-* epel: epel.mirror.constant.com
-* ius: ius.mirror.constant.com
-ius | 2.3 kB 00:00
-repo id repo name status
-base CentOS-6 - Base 6,706
-epel Extra Packages for Enterprise Linux 6 - x86_64 12,505
-extras CentOS-6 - Extras 53
-ius IUS Community Packages for Enterprise Linux 6 - x86_64 390
-updates CentOS-6 - Updates 1,255
-repolist: 20,909
-
-```
-
-每个仓库都有多个渠道,比如测试,开发和存档(Testing, Dev, Archive)。通过导航到仓库文件位置,你可以更好地理解这一点。
-```
-# ls -lh /etc/yum.repos.d
-total 64K
--rw-r--r-- 1 root root 2.0K Apr 12 02:44 CentOS-Base.repo
--rw-r--r-- 1 root root 647 Apr 12 02:44 CentOS-Debuginfo.repo
--rw-r--r-- 1 root root 289 Apr 12 02:44 CentOS-fasttrack.repo
--rw-r--r-- 1 root root 630 Apr 12 02:44 CentOS-Media.repo
--rw-r--r-- 1 root root 916 May 18 11:07 CentOS-SCLo-scl.repo
--rw-r--r-- 1 root root 892 May 18 10:36 CentOS-SCLo-scl-rh.repo
--rw-r--r-- 1 root root 6.2K Apr 12 02:44 CentOS-Vault.repo
--rw-r--r-- 1 root root 7.9K Apr 12 02:44 CentOS-Vault.repo.rpmnew
--rw-r--r-- 1 root root 957 May 18 10:41 epel.repo
--rw-r--r-- 1 root root 1.1K Nov 4 2012 epel-testing.repo
--rw-r--r-- 1 root root 1.2K Feb 23 2017 ius-archive.repo
--rw-r--r-- 1 root root 1.2K Feb 23 2017 ius-dev.repo
--rw-r--r-- 1 root root 1.1K May 18 10:41 ius.repo
--rw-r--r-- 1 root root 1.2K Feb 23 2017 ius-testing.repo
-
-```
-
-### 如何在系统中启用一个仓库
-
-当你在默认情况下添加一个新仓库时,它将启用它们的稳定仓库,这就是为什么我们在运行 “yum repolist” 命令时要获取仓库信息。在某些情况下,如果你希望启用它们的测试,开发或存档仓库,使用以下命令。另外,我们还可以使用此命令启用任何禁用的仓库。
-
-为了验证这一点,我们将启用 `epel-testing.repo`,运行下面的命令:
-```
-# yum-config-manager --enable epel-testing
-
-Loaded plugins: fastestmirror
-==================================================================================== repo: epel-testing =====================================================================================
-[epel-testing]
-bandwidth = 0
-base_persistdir = /var/lib/yum/repos/x86_64/6
-baseurl =
-cache = 0
-cachedir = /var/cache/yum/x86_64/6/epel-testing
-cost = 1000
-enabled = 1
-enablegroups = True
-exclude =
-failovermethod = priority
-ftp_disable_epsv = False
-gpgcadir = /var/lib/yum/repos/x86_64/6/epel-testing/gpgcadir
-gpgcakey =
-gpgcheck = True
-gpgdir = /var/lib/yum/repos/x86_64/6/epel-testing/gpgdir
-gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
-hdrdir = /var/cache/yum/x86_64/6/epel-testing/headers
-http_caching = all
-includepkgs =
-keepalive = True
-mdpolicy = group:primary
-mediaid =
-metadata_expire = 21600
-metalink =
-mirrorlist = https://mirrors.fedoraproject.org/metalink?repo=testing-epel6&arch=x86_64
-mirrorlist_expire = 86400
-name = Extra Packages for Enterprise Linux 6 - Testing - x86_64
-old_base_cache_dir =
-password =
-persistdir = /var/lib/yum/repos/x86_64/6/epel-testing
-pkgdir = /var/cache/yum/x86_64/6/epel-testing/packages
-proxy = False
-proxy_dict =
-proxy_password =
-proxy_username =
-repo_gpgcheck = False
-retries = 10
-skip_if_unavailable = False
-ssl_check_cert_permissions = True
-sslcacert =
-sslclientcert =
-sslclientkey =
-sslverify = True
-throttle = 0
-timeout = 30.0
-username =
-
-```
-
-运行 “yum repolist” 命令来检查是否启用了 “epel-testing”。它被启用了,我可以从列表中看到它。
-```
-# yum repolist
-Loaded plugins: fastestmirror, security
-Determining fastest mirrors
-epel/metalink | 18 kB 00:00
-epel-testing/metalink | 17 kB 00:00
- * epel: mirror.us.leaseweb.net
- * epel-testing: mirror.us.leaseweb.net
- * ius: mirror.team-cymru.com
-base | 3.7 kB 00:00
-centos-sclo-sclo | 2.9 kB 00:00
-epel | 4.7 kB 00:00
-epel/primary_db | 6.0 MB 00:00
-epel-testing | 4.7 kB 00:00
-epel-testing/primary_db | 368 kB 00:00
-extras | 3.4 kB 00:00
-ius | 2.3 kB 00:00
-ius/primary_db | 216 kB 00:00
-updates | 3.4 kB 00:00
-updates/primary_db | 8.1 MB 00:00 ...
-repo id repo name status
-base CentOS-6 - Base 6,706
-centos-sclo-sclo CentOS-6 - SCLo sclo 495
-epel Extra Packages for Enterprise Linux 6 - x86_64 12,509
-epel-testing Extra Packages for Enterprise Linux 6 - Testing - x86_64 809
-extras CentOS-6 - Extras 53
-ius IUS Community Packages for Enterprise Linux 6 - x86_64 390
-updates CentOS-6 - Updates 1,288
-repolist: 22,250
-
-```
-
-如果你想同时启用多个仓库,使用以下格式。这个命令将启用 epel, epel-testing 和 ius 仓库。
-```
-# yum-config-manager --enable epel epel-testing ius
-
-```
-
-对于 Fedora 系统,运行下面的命令来启用仓库。
-```
-# dnf config-manager --set-enabled epel-testing
-
-```
-
-### 如何在系统中禁用一个仓库
-
-无论何时你在默认情况下添加一个新的仓库,它都会启用它们的稳定仓库,这就是为什么我们在运行 “yum repolist” 命令时要获取仓库信息。如果你不想使用仓库,那么可以通过下面的命令来禁用它。
-
-为了验证这点,我们将要禁用 `epel-testing.repo` 和 `ius.repo`,运行以下命令:
-```
-# yum-config-manager --disable epel-testing ius
-
-Loaded plugins: fastestmirror
-==================================================================================== repo: epel-testing =====================================================================================
-[epel-testing]
-bandwidth = 0
-base_persistdir = /var/lib/yum/repos/x86_64/6
-baseurl =
-cache = 0
-cachedir = /var/cache/yum/x86_64/6/epel-testing
-cost = 1000
-enabled = 0
-enablegroups = True
-exclude =
-failovermethod = priority
-ftp_disable_epsv = False
-gpgcadir = /var/lib/yum/repos/x86_64/6/epel-testing/gpgcadir
-gpgcakey =
-gpgcheck = True
-gpgdir = /var/lib/yum/repos/x86_64/6/epel-testing/gpgdir
-gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
-hdrdir = /var/cache/yum/x86_64/6/epel-testing/headers
-http_caching = all
-includepkgs =
-keepalive = True
-mdpolicy = group:primary
-mediaid =
-metadata_expire = 21600
-metalink =
-mirrorlist = https://mirrors.fedoraproject.org/metalink?repo=testing-epel6&arch=x86_64
-mirrorlist_expire = 86400
-name = Extra Packages for Enterprise Linux 6 - Testing - x86_64
-old_base_cache_dir =
-password =
-persistdir = /var/lib/yum/repos/x86_64/6/epel-testing
-pkgdir = /var/cache/yum/x86_64/6/epel-testing/packages
-proxy = False
-proxy_dict =
-proxy_password =
-proxy_username =
-repo_gpgcheck = False
-retries = 10
-skip_if_unavailable = False
-ssl_check_cert_permissions = True
-sslcacert =
-sslclientcert =
-sslclientkey =
-sslverify = True
-throttle = 0
-timeout = 30.0
-username =
-
-========================================================================================= repo: ius =========================================================================================
-[ius]
-bandwidth = 0
-base_persistdir = /var/lib/yum/repos/x86_64/6
-baseurl =
-cache = 0
-cachedir = /var/cache/yum/x86_64/6/ius
-cost = 1000
-enabled = 0
-enablegroups = True
-exclude =
-failovermethod = priority
-ftp_disable_epsv = False
-gpgcadir = /var/lib/yum/repos/x86_64/6/ius/gpgcadir
-gpgcakey =
-gpgcheck = True
-gpgdir = /var/lib/yum/repos/x86_64/6/ius/gpgdir
-gpgkey = file:///etc/pki/rpm-gpg/IUS-COMMUNITY-GPG-KEY
-hdrdir = /var/cache/yum/x86_64/6/ius/headers
-http_caching = all
-includepkgs =
-keepalive = True
-mdpolicy = group:primary
-mediaid =
-metadata_expire = 21600
-metalink =
-mirrorlist = https://mirrors.iuscommunity.org/mirrorlist?repo=ius-centos6&arch=x86_64&protocol=http
-mirrorlist_expire = 86400
-name = IUS Community Packages for Enterprise Linux 6 - x86_64
-old_base_cache_dir =
-password =
-persistdir = /var/lib/yum/repos/x86_64/6/ius
-pkgdir = /var/cache/yum/x86_64/6/ius/packages
-proxy = False
-proxy_dict =
-proxy_password =
-proxy_username =
-repo_gpgcheck = False
-retries = 10
-skip_if_unavailable = False
-ssl_check_cert_permissions = True
-sslcacert =
-sslclientcert =
-sslclientkey =
-sslverify = True
-throttle = 0
-timeout = 30.0
-username =
-
-```
-
-运行 “yum repolist” 命令检查 “epel-testing” 和 “ius” 仓库是否被禁用。它被禁用了,我不能看到那些仓库,除了 “epel”。
-```
-# yum repolist
-Loaded plugins: fastestmirror, security
-Loading mirror speeds from cached hostfile
- * epel: mirror.us.leaseweb.net
-repo id repo name status
-base CentOS-6 - Base 6,706
-centos-sclo-sclo CentOS-6 - SCLo sclo 495
-epel Extra Packages for Enterprise Linux 6 - x86_64 12,505
-extras CentOS-6 - Extras 53
-updates CentOS-6 - Updates 1,288
-repolist: 21,051
-
-```
-
-或者,我们可以运行以下命令查看详细信息。
-```
-# yum repolist all | grep "epel*\|ius*"
- * epel: mirror.steadfast.net
-epel Extra Packages for Enterprise Linux 6 enabled: 12,509
-epel-debuginfo Extra Packages for Enterprise Linux 6 disabled
-epel-source Extra Packages for Enterprise Linux 6 disabled
-epel-testing Extra Packages for Enterprise Linux 6 disabled
-epel-testing-debuginfo Extra Packages for Enterprise Linux 6 disabled
-epel-testing-source Extra Packages for Enterprise Linux 6 disabled
-ius IUS Community Packages for Enterprise disabled
-ius-archive IUS Community Packages for Enterprise disabled
-ius-archive-debuginfo IUS Community Packages for Enterprise disabled
-ius-archive-source IUS Community Packages for Enterprise disabled
-ius-debuginfo IUS Community Packages for Enterprise disabled
-ius-dev IUS Community Packages for Enterprise disabled
-ius-dev-debuginfo IUS Community Packages for Enterprise disabled
-ius-dev-source IUS Community Packages for Enterprise disabled
-ius-source IUS Community Packages for Enterprise disabled
-ius-testing IUS Community Packages for Enterprise disabled
-ius-testing-debuginfo IUS Community Packages for Enterprise disabled
-ius-testing-source IUS Community Packages for Enterprise disabled
-
-```
-
-对于 Fedora 系统,运行以下命令来启用一个仓库。
-```
-# dnf config-manager --set-disabled epel-testing
-
-```
-
-或者,可以通过手动编辑适当的 repo 文件来完成。为此,打开相应的 repo 文件并将值从 `enabled=0` 改为 `enabled=1`(启用仓库)或从 `enabled=1` 变为 `enabled=0`(禁用仓库)。
-
-即从:
-```
-[epel]
-name=Extra Packages for Enterprise Linux 6 - $basearch
-#baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
-mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
-failovermethod=priority
-enabled=0
-gpgcheck=1
-gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
-
-```
-改为
-```
-[epel]
-name=Extra Packages for Enterprise Linux 6 - $basearch
-#baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
-mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
-failovermethod=priority
-enabled=1
-gpgcheck=1
-gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
-
-```
-
---------------------------------------------------------------------------------
-
-via: https://www.2daygeek.com/how-to-add-enable-disable-a-repository-dnf-yum-config-manager-on-linux/
-
-作者:[Prakash Subramanian][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[MjSeven](https://github.com/MjSeven)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://www.2daygeek.com/author/prakash/
-[1]:https://www.2daygeek.com/yum-command-examples-manage-packages-rhel-centos-systems/
-[2]:https://www.2daygeek.com/dnf-command-examples-manage-packages-fedora-system/
-[3]:https://www.2daygeek.com/list-of-command-line-package-manager-for-linux/
-[4]:https://www.2daygeek.com/list-of-graphical-frontend-tool-for-linux-package-manager/
diff --git a/translated/tech/20180615 Complete Sed Command Guide [Explained with Practical Examples].md b/translated/tech/20180615 Complete Sed Command Guide [Explained with Practical Examples].md
deleted file mode 100644
index 558663de0d..0000000000
--- a/translated/tech/20180615 Complete Sed Command Guide [Explained with Practical Examples].md
+++ /dev/null
@@ -1,1029 +0,0 @@
-Sed 命令完全指南
-======
-在前面的文章中,我展示了 [Sed 命令的基本用法][1],它是一个功能强大的流编辑器。今天,我们准备去了解关于 Sed 更多的知识,深入了解 Sed 的运行模式。这将是你全面了解 Sed 命令的一个机会,深入挖掘它的运行细节和精妙之处。因此,如果你已经做好了准备,那就打开终端吧,[下载测试文件][2] 然后坐在电脑前:开始我们的探索之旅吧!
-
-### 关于 Sed 的一点点理论知识
-
-![complete reference guide to sed commands][4]
-
-#### 首先我们看一下 sed 的运行模式
-
-要准确理解 Sed 命令,你必须先了解工具的运行模式。
-
-当处理数据时,Sed 从输入源一次读入一行,并将它保存到所谓的 `pattern` 空间中。所有 Sed 的变动都发生在 `pattern` 空间。变动都是由命令行上或外部 Sed 脚本文件提供的单字母命令来描述的。大多数 Sed 命令都可以由一个地址或一个地址范围作为前导来限制它们的作用范围。
-
-默认情况下,Sed 在结束每个处理循环后输出 `pattern` 空间中的内容,也就是说,输出发生在输入的下一个行覆盖 `pattern` 空间之前。我们可以将这种运行模式总结如下:
-
- 1. 尝试将下一个行读入到 `pattern` 空间中
-
- 2. 如果读取成功:
-
- 1. 按脚本中的顺序将所有命令应用到与那个地址匹配的当前输入行上
-
- 2. 如果 sed 没有以静默(`-n`)模式运行,那么将输出 `pattern` 空间中的所有内容(可能会是修改过的)。
-
- 3. 重新回到 1。
-
-
-
-
-因此,在每个行被处理完毕之后, `pattern` 空间中的内容将被丢弃,它并不适合长时间保存内容。基于这种目的,Sed 有第二个缓冲区:`hold` 空间。除非你显式地要求它将数据置入到 `hold` 空间、或从`hode` 空间中取得数据,否则 Sed 从不清除 `hold` 空间的内容。在我们后面学习到 `exchange`、`get`、`hold` 命令时将深入研究它。
-
-#### Sed 的抽象机制
-
-你将在许多的 Sed 教程中都会看到上面解释的模式。的确,这是充分正确理解大多数基本 Sed 程序所必需的。但是当你深入研究更多的高级命令时,你将会发现,仅这些知识还是不够的。因此,我们现在尝试去了解更深入的一些知识。
-
-的确,Sed 可以被视为是[抽象机制][5]的实现,它的[状态][6]由三个[缓冲区][7] 、两个[寄存器][8]和两个[标志][9]来定义的:
-
- * **三个缓冲区**用于去保存任意长度的文本。是的,是三个!在前面的基本运行模式中我们谈到了两个: `pattern` 空间和 `hold` 空间,但是 Sed 还有第三个缓冲区:追加队列。从 Sed 脚本的角度来看,它是一个只写缓冲区,Sed 将在它运行时的预定义阶段来自动刷新它(一般是在从输入源读入一个新行之前,或仅在它退出运行之前)。
-
- * Sed 也维护**两个寄存器**:行计数器(LC)用于保存从输入源读取的行数,而程序计数器(PC)总是用来保存下一个将要运行的命令的索引(就是脚本中的位置),Sed 将它作为它的主循环的一部分来自动增加 PC。但在使用特定的命令时,脚本也会直接修改 PC 去跳过或重复程序的一部分。这就像使用 Sed 实现的一个循环或条件语句。更多内容将在下面的专用分支一节中描述。
-
- * 最后,**两个标志**可以被某些 Sed 命令的行为所修改:自动输出(AP)标志和替换标志(SF)。当自动输出标志 AP 被设置时,Sed 将在 `pattern` 空间的内容被覆盖前自动输出(尤其是(包括但不限于)在从输入源读入一个新行之前)。当自动输出标准被清除时(即:没有设置),Sed 在脚本中没有显式命令的情况下,将不会输出 `pattern` 空间中的内容。你可以通过在“静默模式”(使用命令行选项 `-n` 或者在第一行或脚本中使用特殊注释 `#n`)运行 Sed 命令来清除自动输出标志。当它的地址和查找模式与 `pattern` 空间中的内容都匹配时,“替换标志”将被替换命令(`s` 命令)设置。替换标志在每个新的循环开始时、或当从输入源读入一个新行时、或获得条件分支之后将被清除。我们将在分支一节中详细研究这一话题。
-
-
-
-
-另外,Sed 维护一个进入到它的地址范围(关于地址范围的更多知识将在地址范围一节详细描述)的命令列表,以及用于读取和写入数据的两个文件句柄(你将在读取和写入命令的描述中获得更多有关文件句柄的内容)。
-
-#### 一个更精确的 Sed 运行模式
-
-由于一张图胜过千言万语,所以我画了一个流程图去描述 Sed 的运行模式。我将两个东西放在了旁边,像处理多个输入文件或错误处理,但是我认为这足够你去理解任何 Sed 程序的行为了,并且可以避免你在编写你自己的 Sed 脚本时浪费在摸索上的时间。
-
-![The Sed execution model][10]
-
-你可能已经注意到,在上面的流程图上我并没有描述特定的命令动作。对于命令,我们将逐个详细讲解。因此,不用着急,我们马上开始!
-
-### print 命令
-
-print 命令(`p`)是用于输出在它运行时 `pattern` 空间中的内容。它并不会以任何方式改变 Sed 抽象机制中的状态。
-
-![The Sed `print` command][11]
-
-示例:
-```
-sed -e 'p' inputfile
-
-```
-
-上面的命令将输出输入文件中每一行的内容两次,因为你一旦显式地要求使用 `print` 命令时,将会在每个处理循环结束时再隐式地输出一次(因为在这里我们不是在“静默模式”中运行 Sed)。
-
-如果我们不想每个行看到两次,我们可以用两种方式去解决它:
-```
-sed -n -e 'p' inputfile # 在静默模式中显式输出
-sed -e '' inputfile # 空的"什么都不做的"程序,隐式输出
-
-```
-
-注意:`-e` 选项是引入一个 Sed 命令。它被用于区分命令和文件名。由于一个 Sed 表达式必须包含至少一个命令,所以对于第一个命令,`-e` 标志不是必需的。但是,由于我个人使用习惯问题,为了与在这里的大多数的一个命令行上给出多个 Sed 表达式的更复杂的案例保持一致性。你自己去判断这是一个好习惯还是坏习惯,并且在本文的后面部分还将延用这一习惯。
-
-### 地址
-
-显而易见,`print` 命令本身并没有太多的用处。但是,如果你在它之前添加一个地址,这样它就只输出输入文件的一些行,这样它就突然变得能够从一个输入文件中过滤一些不希望的行。那么 Sed 的地址又是什么呢?它是如何来辨别输入文件的“行”呢?
-
-#### 行号
-
-一个 Sed 的地址既可以是一个行号(`$` 表示“最后一行”)也可以是一个正则表达式。在使用行号时,你需要记住 Sed 中的行数是从 1 开始的 — 并且需要注意的是,它不是从 0 行开始的。
-```
-sed -n -e '1p' inputfile # 仅输出文件的第一行
-sed -n -e '5p' inputfile # 仅输出第 5 行
-sed -n -e '$p' inputfile # 输出文件的最后一行
-sed -n -e '0p' inputfile # 结果将是报错,因为 0 不是有效的行号
-
-```
-
-根据 [POSIX 规范][12],如果你指定了几个输出文件,那么它的行号是累加的。换句话说,当 Sed 打开一个新输入文件时,它的行计数器是不会被重置的。因此,以下的两个命令所做的事情是一样的。仅输出一行文本:
-```
-sed -n -e '1p' inputfile1 inputfile2 inputfile3
-cat inputfile1 inputfile2 inputfile3 | sed -n -e '1p'
-
-```
-
-实际上,确实在 POSIX 中规定了多个文件是如何处理的:
-
-> 如果指定了多个文件,将按指定的文件命名顺序进行读取并被串联编辑。
-
-但是,一些 Sed 的实现提供了命令行选项去改变这种行为,比如, GNU Sed 的 `-s` 标志(在使用 GNU Sed `-i` 标志时,它也被隐式地应用):
-```
-sed -sn -e '1p' inputfile1 inputfile2 inputfile3
-
-```
-
-如果你的 Sed 实现支持这种非标准选项,那么关于它的具体细节请查看 `man` 手册页。
-
-#### 正则表达式
-
-我前面说过,Sed 地址既可以是行号也可以是正则表达式。那么正则表达式是什么呢?
-
-正如它的名字,一个[正则表达式][13]是描述一个字符串集合的方法。如果一个指定的字符串符合一个正则表达式所描述的集合,那么我们就认为这个字符串与正则表达式匹配。
-
-一个正则表达式也可以包含必须完全匹配的文本字符。例如,所有的字母和数字,以及大部分可以打印的字符。但是,一些符号有特定意义:
-
- * 它们可能相当于锚,像 `^` 和 `$` 它们分别表示一个行的开始和结束;
-
- * 对于整个字符集,另外的符号可能做为占位符(比如圆点 `.` 可以匹配任意单个字符,或者方括号用于定义一个自定义的字符集);
-
- * 另外的是表示重复出现的数量(像 [Kleene 星号][14] 表示前面的模式出现 0、1 或多次);
-
-
-
-
-这篇文章的目的不是给大家讲正则表达式。因此,我只粘几个示例。但是,你可以在网络上随便找到很多关于正则表达式的教程,正则表达式的功能非常强大,它可用于许多标准的 Unix 命令和编程语言中,并且是每个 Unix 用户应该掌握的技能。
-
-下面是使用 Sed 地址的几个示例:
-```
-sed -n -e '/systemd/p' inputfile # 仅输出包含字符串"systemd"的行
-sed -n -e '/nologin$/p' inputfile # 仅输出以"nologin"结尾的行
-sed -n -e '/^bin/p' inputfile # 仅输出以"bin"开头的行
-sed -n -e '/^$/p' inputfile # 仅输出空行(即:开始和结束之间什么都没有的行)
-sed -n -e '/./p' inputfile # 仅输出包含一个字符的行(即:非空行)
-sed -n -e '/^.$/p' inputfile # 仅输出确实只包含一个字符的行
-sed -n -e '/admin.*false/p' inputfile # 仅输出包含字符串"admin"后面有字符串"false"的行(在它们之间有任意数量的任意字符)
-sed -n -e '/1[0,3]/p' inputfile # 仅输出包含一个"1"并且后面是一个"0"或"3"的行
-sed -n -e '/1[0-2]/p' inputfile # 仅输出包含一个"1"并且后面是一个"0"、"1"、"2"或"3"的行
-sed -n -e '/1.*2/p' inputfile # 仅输出包含字符"1"后面是一个"2"(在它们之间有任意数量的字符)的行
-sed -n -e '/1[0-9]*2/p' inputfile # 仅输出包含字符"1"后面跟着0、1、或更多数字,最后面是一个"2"的行
-
-```
-
-如果你想在正则表达式(包括正则表达式分隔符)中去除字符的特殊意义,你可以在它前面使用一个斜杠:
-```
-# 输出所有包含字符串"/usr/sbin/nologin"的行
-sed -ne '/\/usr\/sbin\/nologin/p' inputfile
-
-```
-
-并不是限制你只能使用反斜杠作为地址中正则表达式的分隔符。你可以通过在第一个分隔符前面加上斜杠的方式,来使用任何你认为适合你需要和偏好的其它字符作为正则表达式的分隔符。当你用地址与带文件路径的字符一起来匹配的时,是非常有用的:
-```
-# 以下两个命令是完全相同的
-sed -ne '/\/usr\/sbin\/nologin/p' inputfile
-sed -ne '\=/usr/sbin/nologin=p' inputfile
-
-```
-
-#### 扩展的正则表达式
-
-默认情况下,Sed 的正则表达式引擎仅理解 [POSIX 基本正则表达式][15] 的语法。如果你需要用到 [扩展的正则表达式][16],你必须在 Sed 命令上添加 `-E` 标志。扩展的正则表达式在基本的正则表达式基础上增加了一组额外的特性,并且很多都是很重要的,他们所要求的斜杠要少很多。我们来比较一下:
-```
-sed -n -e '/\(www\)\|\(mail\)/p' inputfile
-sed -En -e '/(www)|(mail)/p' inputfile
-
-```
-
-#### 括号量词
-
-正则表达式之所以强大的一个原因是[范围量词][17]`{,}`。事实上,当你写一个不太精确匹配的正则表达式时,量词 `*` 就是一个非常完美的符号。但是,你需要显式在它边上添加一个下限和上限,这样就有了很好的灵活性。当量词范围的下限省略时,下限被假定为 0。当上限被省略时,上限被假定为无限大:
-
-|括号| 速记词 |解释|
-
-| {,} | * | 前面的规则出现 0、1、或许多遍 |
-| {,1} | ? | 前面的规则出现 0 或 1 遍 |
-| {1,} | + | 前面的规则出现 1 或许多遍 |
-| {n,n} | {n} | 前面的规则精确地出现 n 遍 |
-
-括号在基本的正则表达式中也是可以使用的,但是它要求使用反斜杠。根据 POSIX 规范,在基本的正则表达式中可以使用的量词仅有星号(`*`)和括号(使用反斜杠 `\{m,n\}`)。许多正则表达式引擎都扩展支持 `\?` 和 `\+`。但是,为什么魔鬼如此有诱惑力呢?因为,如果你需要这些量词,使用扩展的正则表达式将不但易于写而且可移植性更好。
-
-为什么我要花点时间去讨论关于正则表达式的括号量词,这是因为在 Sed 脚本中经常用这个特性去计数字符。
-```
-sed -En -e '/^.{35}$/p' inputfile # 输出精确包含 35 个字符的行
-sed -En -e '/^.{0,35}$/p' inputfile # 输出包含 35 个字符或更少字符的行
-sed -En -e '/^.{,35}$/p' inputfile # 输出包含 35 个字符或更少字符的行
-sed -En -e '/^.{35,}$/p' inputfile # 输出包含 35 个字符或更多字符的行
-sed -En -e '/.{35}/p' inputfile # 你自己指出它的输出内容(这是留给你的测试题)
-
-```
-
-#### 地址范围
-
-到目前为止,我们使用的所有地址都是唯一地址。在我们使用一个唯一地址时,命令是应用在与那个地址匹配的行上。但是,Sed 也支持地址范围。Sed 命令可以应用到那个地址范围中从开始到结束的所有地址中的所有行上:
-```
-sed -n -e '1,5p' inputfile # 仅输出 1 到 5 行
-sed -n -e '5,$p' inputfile # 从第 5 行输出到文件结尾
-
-sed -n -e '/www/,/systemd/p' inputfile # 输出与正则表达式 /www/ 匹配的第一行到与正则表达式 /systemd/ 匹配的接下来的行
-
-```
-
-如果在开始和结束地址上使用了同一个行号,那么范围就缩小为那个行。事实上,如果第二个地址的数字小于或等于地址范围中选定的第一个行的数字,那么仅有一个行被选定:
-```
-printf "%s\n" {a,b,c}{d,e,f} | cat -n | sed -ne '4,4p'
- 4 bd
-printf "%s\n" {a,b,c}{d,e,f} | cat -n | sed -ne '4,3p'
- 4 bd
-
-```
-
-这就有点难了,但是在前面的段落中给出的规则也适用于起始地址是正则表达式的情况。在那种情况下,Sed 将对正则表达式匹配的第一个行的行号和给定的作为结束地址的显式的行号进行比较。再强调一次,如果结束行号小于或等于起始行号,那么这个范围将缩小为一行:
-```
-# 这个 /b/,4 地址将匹配三个单行
-# 因为每个匹配的行有一个行号 >= 4
-printf "%s\n" {a,b,c}{d,e,f} | cat -n | sed -ne '/b/,4p'
- 4 bd
- 5 be
- 6 bf
-
-# 你自己指出匹配的范围是多少
-# 第二个例子:
-printf "%s\n" {a,b,c}{d,e,f} | cat -n | sed -ne '/d/,4p'
- 1 ad
- 2 ae
- 3 af
- 4 bd
- 7 cd
-
-```
-
-但是,当结束地址是一个正则表达式时,Sed 的行为将不一样。在那种情况下,地址范围的第一行将不会与结束地址进行检查,因此地址范围将至少包含两行(当然,如果输入数据不足的情况除外):
-```
-printf "%s\n" {a,b,c}{d,e,f} | cat -n | sed -ne '/b/,/d/p'
- 4 bd
- 5 be
- 6 bf
- 7 cd
-
-printf "%s\n" {a,b,c}{d,e,f} | cat -n | sed -ne '4,/d/p'
- 4 bd
- 5 be
- 6 bf
- 7 cd
-
-```
-
-#### 互补
-
-在一个地址选择行后面添加一个感叹号(`!`)表示不匹配那个地址。例如:
-```
-sed -n -e '5!p' inputfile # 输出除了第 5 行外的所有行
-sed -n -e '5,10!p' inputfile # 输出除了第 5 到 10 之间的所有行
-sed -n -e '/sys/!p' inputfile # 输出除了包含字符串"sys"的所有行
-
-```
-
-#### 连接
-
-Sed 允许在一个块中使用括号 (`{…}`) 组合命令。你可以利用这个特性去组合几个地址。例如,我们来比较下面两个命令的输出:
-```
-sed -n -e '/usb/{
-/daemon/p
-}' inputfile
-
-sed -n -e '/usb.*daemon/p' inputfile
-
-```
-
-通过在一个块中嵌套命令,我们将在任意顺序中选择包含字符串 “usb” 和 “daemon” 的行。而正则表达式 “usb.*daemon” 将仅匹配在字符串 “daemon” 前面包含 “usb” 字符串的行。
-
-离题太长时间后,我们现在重新回去学习各种 Sed 命令。
-
-### quit 命令
-
-quit 命令(`q`)是指在当前的迭代循环处理结束之后停止 Sed。
-
-![The Sed `quit` command][18]
-
-quit 命令是在到达输入文件的尾部之前停止处理输入的方法。为什么会有人想去那样做呢?
-
-很好的问题,如果你还记得,我们可以使用下面的命令来输出文件中第 1 到第 5 的行:
-```
-sed -n -e '1,5p' inputfile
-
-```
-
-对于 大多数 Sed 的实现,工具将循环读取输入文件的所有行,那怕是你只处理结果中的前 5 行。如果你的输入文件包含了几百万行(或者更糟糕的情况是,你从一个无限的数据流(比如像 `/dev/urandom` )中读取)。
-
-使用 quit 命令,相同的程序可以被修改的更高效:
-```
-sed -e '5q' inputfile
-
-```
-
-由于我在这里并不使用 `-n` 选项,Sed 将在每个循环结束后隐式输出 `pattern` 空间的内容。但是在你处理完第 5 行后,它将退出,并且因此不会去读取更多的数据。
-
-我们能够使用一个类似的技巧只输出文件中一个特定的行。那将是一个好机会,你将看到从命令行中提供多个 Sed 表达式的几种方法。下面的三个变体都可以从 Sed 中接受命令,要么是不同的 `-e` 选项,要么是在相同的表达式中新起一行或用分号(`;`)隔开:
-```
-sed -n -e '5p' -e '5q' inputfile
-
-sed -n -e '
- 5p
- 5q
-' inputfile
-
-sed -n -e '5p;5q' inputfile
-
-```
-
-如果你还记得,我们在前面看到过能够使用括号将命令组合起来,在这里我们使用它来防止相同的地址重复两次:
-```
-# 组合命令
-sed -e '5{
- p
- q
-}' inputfile
-
-# Which can be shortened as:
-sed '5{p;q;}' inputfile
-
-# As a POSIX extension, some implementations makes the semi-colon before the closing bracket optional:
-sed '5{p;q}' inputfile
-
-```
-
-### substitution 命令
-
-你可以将替换命令想像为 Sed 的“查找替换”功能,这个功能在大多数的“所见即所得”的编辑器上都能找到。Sed 的替换命令与之类似,但比它们更强大。替换命令是 Sed 中最著名的命令之一,在网上有大量的关于这个命令的文档。
-
-![The Sed `substitution` command][19]
-
-[在前一篇文章][20]中我们已经讲过它了,因此,在这里就不再重复了。但是,如果你对它的使用不是很熟悉,那么你需要记住下面的这些关键点:
-
- * 替换命令有两个参数:查找模式和替换字符串:`sed s/:/-----/ inputfile`
-
- * 命令和它的参数是用任意一个字符来分隔的。这主要看你的习惯,在 99% 的时间中我都使用斜杠,但也会用其它的字符:`sed s%:%-----% inputfile`、`sed sX:X-----X inputfile` 或者甚至是 `sed 's : ----- ' inputfile`
-
- * 默认情况下,替换命令仅被应用到 `pattern` 空间中匹配到的第一个字符串上。你可以通过在命令之后指定一个匹配指数作为标志来改变这种情况:`sed 's/:/-----/1' inputfile`、`sed 's/:/-----/2' inputfile`、`sed 's/:/-----/3' inputfile`、…
-
- * 如果你想执行一个全面的替换(即:在 `pattern` 空间上的每个非重叠匹配),你需要增加 `g` 标志:`sed 's/:/-----/g' inputfile`
-
- * 在字符串替换中,出现的任何一个 `&` 符号都将被与查找模式匹配的子字符串替换:`sed 's/:/-&&&-/g' inputfile`、`sed 's/…./& /g' inputfile`
-
- * 圆括号(在扩展的正则表达式中的 `(…)` 或者基本的正则表达式中的 `\(…\)`)被引用为捕获组。那是匹配字符串的一部分,可以在替换字符串中被引用。`\1` 是第一个捕获组的内容,`\2` 是第二个捕获组的内容,依次类推:`sed -E 's/(.)(.)/\2\1/g' inputfile`、`sed -E 's/(.):x:(.):(.*)/\1:\3/' inputfile`(后者之所能正常工作是因为 [正则表达式中的量词星号表示重复匹配下去,直到不匹配为止][21],并且它可以匹配许多个字符)
-
- * 在查找模式或替换字符串时,你可以通过使用一个反斜杠来去除任何字符的特殊意义:`sed 's/:/--\&--/g' inputfile`,`sed 's/\//\\/g' inputfile`
-
-
-
-
-所有的这些看起来有点抽象,下面是一些示例。首先,我想去显示我的测试输入文件的第一个字段并给它在右侧附加 20 个空格字符,我可以这样写:
-```
-sed < inputfile -E -e '
- s/:/ / # 用 20 个空格替换第一个字段的分隔符
- s/(.{20}).*/\1/ # 只保留一行的前 20 个字符
- s/.*/| & |/ # 为了输出好看添加竖条
-'
-
-```
-
-第二个示例是,如果我想将用户 sonia 的 UID/GID 修改为 1100,我可以这样写:
-```
-sed -En -e '
- /sonia/{
- s/[0-9]+/1100/g
- p
- }' inputfile
-
-```
-
-注意在替换命令结束部分的 `g` 选项。这个选项改变了它的行为,因此它将查找全部的 `pattern` 空间并替换,如果没有那个选项,它只替换查找到的第一个。
-
-顺便说一下,这也是使用前面讲过的输出(`p`)命令的好机会,可以在命令运行时输出修改前后时刻 `pattern` 空间的内容。因此,为了获得替换前后的内容,我可以这样写:
-```
-sed -En -e '
- /sonia/{
- p
- s/[0-9]+/1100/g
- p
- }' inputfile
-
-```
-
-事实上,替换后输出一个行是很常见的用法,因此,替换命令也接受 `p` 选项:
-```
-sed -En -e '/sonia/s/[0-9]+/1100/gp' inputfile
-
-```
-
-最后,我就不详细讲替换命令的 `w` 选项了,我们将在稍后的学习中详细介绍。
-
-#### delete 命令
-
-删除命令(`d`)用于清除 `pattern` 空间的内容,然后立即开始下一个处理循环。这样它将会跳过隐式输出 `pattern` 空间内容的行为,即便是你设置了自动输出标志(AP)也不会输出。
-
-![The Sed `delete` command][22]
-
-只输出一个文件前五行的一个很低效率的方法将是:
-```
-sed -e '6,$d' inputfile
-
-```
-
-你猜猜看,我为什么说它很低效率?如果你猜不到,建议你再次去阅读前面的关于 quit 命令的章节,答案就在那里!
-
-当你组合使用正则表达式和地址,从输出中删除匹配的行时,delete 命令将非常有用:
-```
-sed -e '/systemd/d' inputfile
-
-```
-
-#### next 命令
-
-如果 Sed 命令不是在静默模式中运行,这个命令将输出当前 `pattern` 空间的内容,然后,在任何情况下它将读取下一个输入行到 `pattern` 空间中,并使用新的 `pattern` 空间中的内容来运行当前循环中剩余的命令。
-
-![The Sed `next` command][23]
-
-常见的用 next 命令去跳过行的一个示例:
-```
-cat -n inputfile | sed -n -e 'n;n;p'
-
-```
-
-在上面的例子中,Sed 将隐式地读取输入文件的第一行。但是 `next` 命令将丢弃对 `pattern` 空间中的内容的输出(不输出是因为使用了 `-n` 选项),并从输入文件中读取下一行来替换 `pattern` 空间中的内容。而第二个 `next` 命令做的事情和前一个是一模一样的,这就实现了跳过输入文件 2 行的目的。最后,这个脚本显式地输出包含在 `pattern ` 空间中的输入文件的第三行的内容。然后,Sed 将启动一个新的循环,由于 `next` 命令,它会隐式地读取第 4 行的内容,然后跳过它,同样地也跳过第 5 行,并输出第 6 行。如此循环,直到文件结束。总体来看,这个脚本就是读取输入文件然后每三行输出一行。
-
-使用 next 命令,我们也可以找到一些显示输入文件的前五行的几种方法:
-```
-cat -n inputfile | sed -n -e '1{p;n;p;n;p;n;p;n;p}'
-cat -n inputfile | sed -n -e 'p;n;p;n;p;n;p;n;p;q'
-cat -n inputfile | sed -e 'n;n;n;n;q'
-
-```
-
-更有趣的是,如果你需要根据一些地址来处理行时,next 命令也非常有用:
-```
-cat -n inputfile | sed -n '/pulse/p' # 输出包含 "pulse" 的行
-cat -n inputfile | sed -n '/pulse/{n;p}' # 输出包含 "pulse" 之后的行
-cat -n inputfile | sed -n '/pulse/{n;n;p}' # 输出下面的行
- # 下一行
- # 包含 "pulse" 的行
-
-```
-
-### 使用 `hold` 空间
-
-到目前为止,我们所看到的命令都是仅使用了 `pattern` 空间。但是,我们在文章的开始部分已经提到过,还有第二个缓冲区:`hold` 空间,它完全由用户管理。它就是我们在第二节中描述的目标。
-
-#### exchange 命令
-
-正如它的名字所表示的,exchange 命令(`x`)将交换 `hold` 空间和 `pattern` 空间的内容。记住,你只要没有把任何东西放入到 `hold` 空间中,那么 `hold` 空间就是空的。
-
-![The Sed `exchange` command][24]
-
-作为第一个示例,我们可使用 exchange 命令去反序输出一个输入文件的前两行:
-```
-cat -n inputfile | sed -n -e 'x;n;p;x;p;q'
-
-```
-
-当然,在你设置 `hold` 之后你并没有立即使用它的内容,因为只要你没有显式地去修改它, `hold` 空间中的内容就保持不变。在下面的例子中,我在输入一个文件的前五行后,使用它去删除第一行:
-```
-cat -n inputfile | sed -n -e '
- 1{x;n} # 交换 hold 和 pattern 空间
- # 保存第 1 行到 hold 空间中
- # 然后读取第 2 行
- 5{
- p # 输出第 5 行
- x # 交换 hold 和 pattern 空间
- # 去取得第 1 行的内容放回到
- # pattern 空间
- }
-
- 1,5p # 输出第 2 到第 5 行
- # (不要输错了!尝试找出这个规则
- # 没有在第 1 行上运行的原因;)
-'
-
-```
-
-#### hold 命令
-
-hold 命令(`h`)是用于将 `pattern` 空间中的内容保存到 `hold` 空间中。但是,与 exchange 命令不同的是,`pattern` 空间中的内容不会被改变。hold 命令有两种用法:
-
- * `h`
-将复制 `pattern` 空间中的内容到 `hold` 空间中,将覆盖 `hold` 空间中任何已经存在的内容。
-
- * `H`
-使用一个独立的新行,追加 `pattern` 空间中的内容到 `hold` 空间中。
-
-
-
-
-![The Sed `hold` command][25]
-
-上面使用 exchange 命令的例子可以使用 hold 命令重写如下:
-```
-cat -n inputfile | sed -n -e '
- 1{h;n} # 保存第 1 行的内容到 hold 缓冲区并继续
- 5{ # 到第 5 行
- x # 交换 pattern 和 hold 空间
- # (现在 pattern 空间包含了第 1 行)
- H # 在 hold 空间的第 5 行后追回第 1 行
- x # 再次交换取回第 5 行并将第 1 行插入
- # 到 pattern 空间
- }
-
- 1,5p # 输出第 2 行到第 5 行
- # (不要输错!尝试去打到为什么这个规则
- # 不在第 1 行上运行;)
-'
-
-```
-
-#### get 命令
-
-get 命令(`g`)与 hold 命令恰好相反:它从 `hold` 空间中取得内容并将它置入到 `pattern` 空间中。同样它也有两种方式:
-
- * `g`
-它将复制 `hold` 空间中的内容并将其放入到 `pattern` 空间,覆盖 `pattern`空间中已存在的任何内容
-
- * `G`
-使用一个单独的新行,追加 `hold` 空间中的内容到 `pattern` 空间中
-
-
-
-
-![The Sed `get` command][26]
-
-将 hold 命令和 get 命令一起使用,可以允许你去存储并调回数据。作为一个小挑战,我让你重写前一节中的示例,将输入文件的第 1 行放置在第 5 行之后,但是这次必须使用 get 和 hold 命令(注意大小写)而不能使用 exchange 命令。只要运气好,它将使那个方式更简单!
-
-在这期间,我可以给你展示另一个示例,它能给你一些灵感。目标是将拥有登录 shell 权限的用户与其它用户分开:
-```
-cat -n inputfile | sed -En -e '
- \=(/usr/sbin/nologin|/bin/false)$= { H;d; }
- # 追回匹配的行到 hold 空间
- # 然后继续下一个循环
- p # 输出其它行
- $ { g;p } # 在最后一行上
- # 取得并输出 hold 空间中的内容
-'
-
-```
-
-### 复习 print、delete 和 next
-
-现在你已经更熟悉使用 hold 空间了,我们回到 print、delete 和 next 命令。我们已经讨论了小写的 `p`、`d` 和 `n` 命令了。而它们也有大写的版本。因为每个命令都有大小写版本,似乎是 Sed 的习惯,这些命令的大写版本将与多行缓冲区有关:
-
- * `P`
-将 `pattern` 空间中第一个新行之前的内容输出
-
- * `D`
-删除 `pattern` 空间中的内容并且包含新行,然后不读取任何新的输入而是使用剩余的文本去重启一个循环
-
- * `N`
-使用一个换行符作为新旧数据的分隔符,然后读取并追加一个输入的新行到 `pattern` 空间。继续运行当前的循环。
-
-
-
-
-![The Sed uppercase `Delete` command][27]
-![The Sed uppercase `Next` command][28]
-
-这些命令的使用场景主要用于实现队列([FIFO 列表][29])。从一个输入文件中删除最后 5 行就是一个很权威的例子:
-```
-cat -n inputfile | sed -En -e '
- 1 { N;N;N;N } # 确保 pattern 空间中包含 5 行
-
- N # 追加第 6 行到队列中
- P # 输出队列的第 1 行
- D # 删除队列的第 1 行
-'
-
-```
-
-作为第二个示例,我们可以在两个列上显示输入数据:
-```
-# 输出两列
-sed < inputfile -En -e '
- $!N # 追加一个新行到 pattern 空间
- # 除了输入文件的最后一行
- # 当在输入文件的最后一行使用 N 命令时
- # GNU Sed 和 POSIX Sed 的行为是有差异的
- # 需要使用一个技巧去处理这种情况
- # https://www.gnu.org/software/sed/manual/sed.html#N_005fcommand_005flast_005fline
-
- # 用空间填充第 1 行的第 1 个字段
- # 并丢弃其余行
- s/:.*\n/ \n/
- s/:.*// # 除了第 2 行上的第 1 个字段外,丢弃其余的行
- s/(.{20}).*\n/\1/ # 修剪并连接行
- p # 输出结果
-'
-
-```
-
-### 分支
-
-我们刚才已经看到,Sed 因为有 `hold` 空间所以有了缓存的功能。其实它还有测试和分支的指令。因为有这些特性使得 Sed 是一个[图灵完备][30]的语言。虽然它可能看起来很傻,但意味着你可以使用 Sed 写任何程序。你可以实现任何你的目的,但并不意味着实现起来会很容易,而且结果也不一定会很高效。
-
-但是,不用担心。在本文中,我们将使用能够展示测试和分支功能的最简单的例子。虽然这些功能乍一看似乎很有限,但请记住,有些人用 Sed 写了 [calculators]、 [Tetris] 或许多其它类型的应用程序!
-
-#### 标签和分支
-
-从某些方面,你可以将 Sed 看到是一个功能有限的汇编语言。因此,你不会找到在高级语言中常见的 “for” 或 “while” 循环,或者 “if … else” 语句,但是你可以使用分支来实现同样的功能。
-
-![The Sed `branch` command][31]
-
-如果你在本文开始部分看到了用流程图描述的 Sed 运行模型,那么你应该知道 Sed 会自动增加程序计数器的值,命令是按程序的指令顺序来运行的。但是,使用分支指令,你可以通过选择程序中的任意命令来改变顺序运行的程序。跳转目的地是使用一个标签来显式定义的。
-
-![The Sed `label` command][32]
-
-这是一个这样的示例:
-```
-echo hello | sed -ne '
- :start # 在程序的那个行上放置一个 "start" 标签
- p # 输出 pattern 空间内容
- b start # 继续在 :start 标签上运行
-' | less
-
-```
-
-那个 Sed 程序的行为非常类似于 `yes` 命令:它获取一个流并产生一个包含那个字符串的无限流。
-
-切换到一个标签就像我们旁通了 Sed 的自动化特性一样:它既不读取任何输入,也不输出任何内容,更不更新任何缓冲区。它只是跳转到一个不同于源程序指令顺序的另一个指令。
-
-值得一提的是,如果在分支命令(`b`)上没有指定一个标签作为它的参数,那么分支将直接切换到程序结束的地方。因此,Sed 将启动一个新的循环。这个特性可以用于去旁通一些指令并且因此可以用于作为块的替代者:
-```
-cat -n inputfile | sed -ne '
-/usb/!b
-/daemon/!b
-p
-'
-
-```
-
-#### 条件分支
-
-到目前为止,我们已经看到了无条件分支,这个术语可能有点误导嫌疑,因为 Sed 命令总是基于它们的可选地址来作为条件的。
-
-但是,在传统意义上,一个无条件分支也是一个分支,当它运行时,将跳转到特定的目的地,而条件分支既有可能也或许不可能跳转到特定的指令,这取决于系统的当前状态。
-
-Sed 只有一个条件指令,就是 test(`t`) 命令。只有在当前循环的开始或因为前一个条件分支运行了替换,它才跳转到不同的指令。更多的情况是,只有替换标志被设置时,test 命令才会切换。
-
-![The Sed `test` command][3]![The Sed `test` command][33]
-
-使用 test 指令,你可以在一个 Sed 程序中很轻松地执行一个循环。作为一个特定的示例,你可以用它将一个行填充到某个长度(这是使用正则表达式无法实现的):
-```
-# Center text
-cut -d: -f1 inputfile | sed -Ee '
- :start
- s/^(.{,19})$/ \1 / # 用空格在开始处填充少于 20 个字符的行
- # 并在结束处
- # 添加一个空格
- t start # 如果我们已经添加了一个空格,则返回到 :start 标签
- s/(.{20}).*/| \1 |/ # 保留一个行的前 20 个字符
- # 以修复由于奇数行引起的
- # 差一错误
-'
-
-```
-
-如果你仔细读前面的示例,你可能注意到,在将要把数据“喂”给 Sed 之前,我会通过使用 cut 命令创建一个比特去预处理数据。
-
-然后,我们可以只使用 Sed 对程序做一些小的修改来执行相同的任务:
-```
-cat inputfile | sed -Ee '
- s/:.*// # 除第 1 个字段外删除剩余字段
- t start
- :start
- s/^(.{,19})$/ \1 / # 在开始处使用空格去填充
- # 并在结束处填充一个空格
- # 使行的长度不短于 20 个字符
- t start # 如果添加了一个空格,则返回到 :start
- s/(.{20}).*/| \1 |/ # 仅保留一个行的前 20 个字符
- # 以修复由于奇数行引起的
- # 差一错误
-'
-
-```
-
-在上面的示例中,你或许对下列的结构感到惊奇:
-```
-t start
-:start
-
-```
-
-乍一看,在这里的分支并没有用,因为它只是跳转到将要运行的指令处。但是,如果你仔细阅读了 `test` 命令的定义,你将会看到,如果在当前循环的开始或者前一个 test 命令运行后发生了一个替换,分支才会起作用。换句话说就是,test 指令有清除替换标志的副作用。这也正是上面的代码片段的真实目的。这是一个在包含条件分支的 Sed 程序中经常看到的技巧,用于在使用多个替换命令时避免出现 false 的情况。
-
-通过它并不能绝对强制地清除替换标志,我同意这一说法。因为我使用的特定的替换命令在将字符串填充到正确的长度时是幂等的。因此,一个多余的迭代并不会改变结果。不过,我们可以现在再次看一下第二个示例:
-```
-# 基于它们的登录程序来分类用户帐户
-cat inputfile | sed -Ene '
- s/^/login=/
- /nologin/s/^/type=SERV /
- /false/s/^/type=SERV /
- t print
- s/^/type=USER /
- :print
- s/:.*//p
-'
-
-```
-
-我希望在这里根据用户默认配置的登录程序,为用户帐户打上 “SERV” 或 “USER” 的标签。如果你运行它,预计你将看到 “SERV” 标签。然而,并没有在输出中跟踪到 “USER” 标签。为什么呢?因为 `t print` 指令不论行的内容是什么,它总是切换,替换标志总是由程序的第一个替换命令来设置。一旦替换标志设置完成后,在下一个行被读取或直到下一个 test 命令之前,这个标志将保持不变。下面我们给出修复这个程序的解决方案:
-```
-# 基于用户登录程序来分类用户帐户
-cat inputfile | sed -Ene '
- s/^/login=/
-
- t classify # clear the "substitution flag"
- :classify
-
- /nologin/s/^/type=SERV /
- /false/s/^/type=SERV /
- t print
- s/^/type=USER /
- :print
- s/:.*//p
-'
-
-```
-
-### 精确地处理文本
-
-Sed 是一个非交互式文本编辑器。虽然是非交互式的,但仍然是文本编辑器。而如果没有在输出中插入一些东西的功能,那它就不算一个完整的文本编辑器。我不是很喜欢它的文本编辑的特性,因为我发现它的语法太难用了(即便是使用标准的 Sed),但有时你难免会用到它。
-
-在严格的 POSIX 语法中,所有通过这三个命令:change(`c`)、insert(`i`)或 append(`a`)来处理一些到输出的文字文本,都遵循相同的特定语法:命令字母后面跟着一个反斜杠,并且文本从脚本的下一行上开始插入:
-```
-head -5 inputfile | sed '
-1i\
-# List of user accounts
-$a\
-# end
-'
-
-```
-
-插入多行文本,你必须每一行结束的位置使用一个反斜杠:
-```
-head -5 inputfile | sed '
-1i\
-# List of user accounts\
-# (users 1 through 5)
-$a\
-# end
-'
-
-```
-
-一些 Sed 实现,比如 GNU Sed,在初始的反斜杠后面有一个可选的换行符,即便是在 `--posix` 模式下仍然如此。我在标准中并没有找到任何关于替代该语法的授权(如果是因为我没有在标准中找到那个特性,请在评论区留言告诉我!)。因此,如果对可移植性要求很高,请注意使用它的风险:
-```
-# 非 POSIX 语法:
-head -5 inputfile | sed -e '
-1i \# List of user accounts
-$a\# end
-'
-
-```
-
-也有一些 Sed 的实现,让初始的反斜杠完全是可选的。因此毫无疑问,它是一个厂商对 POSIX 标准进行扩展的特定版本,它是否支持那个语法,你需要去查看那个 Sed 版本的手册。
-
-在简单概述之后,我们现在来回顾一下这些命令的更多细节,从我还没有介绍的 change 命令开始。
-
-#### change 命令
-
-change 命令(`c\`)就像 `d` 命令一样删除 `pattern` 空间的内容并开始一个新的循环。唯一的不同在于,当命令运行之后,用户提供的文本是写往输出的。
-
-![The Sed `change` command][34]
-```
-cat -n inputfile | sed -e '
-/systemd/c\
-# :REMOVED:
-s/:.*// # This will NOT be applied to the "changed" text
-'
-
-```
-
-如果 change 命令与一个地址范围关联,当到达范围的最后一行时,这个文本将仅输出一次。这在某种程度上成为 Sed 命令将被重复应用在地址范围内所有行这一惯例的一个例外情况:
-```
-cat -n inputfile | sed -e '
-19,22c\
-# :REMOVED:
-s/:.*// # This will NOT be applied to the "changed" text
-'
-
-```
-
-因此,如果你希望将 change 命令重复应用到地址范围内的所有行上,除了将它封装到一个块中之外,你将没有其它的选择:
-```
-cat -n inputfile | sed -e '
-19,22{c\
-# :REMOVED:
-}
-s/:.*// # This will NOT be applied to the "changed" text
-'
-
-```
-
-#### insert 命令
-
-insert 命令(`i\`)将立即在输出中给出用户提供的文本。它并不以任何方式修改程序流或缓冲区的内容。
-
-![The Sed `insert` command][35]
-```
-# display the first five user names with a title on the first row
-sed < inputfile -e '
-1i\
-USER NAME
-s/:.*//
-5q
-'
-
-```
-
-#### append 命令
-
-当输入的下一行被读取时,append 命令(`a\`)将一些文本追加到显示队列。文本在当前循环的结束部分(包含程序结束的情况)或当使用 `n` 或 `N` 命令从输入中读取一个新行时被输出。
-
-![The Sed `append` command][36]
-
-与上面相同的一个示例,但这次是插入到底部而是顶部:
-```
-sed < inputfile -e '
-5a\
-USER NAME
-s/:.*//
-5q
-'
-
-```
-
-#### read 命令
-
-这是插入一些文本内容到输出流的第四个命令:read 命令(`r`)。它的工作方式与 append 命令完全一样,但不同的,它不从 Sed 脚本中取得硬编码到脚本中的文本,而是在一个输出上写一个文件的内容。
-
-read 命令只调度要读取的文件。当刷新 append 队列时,后者被高效地读取,而不是在 read 命令运行时。如果这时候对这个文件有并发的访问,或那个文件不是一个普通的文件(比如,它是一个字符设备或命名管道),或文件在读取期间被修改,这时可能会产生严重的后果。
-
-作为一个例证,如果你使用我们将在下一次详细讲的 write 命令,它与 read 命令共同去写入并从一个临时文件中重新读取,你可能会获得一些创造性的结果(使用法语版的 [Shiritori][37] 游戏作为一个例证):
-```
-printf "%s\n" "Trois p'tits chats" "Chapeau d' paille" "Paillasson" |
-sed -ne '
- r temp
- a\
- ----
- w temp
-'
-
-```
-
-现在,在流输出中专门用于插入一些文本的 Sed 命令的清单结束了。我的最后一个示例纯属好玩,但是由于我前面提到过有一个 write 命令,这个示例将我们完美地带到下一节,在下一节我们将看到在 Sed 中如何将数据写入到一个外部文件。
-
-### 输出的替代
-
-Sed 的设计思想是,所有的文本转换都将写入到进程的标准输出上。但是,Sed 也有一些特性支持将数据发送到替代的目的地。你有两种方式去实现上述的输出目标替换:使用专门的 `write` 命令,或者在一个 `substitution` 命令上添加一个写入标志。
-
-#### write 命令
-
-write 命令(`w`)追加 `pattern` 空间的内容到给定的目标文件中。POSIX 要求在 Sed 处理任何数据之前,目标文件能够被 Sed 所创建。如果给定的目标文件已经存在,它将被覆写。
-
-![The Sed `write` command][38]
-
-因此,即便是你从未真实地去写入到一个文件中,但文件仍然会被创建。例如,下列的 Sed 程序将创建/覆写这个 “output” 文件,那怕是这个写入命令从未被运行过:
-```
-echo | sed -ne '
-q # 立刻退出
-w output # 这个命令从未被运行
-'
-
-```
-
-你可以将几个写入命令指向到同一个目标文件。指向同一个目标文件的所有写入命令将追加那个文件的内容(工作方式几乎与 shell 的重定向符 `>>` 相同):
-```
-sed < inputfile -ne '
-/:\/bin\/false$/w server
-/:\/usr\/sbin\/nologin$/w server
-w output
-'
-cat server
-
-```
-
-#### 替换命令的写入标志
-
-在前面,我们已经学习了替换命令,它有一个 `p` 选项用于在替换之后输出 `pattern` 空间的内容。同样它也提供一个类似功能的 `w` 选项,用于在替换之后将 `pattern` 空间的内容输出到一个文件中:
-```
-sed < inputfile -ne '
-s/:.*\/nologin$//w server
-s/:.*\/false$//w server
-'
-cat server
-
-```
-
-我无数次使用过它们,但我从未花时间正式介绍过它们,因此,我决定现在来正式地介绍它们:就像大多数编程语言一样,注释是添加软件不去解析的自由格式文本的一种方法。Sed 的语法很晦涩,我不得不强调在脚本中需要的地方添加足够的注释。否则,除了作者外其他人将几乎无法理解它。
-
-![The Sed `comment` command][39]
-
-不过,和 Sed 的其它部分一样,注释也有它自己的微妙之处。首先并且是最重要的,注释并不是语法结构,但它在 Sed 中很成熟。注释虽然是一个“什么也不做”的命令,但它仍然是一个命令。至少,它是在 POSIX 中定义了的。因此,严格地说,它们只允许使用在其它命令允许使用的地方。
-
-大多数 Sed 实现都通过允许行内命令来放松了那种要求,就像在那个文章中我到处都使用的那样。
-
-结束那个主题之前,需要说一下 `#n` 注释(`#` 后面紧跟一个`n`,中间没有空格)的特殊情况。如果在脚本的第一行找到这个精确注释,Sed 将切换到静默模式(即:清除自动输出标志),就像在命令行上指定了 `-n` 选项一样。
-
-### 很少用得到的命令
-
-现在,我们已经学习的命令能让你写出你所用到的 99.99% 的脚本。但是,如果我没有提到剩余的 Sed 命令,那么本教程就不能称为完全指南。我把它们留到最后是因为我们很少用到它。但或许你有实际使用案例,那么你就会发现它们很有用。如果是那样,请不要犹豫,在下面的评论区中把它分享给我们吧。
-
-#### 行数命令
-
-这个 `=` 命令将向标准输出上显示当前 Sed 正在读取的行数,这个行数就是行计数器的内容。没有任何方式从任何一个 Sed 缓冲区中捕获那个数字,也不能对它进行输出格式化。由于这两个限制使得这个命令的可用性大大降低。
-
-![The Sed `line number` command][40]
-
-请记住,在严格的 POSIX 兼容模式中,当在命令行上给定几个输入文件时,Sed 并不重置那个计数器,而是连续地增长它,就像所有的输入文件是连接在一起的一样。一些 Sed 实现,像 GNU Sed,它就有一个选项可以在每个输入文件读取结束后去重置计数器。
-
-#### 明确的 print 命令
-
-这个 `l`(小写的字母 `l`)作用类似于 print 命令(`p`),但它是以精确的格式去输出 `pattern` 空间的内容。以下引用自 [POSIX 标准][12]:
-
-> 在 XBD 转义序列中列出的字符和相关的动作(‘\\\’、‘\a’、‘\b’、‘\f’、‘\r’、‘\t’、‘\v’)将被写为相应的转义序列;在那个表中的 ‘\n’ 是不适用的。不在那个表中的不可打印字符将被写为一个三位八进制数字(在前面使用一个 <反斜杠>),表示字符中的每个字节(最重要的字节在前面)。长行应该被换行,通过写一个 <反斜杠>后跟一个 <换行符> 来表示换行点;发生换行时的长度是不确定的,但应该适合输出设备的具体情况。每个行应该以一个 ‘$’ 标记结束。
-
-![The Sed `unambiguous print` command][3]![The Sed `unambiguous print` command][41]
-
-我怀疑这个命令是在非 [8位规则化信道][42] 上交换数据的。就我本人而言,除了调试用途以外,也从未使用过它。
-
-#### transliterate 命令
-
-移译transliterate(`y`)命令允许映射 `pattern` 空间的字符从一个源集到一个目标集。它非常类似于 `tr` 命令,但是限制更多。
-
-![The Sed `transliterate` command][43]
-```
-# The `y` c0mm4nd 1s for h4x0rz only
-sed < inputfile -e '
- s/:.*//
- y/abcegio/48<3610/
-'
-
-```
-
-虽然 transliterate 命令语法与 substitution 命令的语法有一些相似之处,但它在替换字符串之后不接受任何选项。这个移译总是全局的。
-
-请注意,移译命令要求源集和目标集之间要一一对应地转换。这意味着下面的 Sed 程序可能所做的事情并不是你乍一看所想的那样:
-
-```
-# BEWARE: this doesn't do what you may think!
-sed < inputfile -e '
- s/:.*//
- y/[a-z]/[A-Z]/
-'
-
-```
-
-### 写在最后的话
-```
-# 它要做什么?
-# 提示:答案就在不远处...
-sed -E '
- s/.*\W(.*)/\1/
- h
- ${ x; p; }
- d' < inputfile
-
-```
-
-我们已经学习了所有的 Sed 命令,真不敢相信我们已经做到了!如果你也读到这里了,应该恭喜你,尤其是如果你花费了一些时间,在你的系统上尝试了所有的不同示例!
-
-正如你所见,Sed 是非常复杂的,不仅因为它的语法比较零乱,也因为许多极端案例或命令行为之间的细微差别。毫无疑问,我们可以将这些归结于历史的原因。尽管它有这么多缺点,但是 Sed 仍然是一个非常强大的工具,甚至到现在,它仍然是大量使用的、为数不多的 Unix 工具箱中的命令之一。是时候总结一下这篇文章了,如果你不先支持我,我将不去总结它:请节选你对喜欢的或最具创意的 Sed 脚本,并共享给我们。如果我收集到的你们共享出的脚本足够多了,我将会把这些 Sed 脚本结集发布!
-
---------------------------------------------------------------------------------
-
-via: https://linuxhandbook.com/sed-reference-guide/
-
-作者:[Sylvain Leroux][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[qhwdw](https://github.com/qhwdw)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://linuxhandbook.com/author/sylvain/
-[1]:https://linuxhandbook.com/sed-command-basics/
-[2]:https://gist.github.com/s-leroux/5cb36435bac46c10cfced26e4bf5588c
-[3]:https://linuxhandbook.com/wp-content/plugins/jetpack/modules/lazy-images/images/1x1.trans.gif
-[4]:https://i0.wp.com/linuxhandbook.com/wp-content/uploads/2018/05/sed-reference-guide.jpeg?resize=702%2C395&ssl=1
-[5]:http://mathworld.wolfram.com/AbstractMachine.html
-[6]:https://en.wikipedia.org/wiki/State_(computer_science)
-[7]:https://en.wikipedia.org/wiki/Data_buffer
-[8]:https://en.wikipedia.org/wiki/Processor_register#Categories_of_registers
-[9]:https://www.computerhope.com/jargon/f/flag.htm
-[10]:https://i1.wp.com/linuxhandbook.com/wp-content/uploads/2018/05//sed-flowchart.png?w=702&ssl=1
-[11]:https://i0.wp.com/linuxhandbook.com/wp-content/uploads/2018/05//sed-print-command.png?w=702&ssl=1
-[12]:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sed.html
-[13]:https://www.regular-expressions.info/
-[14]:https://chortle.ccsu.edu/FiniteAutomata/Section07/sect07_16.html
-[15]:https://www.regular-expressions.info/posix.html#bre
-[16]:https://www.regular-expressions.info/posix.html#ere
-[17]:https://www.regular-expressions.info/repeat.html#limit
-[18]:https://i2.wp.com/linuxhandbook.com/wp-content/uploads/2018/05//sed-quit-command.png?w=702&ssl=1
-[19]:https://i2.wp.com/linuxhandbook.com/wp-content/uploads/2018/05//sed-substitution-command.png?w=702&ssl=1
-[20]:https://linuxhandbook.com/?p=128
-[21]:https://www.regular-expressions.info/repeat.html#greedy
-[22]:https://i2.wp.com/linuxhandbook.com/wp-content/uploads/2018/05//sed-delete-command.png?w=702&ssl=1
-[23]:https://i0.wp.com/linuxhandbook.com/wp-content/uploads/2018/05//sed-next-command.png?w=702&ssl=1
-[24]:https://i0.wp.com/linuxhandbook.com/wp-content/uploads/2018/05//sed-exchange-command.png?w=702&ssl=1
-[25]:https://i0.wp.com/linuxhandbook.com/wp-content/uploads/2018/05//sed-hold-command.png?w=702&ssl=1
-[26]:https://i1.wp.com/linuxhandbook.com/wp-content/uploads/2018/05//sed-get-command.png?w=702&ssl=1
-[27]:https://i0.wp.com/linuxhandbook.com/wp-content/uploads/2018/05//sed-delete-upper-command.png?w=702&ssl=1
-[28]:https://i0.wp.com/linuxhandbook.com/wp-content/uploads/2018/05//sed-next-upper-command.png?w=702&ssl=1
-[29]:https://en.wikipedia.org/wiki/FIFO_(computing_and_electronics)
-[30]:https://chortle.ccsu.edu/StructuredC/Chap01/struct01_5.html
-[31]:https://i2.wp.com/linuxhandbook.com/wp-content/uploads/2018/05//sed-branch-command.png?w=702&ssl=1
-[32]:https://i1.wp.com/linuxhandbook.com/wp-content/uploads/2018/05//sed-label-command.png?w=702&ssl=1
-[33]:https://i1.wp.com/linuxhandbook.com/wp-content/uploads/2018/05//sed-test-command.png?w=702&ssl=1
-[34]:https://i2.wp.com/linuxhandbook.com/wp-content/uploads/2018/05//sed-change-command.png?w=702&ssl=1
-[35]:https://i0.wp.com/linuxhandbook.com/wp-content/uploads/2018/05//sed-insert-command.png?w=702&ssl=1
-[36]:https://i2.wp.com/linuxhandbook.com/wp-content/uploads/2018/05//sed-append-command.png?w=702&ssl=1
-[37]:https://en.wikipedia.org/wiki/Shiritori
-[38]:https://i2.wp.com/linuxhandbook.com/wp-content/uploads/2018/05//sed-write-command.png?w=702&ssl=1
-[39]:https://i1.wp.com/linuxhandbook.com/wp-content/uploads/2018/05//sed-comment-command.png?w=702&ssl=1
-[40]:https://i2.wp.com/linuxhandbook.com/wp-content/uploads/2018/05//sed-current-line-command.png?w=702&ssl=1
-[41]:https://i2.wp.com/linuxhandbook.com/wp-content/uploads/2018/05//sed-unambiguous-print-command.png?w=702&ssl=1
-[42]:https://en.wikipedia.org/wiki/8-bit_clean
-[43]:https://i1.wp.com/linuxhandbook.com/wp-content/uploads/2018/05//sed-transliterate-command.png?w=702&ssl=1
diff --git a/translated/tech/20180806 GPaste Is A Great Clipboard Manager For Gnome Shell.md b/translated/tech/20180806 GPaste Is A Great Clipboard Manager For Gnome Shell.md
new file mode 100644
index 0000000000..d8891edc7b
--- /dev/null
+++ b/translated/tech/20180806 GPaste Is A Great Clipboard Manager For Gnome Shell.md
@@ -0,0 +1,97 @@
+GPaste 是 Gnome Shell 中优秀的剪贴板管理器
+======
+**[GPaste][1] 是一个剪贴板管理系统,它包含了库、守护程序以及命令行和 Gnome 的接口(使用原生 Gnome Shell 扩展)。**
+
+剪贴板管理器能够跟踪你正在复制和粘贴的内容,从而能够访问以前复制的项目。GPaste 带有原生的 Gnome Shell 扩展,是那些寻找 Gnome 剪贴板管理器的人的完美补充。
+
+[![GPaste Gnome Shell extension Ubuntu 18.04][2]][3]
+GPaste Gnome Shell扩展
+
+**在 Gnome 中使用 GPaste,你只需单击顶部面板即可得到可配置的、可搜索的剪贴板历史记录。GPaste 不仅会记住你复制的文本,还能记住文件路径和图像**(后者需要在设置中启用,因为默认情况下它被禁用)。
+
+不仅如此,GPaste 还可以检测到增长的行,这意味着当检测到新文本是另一个文本的扩展时,它会替换它,这对于保持剪贴板整洁非常有用。
+
+在扩展菜单中,你可以暂停 GPaste 跟踪剪贴板,并从剪贴板历史记录或整个历史记录中删除项目。你还会发现一个启动 GPaste 用户界面窗口的按钮。
+
+**如果你更喜欢使用键盘,你可以使用快捷键从顶栏开启 GPaste 历史记录** (`Ctrl + Alt + H`) **或打开全部的 GPaste GUI**(`Ctrl + Alt + G`)。
+
+该工具还包含这些键盘快捷键(可以更改):
+
+ * 从历史记录中删除活动项目: `Ctrl + Alt + V`
+
+ * **将活动项目显示为密码(在 GPaste 中混淆剪贴板条目):** `Ctrl + Alt + S`
+
+ * 将剪贴板同步到主选择: `Ctrl + Alt + O`
+
+ * 将主选择同步到剪贴板:`Ctrl + Alt + P`
+
+ * 将活动项目上传到 pastebin 服务:`Ctrl + Alt + U`
+
+[![][4]][5]
+GPaste GUI
+
+GPaste 窗口界面提供可供搜索的剪贴板历史记录(包括清除、编辑或上传项目的选项)、暂停 GPaste 跟踪剪贴板的选项、重启 GPaste 守护程序,备份当前剪贴板历史记录,还有它的设置。
+
+[![][6]][7]
+GPaste GUI
+
+在 GPaste UI 中,你可以更改以下设置:
+
+ * 启用或禁用 Gnome Shell 扩展
+ * 将守护程序状态与扩展程序的状态同步
+ * 主选择影响历史
+ * 使剪贴板与主选择同步
+ * 图像支持
+ * 修整条目
+ * 检测增长行
+ * 保存历史
+ * 历史记录设置,如最大历史记录大小、内存使用情况、最大文本长度等
+ * 键盘快捷键
+
+
+
+### 下载 GPaste
+
+[Download GPaste](https://github.com/Keruspe/GPaste)
+
+Gpaste 项目页面没有链接到任何 GPaste 二进制文件,它只有源码安装说明。非 Debian 或 Ubuntu 的 Linux 发行版的用户(你可以在下面找到 GPaste 安装说明)可以在各自的发行版仓库中搜索 GPaste。
+
+不要将 GPaste 与 Gnome Shell 扩展网站上发布的 GPaste Integration 扩展混淆。这是一个使用 GPaste 守护程序的 Gnome Shell 扩展,它不再维护。内置于 GPaste 中的原生 Gnome Shell 扩展仍然维护。
+
+#### 在 Ubuntu(18.04、16.04)或 Debian(Jessie 和更新版本)中安装 GPaste
+
+**对于 Debian,GPaste 可用于 Jessie 和更新版本,而对于 Ubuntu,GPaste 在 16.04 及更新版本的仓库中(因此可在 Ubuntu 18.04 Bionic Beaver 中使用)。**
+
+**你可以使用以下命令在 Debian 或 Ubuntu 中安装 GPaste(守护程序和 Gnome Shell 扩展):**
+```
+sudo apt install gnome-shell-extensions-gpaste gpaste
+
+```
+
+安装完成后,按下 `Alt + F2` 并输入 `r` 重新启动 Gnome Shell,然后按`回车`键。现在应该启用了 GPaste Gnome Shell 扩展,其图标应显示在顶部 Gnome Shell 面板上。如果没有,请使用 Gnome Tweaks(Gnome Tweak Tool)启用扩展。
+
+**[Debian][8] 和 [Ubuntu][9] 的 GPaste 3.28.0 中有一个错误,如果启用了图像支持选项会导致它崩溃,所以现在不要启用此功能。** 这在 GPaste 3.28.2 中被标记为[已修复][10],但 Debian 和 Ubuntu 仓库中尚未提供此包。
+
+
+--------------------------------------------------------------------------------
+
+via: https://www.linuxuprising.com/2018/08/gpaste-is-great-clipboard-manager-for.html
+
+作者:[Logix][a]
+选题:[lujun9972](https://github.com/lujun9972)
+译者:[geekpi](https://github.com/geekpi)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:https://plus.google.com/118280394805678839070
+[1]:https://github.com/Keruspe/GPaste
+[2]:https://2.bp.blogspot.com/-2ndArDBcrwY/W2gyhMc1kEI/AAAAAAAABS0/ZAe_onuGCacMblF733QGBX3XqyZd--WuACLcBGAs/s400/gpaste-gnome-shell-extension-ubuntu1804.png (Gpaste Gnome Shell)
+[3]:https://2.bp.blogspot.com/-2ndArDBcrwY/W2gyhMc1kEI/AAAAAAAABS0/ZAe_onuGCacMblF733QGBX3XqyZd--WuACLcBGAs/s1600/gpaste-gnome-shell-extension-ubuntu1804.png
+[4]:https://2.bp.blogspot.com/-7FBRsZJvYek/W2gyvzmeRxI/AAAAAAAABS4/LhokMFSn8_kZndrNB-BTP4W3e9IUuz9BgCLcBGAs/s640/gpaste-gui_1.png
+[5]:https://2.bp.blogspot.com/-7FBRsZJvYek/W2gyvzmeRxI/AAAAAAAABS4/LhokMFSn8_kZndrNB-BTP4W3e9IUuz9BgCLcBGAs/s1600/gpaste-gui_1.png
+[6]:https://4.bp.blogspot.com/-047ShYc6RrQ/W2gyz5FCf_I/AAAAAAAABTA/-o6jaWzwNpsSjG0QRwRJ5Xurq_A6dQ0sQCLcBGAs/s640/gpaste-gui_2.png
+[7]:https://4.bp.blogspot.com/-047ShYc6RrQ/W2gyz5FCf_I/AAAAAAAABTA/-o6jaWzwNpsSjG0QRwRJ5Xurq_A6dQ0sQCLcBGAs/s1600/gpaste-gui_2.png
+[8]:https://packages.debian.org/buster/gpaste
+[9]:https://launchpad.net/ubuntu/+source/gpaste
+[10]:https://www.imagination-land.org/posts/2018-04-13-gpaste-3.28.2-released.html
\ No newline at end of file
diff --git a/translated/tech/20180806 Systemd Timers- Three Use Cases.md b/translated/tech/20180806 Systemd Timers- Three Use Cases.md
new file mode 100644
index 0000000000..01564d1034
--- /dev/null
+++ b/translated/tech/20180806 Systemd Timers- Three Use Cases.md
@@ -0,0 +1,220 @@
+Systemd 定时器: 三种使用场景
+======
+
+
+
+在这个 systemd 系列教程中,我们[已经在某种程度上讨论了 systemd 定时器单元][1]。不过,在我们开始讨论 socket 之前,我们先来看三个例子,这些例子展示了如何最佳化利用这些单元。
+
+### 简单的类 _cron_ 行为
+
+我每周都要去收集 [Debian popcon 数据][2],如果每次都能在同一时间收集更好,这样我就能看到某些应用程序的下载趋势。这是一个可以使用 _cron_ 任务来完成的典型事例,但 systemd 定时器同样能做到:
+```
+# 类 cron 的 popcon.timer
+
+[Unit]
+Description= 这里描述了下载并处理 popcon 数据的时刻
+
+[Timer]
+OnCalendar= Thu *-*-* 05:32:07
+Unit= popcon.service
+
+[Install]
+WantedBy= basic.target
+
+```
+
+实际的 _popcon.service_ 会执行一个常规的 _wget_ 任务,并没有什么特别之处。这里的新内容是 `OnCalendar=` 指令。这个指令可以让你在一个特定日期的特定时刻来运行某个服务。在这个例子中,`Thu` 表示“_在周四运行_”,`*-*-*` 表示“_具体年份、月份和日期无关紧要_”,这些可以翻译成“不管年月日,只在每周四运行”。
+
+这样,你就设置了这个服务的运行时间。我选择在欧洲中部夏令时区的上午 5:30 左右运行,那个时候服务器不是很忙。
+
+如果你的服务器关闭了,而且刚好错过了每周的截止时间,你还可以在同一个计时器中使用像 _anacron_ 一样的功能。
+```
+# 具备类似 anacron 功能的 popcon.timer
+
+[Unit]
+Description= 这里描述了下载并处理 popcon 数据的时刻
+
+[Timer]
+Unit=popcon.service
+OnCalendar=Thu *-*-* 05:32:07
+Persistent=true
+
+[Install]
+WantedBy=basic.target
+
+```
+
+当你将 `Persistent=` 指令设为真值时,它会告诉 systemd,如果服务器在本该它运行的时候关闭了,那么在启动后就要立刻运行服务。这意味着,如果机器在周四凌晨停机了(比如说维护),一旦它再次启动后,_popcon.service_ 将会立刻执行。在这之后,它的运行时间将会回到例行性的每周四早上 5:32.
+
+到目前为止,就是这么直白。
+
+### 延迟执行
+
+但是,我们提升一个档次,来“改进”这个[基于 systemd 的监控系统][3]。你应该记得,当你接入摄像头的时候,系统就会开始拍照。假设你并不希望它在你安装摄像头的时候拍下你的脸。你希望将拍照服务的启动时间向后推迟一两分钟,这样你就有时间接入摄像头,然后走到画框外面。
+
+为了完成这件事,首先你要更改 Udev 规则,将它指向一个定时器:
+```
+ACTION=="add", SUBSYSTEM=="video4linux", ATTRS{idVendor}=="03f0",
+ATTRS{idProduct}=="e207", TAG+="systemd", ENV{SYSTEMD_WANTS}="picchanged.timer",
+SYMLINK+="mywebcam", MODE="0666"
+
+```
+
+这个定时器看起来像这样:
+```
+# picchanged.timer
+
+[Unit]
+Description= 在摄像头接入的一分钟后,开始运行 picchanged
+
+[Timer]
+OnActiveSec= 1 m
+Unit= picchanged.path
+
+[Install]
+WantedBy= basic.target
+
+```
+
+在你接入摄像头后,Udev 规则被触发,它会调用定时器。这个定时器启动后会等上一分钟(`OnActiveSec= 1 m`),然后运行 _picchanged.path_,它会[监视主图片的变化][4]。_picchanged.path_ 还会负责接触 _webcan.service_,这个实际用来拍照的服务。
+
+### 在每天的特定时刻启停 Minetest 服务器
+
+在最后一个例子中,我们认为你决定用 systemd 作为唯一的依赖。讲真,不管怎么样,systemd 差不多要接管你的生活了。为什么不拥抱这个必然性呢?
+
+你有个为你的孩子设置的 Minetest 服务。不过,你还想要假装关心一下他们的教育和成长,要让他们做作业和家务活。所以你要确保 Minetest 只在每天晚上的一段时间内可用,比如五点到七点。
+
+这个跟之前的“_在特定时间启动服务_”不太一样。写个定时器在下午五点启动服务很简单…:
+```
+# minetest.timer
+
+[Unit]
+Description= 在每天下午五点运行 minetest.service
+
+[Timer]
+OnCalendar= *-*-* 17:00:00
+Unit= minetest.service
+
+[Install]
+WantedBy= basic.target
+
+```
+
+…可是编写一个对应的定时器,让它在特定时刻关闭服务,则需要更大剂量的横向思维。
+
+我们从最明显的东西开始 —— 设置定时器:
+```
+# stopminetest.timer
+
+[Unit]
+Description= 每天晚上七点停止 minetest.service
+
+[Timer]
+OnCalendar= *-*-* 19:05:00
+Unit= stopminetest.service
+
+[Install]
+WantedBy= basic.target
+
+```
+
+这里棘手的部分是如何去告诉 _stopminetest.service_ 去 —— 你知道的 —— 停止 Minetest. 我们无法从 _minetest.service_ 中传递 Minetest 服务器的 PID. 而且 systemd 的单元词汇表中也没有明显的命令来停止或禁用正在运行的服务。
+
+我们的诀窍是使用 systemd 的 `Conflicts=` 指令。它和 systemd 的 `Wants=` 指令类似,不过它所做的事情_正相反_。如果你有一个 _b.service_ 单元,其中包含一个 `Wants=a.service` 指令,在这个单元启动时,如果 _a.service_ 没有运行,则 _b.service_ 会运行它。同样,如果你的 _b.service_ 单元中有一行写着 `Conflicts= a.service`,那么在 _b.service_ 启动时,systemd 会停止 _a.service_.
+
+这种机制用于两个服务在尝试同时控制同一资源时会发生冲突的场景,例如当两个服务要同时访问打印机的时候。通过在首选服务中设置 `Conflicts=`,你就可以确保它会覆盖掉最不重要的服务。
+
+不过,你会在一个稍微不同的场景中来使用 `Conflicts=`. 你将使用 `Conflicts=` 来干净地关闭 _minetest.service_:
+```
+# stopminetest.service
+
+[Unit]
+Description= 关闭 Minetest 服务
+Conflicts= minetest.service
+
+[Service]
+Type= oneshot
+ExecStart= /bin/echo "Closing down minetest.service"
+
+```
+
+_stopminetest.service_ 并不会做特别的东西。事实上,它什么都不会做。不过因为它包含那行 `Conflicts=`,所以在它启动时,systemd 会关掉 _minetest.service_.
+
+在你完美的 Minetest 设置中,还有最后一点涟漪:你下班晚了,错过了服务器的开机时间,可当你开机的时候游戏时间还没结束,这该怎么办?`Persistent=` 指令(如上所述)在错过开始时间后仍然可以运行服务,但这个方案还是不行。如果你在早上十一点把服务器打开,它就会启动 Minetest,而这不是你想要的。你真正需要的是一个确保 systemd 只在晚上五到七点启动 Minetest 的方法:
+```
+# minetest.timer
+
+[Unit]
+Description= 在下午五到七点内的每分钟都运行 minetest.service
+
+[Timer]
+OnCalendar= *-*-* 17..19:*:00
+Unit= minetest.service
+
+[Install]
+WantedBy= basic.target
+
+```
+
+`OnCalendar= *-*-* 17..19:*:00` 这一行有两个有趣的地方:(1) `17..19` 并不是一个时间点,而是一个时间段,在这个场景中是 17 到 19 点;以及,(2) 分钟字段中的 `*` 表示服务每分钟都要运行。因此,你会把它读做 “_在下午五到七点间的每分钟,运行 minetest.service_”
+
+不过还有一个问题:一旦 _minetest.service_ 启动并运行,你会希望 _minetest.timer_ 不要再次尝试运行它。你可以在 _minetest.service_ 中包含一条 `Conflicts=` 指令:
+```
+# minetest.service
+
+[Unit]
+Description= 运行 Minetest 服务器
+Conflicts= minetest.timer
+
+[Service]
+Type= simple
+User=
+
+ExecStart= /usr/bin/minetest --server
+ExecStop= /bin/kill -2 $MAINPID
+
+[Install]
+WantedBy= multi-user.targe
+
+```
+
+上面的 `Conflicts=` 指令会保证在 _minstest.service_ 成功运行后,_minetest.timer_ 就会立即停止。
+
+现在,启用并启动 _minetest.timer_:
+```
+systemctl enable minetest.timer
+systemctl start minetest.timer
+
+```
+
+而且,如果你在六点钟启动了服务器,_minetest.timer_ 会启用;到了五到七点,_minetest.timer_ 每分钟都会尝试启动 _minetest.service_. 不过,一旦 _minetest.service_ 开始运行,systemd 会停止 _minetest.timer_,因为它会与 _minetest.service_“冲突”,从而避免计时器在服务已经运行的情况下还会不断尝试启动服务。
+
+在首先启动某个服务时杀死启动它的计时器,这么做有点反直觉,但它是有效的。
+
+### 总结
+
+你可能会认为,有更好的方式来做上面这些事。我在很多文章中看到过“过度设计”这个术语,尤其是在用 systemd 定时器来代替 cron 的时候。
+
+但是,这个系列文章的目的不是为任何具体问题提供最佳解决方案。它的目的是为了尽可能多地使用 systemd 来解决问题,甚至会到荒唐的程度。它的目的是展示大量的例子,来说明如何利用不同类型的单位及其包含的指令。我们的读者,也就是你,可以从这篇文章中找到所有这些的可实践范例。
+
+尽管如此,我们还有一件事要做:下回中,我们会关注 _sockets_ 和 _targets_,然后我们将完成对 systemd 单元的介绍。
+
+你可以在 Linux 基金会和 edX 中,通过免费的 [Linux 介绍][5]课程中,学到更多关于 Linux 的知识。
+
+--------------------------------------------------------------------------------
+
+via: https://www.linux.com/blog/intro-to-linux/2018/8/systemd-timers-two-use-cases-0
+
+作者:[Paul Brown][a]
+选题:[lujun9972](https://github.com/lujun9972)
+译者:[StdioA](https://github.com/StdioA)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:https://www.linux.com/users/bro66
+[1]:https://www.linux.com/blog/learn/intro-to-linux/2018/7/setting-timer-systemd-linux
+[2]:https://popcon.debian.org/
+[3]:https://www.linux.com/blog/intro-to-linux/2018/6/systemd-services-reacting-change
+[4]:https://www.linux.com/blog/learn/intro-to-linux/2018/6/systemd-services-monitoring-files-and-directories
+[5]:https://training.linuxfoundation.org/linux-courses/system-administration-training/introduction-to-linux
diff --git a/translated/tech/20180814 Top Linux developers- recommended programming books.md b/translated/tech/20180814 Top Linux developers- recommended programming books.md
deleted file mode 100644
index 28725009db..0000000000
--- a/translated/tech/20180814 Top Linux developers- recommended programming books.md
+++ /dev/null
@@ -1,110 +0,0 @@
-
-顶级 Linux 开发者推荐的编程书籍
-======
-
-毫无疑问,Linux 是由那些拥有深厚计算机知识背景而且才华横溢的程序员发明的。让那些大名鼎鼎的 Linux 程序员向今日的开发者分享一些曾经带领他们登堂入室的好书和技术参考吧,你会不会也读过其中几本呢?
-
-Linux,毫无争议的属于21世纪的操作系统。虽然Linus Torvalds 在建立开源社区这件事上做了很多工作和社区决策,不过那些网络专家和开发者愿意接受Linux的原因还是因为它卓越的代码质量和高可用性。Torvalds 是个编程天才,同时必须承认他还是得到了很多其他同样极具才华的开发者的无私帮助。
-
-就此我咨询了Torvalds 和其他一些顶级Linux开发者,有哪些书籍帮助他们走上了成为顶级开发者的道路,下面请听我一一道来。
-
-### 熠熠生辉的 C语言
-
-Linux 是在大约90年代开发出来的,与它一起问世的还有其他一些完成基础功能的开源软件。与此相应,那时的开发者使用的工具和语言反映了那个时代的印记。可能[C 语言不再流行了][1],可对于很多已经建功立业的开发者来说,C 语言是他们的第一个实际开发中使用的语言,这一点也在他们推选的对他们有着深远影响的书单中反映出来。
-
-Torvalds 说,“你不应该再选用我那个时代使用的语言或者开发方式”,他的开发道路始于BASIC,然后转向机器码(“甚至都不是汇编语言,而是真真正正的’二进制‘机器码”,他解释道),再然后转向汇编语言和 C 语言。
-
-“任何人都不应该再从这些语言开始进入开发这条路了”,他补充道。“这些语言中的一些今天已经没有什么意义(如 BASIC 和机器语言)。尽管 C 还是一个主流语言,我也不推荐你从它开始你的开发工作”。
-
-并不是他不喜欢 C。不管怎样,Linux 是用[C语言GNU C][2]写就的。“我始终认为 C 是一个伟大的语言,它有着非常简单的语法,对于很多方向的开发都很合适,但是我怀疑你会挫折重重,从你的第一个'Hello World'程序开始到你真正能开发出能用的东西当中有很大一步要走”。他认为,如果用现在的标准,如果作为现在的入门语言的话,从 C语言开始的代价太大。
-
-在他那个时代,Torvalds 的唯一选择的书就只能是Brian W. Kernighan 和Dennis M. Ritchie 合著的[C 编程语言C Programming Language, 2nd Edition][3],在编程圈内也被尊称为K&R。“这本书简单精炼,但是你要先有编程的背景才能欣赏它”。Torvalds 说到。
-
-Torvalds 并不是唯一一个推荐K&R 的开源开发者。以下几位也同样引用了这本他们认为值得推荐的书籍,他们有:Linux 和 Oracle 虚拟化开发副总裁,Wim Coekaerts;Linux 开发者Alan Cox; Google 云 CTO Brian Stevens; Canonical 技术运营部副总裁Pete Graner。
-
-
-如果你今日还想同 C 语言较量一番的话,Jeremy Allison,Samba 的共同发起人,推荐[21世纪的 C 语言21st Century C: C Tips from the New School][4]。他还建议,同时也去阅读一本比较旧但是写的更详细的[C专家编程Expert C Programming: Deep C Secrets][5]和有着20年历史的[UNIX POSIX多线程编程Programming with POSIX Threads][6]。
-
-
-### 如果不选C 语言, 那选什么?
-
- Linux 开发者推荐的书籍自然都是他们认为适合今时今日的开发项目的语言工具。这也折射了开发者自身的个人偏好。例如, Allison认为年轻的开发者应该在[Go 编程语言The Go Programming Language ][7]和[Rust 编程Rust with Programming Rust][8]的帮助下去学习 Go 语言和 Rust 语言。
-
-
-但是超越编程语言来考虑问题也不无道理(尽管这些书传授了你编程技巧)。今日要做些有意义的开发工作的话,"要从那些已经完成了99%显而易见工作的框架开始,然后你就能围绕着它开始写脚本了", Torvalds 推荐了这种做法。
-
-
-“坦率来说,语言本身远远没有围绕着它的基础架构重要”,他继续道,“可能你会从 Java 或者Kotlin 开始,但那是因为你想为自己的手机开发一个应用,因此安卓 SDK 成为了最佳的选择,又或者,你对游戏开发感兴趣,你选择了一个游戏开发引擎来开始,而通常它们有着自己的脚本语言”。
-
-
-这里提及的基础架构包括那些和操作系统本身相关的编程书籍。
-Garner 在读完了大名鼎鼎的 K&R后又拜读了W. Richard Steven 的[Unix 网络编程Unix: Network Programming][10]。特别的是,Steven 的[TCP/IP详解,卷1:协议TCP/IP Illustrated, Volume 1: The Protocols][11]在出版了30年之后仍然被认为是必读的。因为 Linux 开发很大程度上和[和网络基础架构有关][12],Garner 也推荐了很多 O’Reilly 的书,包括[Sendmail][13],[Bash][14],[DNS][15],以及[IMAP/POP][16]。
-
-Coekaerts也是Maurice Bach的[UNIX操作系统设计The Design of the Unix Operation System][17]的书迷之一。James Bottomley 也是这本书的推崇者,作为一个 Linux 内核开发者,当 Linux 刚刚问世时James就用Bach 的这本书所传授的知识将它研究了个底朝天。
-
-### 软件设计知识永不过时
-
-尽管这样说有点太局限在技术领域。Stevens 还是说到,“所有的开发者都应该在开始钻研语法前先研究如何设计,[日常物品的设计The Design of Everyday Things][18]是我的最爱”。
-
-Coekaerts 喜欢Kernighan 和 Rob Pike合著的[程序设计实践The Practic of Programming][19]。这本关于设计实践的书当 Coekaerts 还在学校念书的时候还未出版,他说道,“但是我把它推荐给每一个人”。
-
-
-不管何时,当你问一个长期认真对待开发工作的开发者他最喜欢的计算机书籍时,你迟早会听到一个名字和一本书:
-Donald Knuth和他所著的[计算机程序设计艺术(1-4A)The Art of Computer Programming, Volumes 1-4A][20]。Dirk Hohndel,VMware 首席开源官,认为这本书尽管有永恒的价值,但他也承认,“今时今日并非及其有用”。(译注:不代表译者观点)
-
-
-### 读代码。大量的读。
-
-编程书籍能教会你很多,也请别错过另外一个在开源社区特有的学习机会:[如何阅读代码Code Reading: The Open Source Perspective][21]。那里有不可计数的代码例子阐述如何解决编程问题(以及如何让你陷入麻烦...)。Stevens 说,谈到磨炼编程技巧,在他的书单里排名第一的“书”是 Unix 的源代码。
-
-"也请不要忽略从他人身上学习的各种机会。", Cox道,“我是在一个计算机俱乐部里和其他人一起学的 BASIC,在我看来,这仍然是一个学习的最好办法”,他从[精通 ZX81机器码Mastering machine code on your ZX81][22]这本书和 Honeywell L66 B 编译器手册里学习到了如何编写机器码,但是学习技术这点来说,单纯阅读和与其他开发者在工作中共同学习仍然有着很大的不同。
-
-
-Cox 说,“我始终认为最好的学习方法是和一群人一起试图去解决你们共同关心的一些问题并从中找到快乐,这和你是5岁还是55岁无关”。
-
-
-最让我吃惊的是这些顶级 Linux 开发者都是在非常底层级别开始他们的开发之旅的,甚至不是从汇编语言或 C 语言,而是从机器码开始开发。毫无疑问,这对帮助开发者理解计算机在非常微观的底层级别是怎么工作的起了非常大的作用。
-
-
-那么现在你准备好尝试一下硬核 Linux 开发了吗?Greg Kroah-Hartman,这位 Linux 内核过期分支的维护者,推荐了Steve Oualline 的[实用 C 语言编程Practical C Programming][23]和Samuel harbison 以及Guy Steels 合著的[C语言参考手册C: A Reference Manual][24]。接下来请阅读“[如何进行 Linux 内核开发HOWTO do Linux kernel development][25]”,到这时,就像Kroah-Hartman所说,你已经准备好启程了。
-
-于此同时,还请你刻苦学习并大量编码,最后祝你在跟随顶级 Linux 开发者脚步的道路上好运相随。
-
-
---------------------------------------------------------------------------------
-
-via: https://www.hpe.com/us/en/insights/articles/top-linux-developers-recommended-programming-books-1808.html
-
-作者:[Steven Vaughan-Nichols][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:DavidChenLiang(https://github.com/DavidChenLiang)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://www.hpe.com/us/en/insights/contributors/steven-j-vaughan-nichols.html
-[1]:https://www.codingdojo.com/blog/7-most-in-demand-programming-languages-of-2018/
-[2]:https://www.gnu.org/software/gnu-c-manual/
-[3]:https://amzn.to/2nhyjEO
-[4]:https://amzn.to/2vsL8k9
-[5]:https://amzn.to/2KBbWn9
-[6]:https://amzn.to/2M0rfeR
-[7]:https://amzn.to/2nhyrnMe
-[8]:http://shop.oreilly.com/product/0636920040385.do
-[9]:https://www.hpe.com/us/en/resources/storage/containers-for-dummies.html?jumpid=in_510384402_linuxbooks_containerebook0818
-[10]:https://amzn.to/2MfpbyC
-[11]:https://amzn.to/2MpgrTn
-[12]:https://www.hpe.com/us/en/insights/articles/how-to-see-whats-going-on-with-your-linux-system-right-now-1807.html
-[13]:http://shop.oreilly.com/product/9780596510299.do
-[14]:http://shop.oreilly.com/product/9780596009656.do
-[15]:http://shop.oreilly.com/product/9780596100575.do
-[16]:http://shop.oreilly.com/product/9780596000127.do
-[17]:https://amzn.to/2vsCJgF
-[18]:https://amzn.to/2APzt3Z
-[19]:https://www.amazon.com/Practice-Programming-Addison-Wesley-Professional-Computing/dp/020161586X/ref=as_li_ss_tl?ie=UTF8&linkCode=sl1&tag=thegroovycorpora&linkId=e6bbdb1ca2182487069bf9089fc8107e&language=en_US
-[20]:https://amzn.to/2OknFsJ
-[21]:https://amzn.to/2M4VVL3
-[22]:https://amzn.to/2OjccJA
-[23]:http://shop.oreilly.com/product/9781565923065.do
-[24]:https://amzn.to/2OjzgrT
-[25]:https://www.kernel.org/doc/html/v4.16/process/howto.html
diff --git a/translated/tech/20180831 Publishing Markdown to HTML with MDwiki.md b/translated/tech/20180831 Publishing Markdown to HTML with MDwiki.md
new file mode 100644
index 0000000000..65b3c67c3f
--- /dev/null
+++ b/translated/tech/20180831 Publishing Markdown to HTML with MDwiki.md
@@ -0,0 +1,73 @@
+使用 MDwiki 将 Markdown 发布成 HTML
+======
+
+
+
+有很多理由喜欢 Markdown,这是一门简单的语言,有易于学习的语法,它可以与任何文本编辑器一起使用。使用像 [Pandoc][1] 这样的工具,你可以将 Markdown 文本转换为[各种流行格式][2],包括 HTML。你还可以在 Web 服务器中自动执行转换过程。由 TimoDörr 创建的名为 [MDwiki][3]的 HTML5 和 JavaScript 应用可以将一堆 Markdown 文件在浏览器请求它们时转换为网站。MDwiki 网站包含一个操作指南和其他信息可帮助你入门:
+
+![MDwiki site getting started][5]
+
+Mdwiki 网站的样子。
+
+在 Web 服务器内部,基本的 MDwiki 站点如下所示:
+
+![MDwiki site inside web server][7]
+
+该站点的 web 服务器文件夹的样子
+
+我将此项目的 MDwiki HTML 文件重命名为 `START.HTML`。还有一个处理导航的 Markdown 文件和一个 JSON 文件来保存一些配置设置。其他的都是网站内容。
+
+虽然整个网站设计被 MDwiki 固定了,但内容、样式和页面数量却没有。你可以在 [MDwiki 站点][8]查看由 MDwiki 生成的一系列不同站点。公平地说,MDwiki 网站缺乏网页设计师可以实现的视觉吸引力 - 但它们是功能性的,用户应该平衡其简单的外观与创建和编辑它们的速度和简易性。
+
+Markdown 有不同的风格,可以针对不同的特定目的扩展稳定的核心功能。MDwiki 使用 GitHub 风格 [Markdown][9],它为流行的编程语言添加了格式化代码块和语法高亮等功能,使其非常适合生成程序文档和教程。
+
+MDwiki 还支持 “gimmick”,它增加了如嵌入 YouTube 视频和显示数学公式等额外功能。如果在某些项目中需要它们,这些值得探索。我发现 MDwiki 是创建技术文档和教育资源的理想工具。我还发现了一些可能不会立即显现出来的技巧和 hack。
+
+当部署在 Web 服务器中时,MDwiki 可与任何现代 Web 浏览器一起使用。但是,如果你使用 Mozilla Firefox 访问 MDwiki,那么就不需要 Web 服务器。大多数 MDwiki 用户会选择在 Web 服务器上部署完整的项目,以避免排除潜在用户,但只需使用文本编辑器和 Firefox 即可完成开发和测试。任何现代浏览器都可以读取加载到 Moodle 虚拟学习环境(VLE)中的完整的 MDwiki 项目,这在教育环境中非常有用。 (对于其他 VLE 软件,这可能也是如此,但你应该测试它。)
+
+MDwiki 的默认配色方案并非适用于所有项目,但你可以将其替换为从 [Bootswatch.com][10] 下载的其他主题。为此,只需在编辑器中打开 MDwiki HTML 文件,找到 `extlib/css/bootstrap-3.0.0.min.css`,然后插入下载的 Bootswatch 主题。还有一个 MDwiki gimmick,让用户在浏览器中载入 MDwiki 后,选择 Bootswatch 主题来替换默认值。我经常与有视力障碍的用户一起工作,他们倾向于喜欢高对比度的主题,在深色背景上使用白色文字。
+
+![MDwiki screen with Bootswatch Superhero theme][12]
+
+MDwiki 页面使用 Bootswatch Superhero 主题
+
+MDwiki、Markdown 文件和静态图像可以用于许多目的。但是,你有时可能希望包含 JavaScript 幻灯片或反馈表单。Markdown 文件可以包含 HTML 代码,但将 Markdown 与 HTML 混合会让人感到困惑。一种解决方案是在单独的 HTML 文件中创建所需的功能,并将其显示在带有 iframe 标记的 Markdown 文件中。我从 [Twine Cookbook][13] 知道了这个想法,它是 Twine 交互式小说引擎的支持站点。Twine Cookbook 实际上并没有使用 MDwiki,但结合 Markdown 和 iframe 标签开辟了广泛的创作可能性。
+
+这是一个例子:
+
+此 HTML 将显示由 Markdown 文件中的 Twine 交互式小说引擎创建的 HTML 页面。
+```
+
+```
+
+MDwiki 生成的站点结果如下所示:
+
+
+
+简而言之,MDwiki 是一个出色的小应用,可以很好地实现其目的。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/8/markdown-html-publishing
+
+作者:[Peter Cheer][a]
+选题:[lujun9972](https://github.com/lujun9972)
+译者:[geekpi](https://github.com/geekpi)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/petercheer
+[1]: https://pandoc.org/
+[2]: https://opensource.com/downloads/pandoc-cheat-sheet
+[3]: http://dynalon.github.io/mdwiki/#!index.md
+[4]: https://opensource.com/file/407306
+[5]: https://opensource.com/sites/default/files/uploads/1_-_mdwiki_screenshot.png (MDwiki site getting started)
+[6]: https://opensource.com/file/407311
+[7]: https://opensource.com/sites/default/files/uploads/2_-_mdwiki_inside_web_server.png (MDwiki site inside web server)
+[8]: http://dynalon.github.io/mdwiki/#!examples.md
+[9]: https://guides.github.com/features/mastering-markdown/
+[10]: https://bootswatch.com/
+[11]: https://opensource.com/file/407316
+[12]: https://opensource.com/sites/default/files/uploads/3_-_mdwiki_bootswatch_superhero.png (MDwiki screen with Bootswatch Superhero theme)
+[13]: https://github.com/iftechfoundation/twine-cookbook
diff --git a/translated/tech/20180905 How To Run MS-DOS Games And Programs In Linux.md b/translated/tech/20180905 How To Run MS-DOS Games And Programs In Linux.md
deleted file mode 100644
index 2ee61e0223..0000000000
--- a/translated/tech/20180905 How To Run MS-DOS Games And Programs In Linux.md
+++ /dev/null
@@ -1,250 +0,0 @@
-在Linux中怎么运行Ms-Dos游戏和程序
-======
-
-
-
-你是否想过尝试一些经典的MS-DOS游戏和像Turbo C++这样的C++ 编译器?这篇教程将会介绍如何使用**DOSBox**在Linux环境下运行MS-DOS的游戏和程序。**DOSBox**是一个x86平台的DOS模拟器,可以用来运行经典的DOS游戏和程序。 DOSBox模拟带有声音,图形,鼠标,操纵杆和调制解调器等的因特尔 x86 电脑,它允许你运行许多旧的MS-DOS游戏和程序,这些游戏和程序根本无法在任何现代PC和操作系统上运行,例如Microsoft Windows XP及更高版本,Linux和FreeBSD。 DOSBox是免费的,使用C ++编程语言编写并在GPL下分发。
-
-### 在Linux上安装DOSBox
-
-DOSBox在大多数Linux发行版的默认仓库中都能找的到
-
-在Arch Linux及其衍生版如Antergos,Manjaro Linux上:
-```
-$ sudo pacman -S dosbox
-
-```
-
-在 Debian, Ubuntu, Linux Mint上:
-```
-$ sudo apt-get install dosbox
-
-```
-
-在 Fedora上:
-```
-$ sudo dnf install dosbox
-
-```
-
-### 配置DOSBox
-
-DOSBox是一个开箱即用的软件,它不需要进行初始化配置。 它的配置文件位于**`〜/ .dosbox` **文件夹中,名为`dosbox-x.xx.conf`。 在此配置文件中,你可以编辑/修改各种设置,例如以全屏模式启动DOSBox,全屏使用双缓冲,设置首选分辨率,鼠标灵敏度,启用或禁用声音,扬声器,操纵杆等等。 如前所述,默认设置即可正常工作。 你可以不用进行任何更改。
-
-### 在Linux中运行MS-DOS上的游戏和程序
-
-终端运行以下命令启动DOSBox:
-```
-$ dosbox
-
-```
-
-下图就是DOSBox的界面
-
-
-
-正如你所看到的,DOSBox带有自己的类似DOS的命令提示符和一个虚拟的`Z:\`Drive,如果你熟悉MS-DOS的话,你会发现在DOSBox环境下工作不会有任何问题。
-
-这是`dir`命令(在Linux中等同于`ls`命令)的输出:
-
-
-
-如果你是第一次使用DOSBox,你可以通过在DOSBox提示符中输入以下命令来查看关于DOSBox的简介:
-```
-intro
-
-```
-
-在介绍部分按ENTER进入下一页
-
-要查看DOS中最常用命令的列表,请使用此命令:
-```
-help
-
-```
-
-要查看DOSBox中所有支持的命令的列表,请键入:
-```
-help /all
-
-```
-
-记好了这些命令应该在DOSBox提示符中使用,而不是在Linux终端中使用。
-
-DOSBox还支持一些实用的键盘组合键。 下图是能有效使用DOSBox的默认键盘快捷键。
-
-
-
-要退出DOSBox,只需键入并按Enter:
-```
-exit
-```
-
-默认情况下,DOSBox开始运行时的正常屏幕窗口大小如上所示
-
-要直接在全屏启动dosbox,请编辑`dosbox-x.xx.conf`文件并将**fullscreen**变量的值设置为**enable**。 之后,DosBox将以全屏模式启动。 如果要返回正常屏幕,请按 **ALT+ENTER**
-
-希望你能掌握DOSBox的这些基本用法
-
-让我们继续安装一些DOS程序和游戏。
-
-首先,我们需要在Linux系统中创建目录来保存程序和游戏。 我将创建两个名为**`〜/ dosprograms` **和**`〜/ dosgames` **的目录,第一个用于存储程序,后者用于存储游戏。
-```
-$ mkdir ~/dosprograms ~/dosgames
-
-```
-出于本指南的目的,我将向你展示如何安装**Turbo C ++**程序和Mario游戏。我们首先将看到如何安装Turbo。
-下载最新的Turbo C ++编译器并将其解压到**`〜/ dosprograms` **目录中。 我已经将turbo c ++保存在在我的**〜/ dosprograms / TC /**目录中了。
-```
-$ ls dosprograms/tc/
-
-BGI BIN CLASSLIB DOC EXAMPLES FILELIST.DOC INCLUDE LIB README README.COM
-
-```
-
-运行 Dosbox:
-```
-$ dosbox
-
-```
-
-将**`〜/ dosprograms` **目录挂载为DOSBox中的虚拟驱动器 **C:\**
-```
-Z:\>mount c ~/dosprograms
-
-```
-
-你会看到类似下面的输出
-```
-Drive C is mounted as local directory /home/sk/dosprograms.
-
-```
-
-
-
-
-现在,使用命令切换到C盘:
-```
-Z:\>c:
-
-```
-
-然后切换到**tc / bin**目录:
-```
-Z:\>cd tc/bin
-
-```
-
-最后,运行turbo c ++可执行文件:
-```
-Z:\>tc.exe
-
-```
-
-**备注:**只需输入前几个字母,然后按ENTER键自动填充文件名。
-
-
-
-你现在将进入Turbo C ++控制台。
-
-
-
-创建新文件(ATL + F)并开始编程:
-
-
-
-你可以同样安装和运行其他经典DOS程序。
-
-**故障排除:**
-
-运行turbo c ++或其他任何dos程序时,你可能会遇到以下错误:
-
-```
-DOSBox switched to max cycles, because of the setting: cycles=auto. If the game runs too fast try a fixed cycles amount in DOSBox's options. Exit to error: DRC64:Unhandled memory reference
-
-```
-
-要解决此问题,编辑**〜/ .dosbox / dosbox-x.xx.conf **文件:
-```
-$ nano ~/.dosbox/dosbox-0.74.conf
-
-```
-
-找到以下变量:
-```
-core=auto
-
-```
-
-并更改其值为:
-```
-core=normal
-```
-
-现在,让我们看看如何运行基于DOS的游戏,例如 **Mario Bros VGA**
-
-从 [**这里**][1]下载Mario游戏,并将其解压到Linux中的**〜/ dosgames **目录
-
-运行 DOSBox:
-```
-$ dosbox
-
-```
-
-我们刚才使用了虚拟驱动器 **c:** 来运行dos程序。现在让我们使用 **d:** 作为虚拟驱动器来运行游戏。
-
-在DOSBox提示符下,运行以下命令将 **~/dosgames** 目录挂载为虚拟驱动器 **d**
-```
-Z:\>mount d ~/dosgames
-
-```
-
-进入驱动器D:
-```
-Z:\>d:
-
-```
-
-然后进入mario游戏目录并运行 **mario.exe** 文件来启动游戏
-```
-Z:\>cd mario
-
-Z:\>mario.exe
-
-```
-
-
-
-开始玩游戏:
-
-
-
-你可以同样像上面所说的那样运行任何基于DOS的游戏。 [**点击这里**] [2]查看可以使用DOSBOX运行的游戏的完整列表。
-
-### 总结
-
-尽管DOSBOX并不能作为MS-DOS的完全替代品,并且还缺少MS-DOS中的许多功能,但它足以安装和运行大多数的DOS游戏和程序。
-
-有关更多详细信息,请参阅官方[**DOSBox手册**][3]
-
-这就是全部内容。希望这对你有用。更多优秀指南即将到来。 敬请关注!
-
-干杯!
-
-
-
---------------------------------------------------------------------------------
-
-via: https://www.ostechnix.com/how-to-run-ms-dos-games-and-programs-in-linux/
-
-作者:[SK][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[way-ww](https://github.com/way-ww)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://www.ostechnix.com/author/sk/
-[1]: https://www.dosgames.com/game/mario-bros-vga
-[2]: https://www.dosbox.com/comp_list.php
-[3]: https://www.dosbox.com/DOSBoxManual.html
diff --git a/translated/tech/20180928 What containers can teach us about DevOps.md b/translated/tech/20180928 What containers can teach us about DevOps.md
deleted file mode 100644
index d514d8ba0b..0000000000
--- a/translated/tech/20180928 What containers can teach us about DevOps.md
+++ /dev/null
@@ -1,105 +0,0 @@
-容器技术对指导我们 DevOps 的一些启发
-======
-
-容器技术的使用支撑了目前 DevOps 三大主要实践:流水线,及时反馈,持续实验与学习以改进。
-
-
-
-容器技术与 DevOps 二者在发展的过程中是互相促进的关系。得益于 DevOps 的设计理念愈发先进,容器生态系统在设计上与组件选择上也有相应发展。同时,由于容器技术在生产环境中的使用,反过来也促进了 DevOps 三大主要实践:[支撑DevOps的三个实践][1].
-
-
-### 工作流
-
-**容器中的工作流**
-
-每个容器都可以看成一个独立的封闭仓库,当你置身其中,不需要管外部的系统环境、集群环境、以及其他基础设施,不管你在里面如何折腾,只要对外提供正常的功能就好。一般来说,容器内运行的应用,一般作为整个应用系统架构的一部分:比如 web API,数据库,任务执行,缓存系统,垃圾回收器等。运维团队一般会限制容器的资源使用,并在此基础上建立完善的容器性能监控服务,从而降低其对基础设施或者下游其他用户的影响。
-
-**现实中的工作流**
-
-那些跟“容器”一样独立工作的团队,也可以借鉴这种限制容器占用资源的策略。因为无论是在现实生活中的工作流(代码发布、构建基础设施,甚至制造[Spacely’s Sprockets][2]等),还是技术中的工作流(开发、测试、试运行、发布)都使用了这样的线性工作流,一旦某个独立的环节或者工作团队出现了问题,那么整个下游都会受到影响,虽然使用我们这种线性的工作流有效降低了工作耦合性。
-
-**DevOps 中的工作流**
-
-DevOps 中的第一条原则,就是掌控整个执行链路的情况,努力理解系统如何协同工作,并理解其中出现的问题如何对整个过程产生影响。为了提高流程的效率,团队需要持续不断的找到系统中可能存在的性能浪费以及忽视的点,并最终修复它们。
-
-
-> “践行这样的工作流后,可以避免传递一个已知的缺陷到工作流的下游,避免产生一个可能会导致全局性能退化的局部优化,持续优化工作流的性能,持续加深对于系统的理解”
-
-–Gene Kim, [支撑DevOps的三个实践][3], IT 革命, 2017.4.25
-
-### 反馈
-
-**容器中的反馈**
-
-除了限制容器的资源,很多产品还提供了监控和通知容器性能指标的功能,从而了解当容器工作不正常时,容器内部处于什么样的工作状态。比如 目前[流行的][5][Prometheus][4],可以用来从容器和容器集群中收集相应的性能指标数据。容器本身特别适用于分隔应用系统,以及打包代码和其运行环境,但也同时带来不透明的特性,这时从中快速的收集信息,从而解决发生在其内部出现的问题,就显得尤为重要了。
-
-**现实中的反馈**
-
-在现实中,从始至终同样也需要反馈。一个高效的处理流程中,及时的反馈能够快速的定位事情发生的时间。反馈的关键词是“快速”和“相关”。当一个团队处理大量不相关的事件时,那些真正需要快速反馈的重要信息,很容易就被忽视掉,并向下游传递形成更严重的问题。想象下[如果露西和埃塞尔][6]能够很快的意识到:传送带太快了,那么制作出的巧克力可能就没什么问题了(尽管这样就不太有趣了)。
-
-**DevOps and feedback**
-
-DevOps 中的第二条原则,就是快速收集所有的相关有用信息,这样在出现的问题影响到其他开发进程之前,就可以被识别出。DevOps 团队应该努力去“优化下游“,以及快速解决那些可能会影响到之后团队的问题。同工作流一样,反馈也是一个持续的过程,目标是快速的获得重要的信息以及当问题出现后能够及时的响应。
-
-> "快速的反馈对于提高技术的质量、可用性、安全性至关重要。"
-
-–Gene Kim, et al., DevOps 手册:如何在技术组织中创造世界级的敏捷性,可靠性和安全性, IT 革命, 2016
-
-### 持续实验与学习
-
-**容器中的持续实验与学习**
-
-如何让”持续的实验与学习“更具操作性是一个不小的挑战。容器让我们的开发工程师和运营团队,在不需要掌握太多边缘或难以理解的东西情况下,依然可以安全地进行本地和生产环境的测试,这在之前是难以做到的。即便是一些激进的实验,容器技术仍然让我们轻松地进行版本控制、记录、分享。
-
-**现实中的持续实验与学习**
-
-举个我自己的例子:多年前,作为一个年轻、初出茅庐的系统管理员(仅仅工作三周),我被要求对一个运行某个大学核心IT部门网站的Apache虚拟主机进行更改。由于没有易于使用的测试环境,我直接在生产的站点上进行了配置修改,当时觉得配置没问题就发布了,几分钟后,我隔壁无意中听到了同事说:
-
-”等会,网站挂了?“
-
-“没错,怎么回事?”
-
-很多人蒙圈了……
-
-在被嘲讽之后(真实的嘲讽),我一头扎在工作台上,赶紧撤销我之前的更改。当天下午晚些时候,部门主管 - 我老板的老板的老板来到我的工位上,问发生了什么事。
-“别担心,”她告诉我。“我们不会生你的气,这是一个错误,现在你已经学会了。“
-
-而在容器中,这种情形很容易的进行测试,并且也很容易在部署生产环境之前,被那些经验老道的团队成员发现。
-
-**DevOps 中的持续实验与学习**
-
-做实验的初衷是我们每个人都希望通过一些改变从而能够提高一些东西,并勇敢地通过实验来验证我们的想法。对于 DevOps 团队来说,失败无论对团队还是个人来说都是经验,所要不要担心失败。团队中的每个成员不断学习、共享,也会不断提升其所在团队与组织的水平。
-
-随着系统变得越来越琐碎,我们更需要将注意力发在特殊的点上:上面提到的两条原则主要关注的是流程的目前全貌,而持续的学习则是关注的则是整个项目、人员、团队、组织的未来。它不仅对流程产生了影响,还对流程中的每个人产生影响。
-
-> "无风险的实验让我们能够不懈的改进我们的工作,但也要求我们使用之前没有用过的工作方式"
-
-–Gene Kim, et al., [凤凰计划:让你了解 IT、DevOps以及如何取得商业成功][7], IT 革命, 2013
-
-### 容器技术给我们 DevOps 上的启迪
-
-学习如何有效地使用容器可以学习DevOps的三条原则:工作流,反馈以及持续实验和学习。从整体上看应用程序和基础设施,而不是对容器外的东西置若罔闻,教会我们考虑到系统的所有部分,了解其上游和下游影响,打破孤岛,并作为一个团队工作,以提高全局性能和深度
-了解整个系统。通过努力提供及时准确的反馈,我们可以在组织内部创建有效的反馈模式,以便在问题发生影响之前发现问题。
-最后,提供一个安全的环境来尝试新的想法并从中学习,教会我们创造一种文化,在这种文化中,失败一方面促进了我们知识的增长,另一方面通过有根据的猜测,可以为复杂的问题带来新的、优雅的解决方案。
-
-
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/9/containers-can-teach-us-devops
-
-作者:[Chris Hermansen][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[译者ID](https://github.com/littleji)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://opensource.com/users/clhermansen
-[1]: https://itrevolution.com/the-three-ways-principles-underpinning-devops/
-[2]: https://en.wikipedia.org/wiki/The_Jetsons
-[3]: http://itrevolution.com/the-three-ways-principles-underpinning-devops
-[4]: https://prometheus.io/
-[5]: https://opensource.com/article/18/9/prometheus-operational-advantage
-[6]: https://www.youtube.com/watch?v=8NPzLBSBzPI
-[7]: https://itrevolution.com/book/the-phoenix-project/
diff --git a/translated/tech/20181004 Archiving web sites.md b/translated/tech/20181004 Archiving web sites.md
new file mode 100644
index 0000000000..cca9ce3a09
--- /dev/null
+++ b/translated/tech/20181004 Archiving web sites.md
@@ -0,0 +1,119 @@
+存档网站
+======
+
+我最近深入研究了网站存档,因为有些朋友担心遇到糟糕的系统管理或恶意入侵时失去对在线托管的工作的控制。这使得网站存档成为任意系统管理员工具箱中的重要工具。事实证明,有些网站比其他网站更难存档。本文介绍了对传统网站进行存档的过程,并阐述在面对最新流行的单页面应用程序的现代网站时,它有哪些不足。
+
+### 转换为简单网站
+
+手动开发 HTML 网站的日子早已不复存在。现在的网站是动态的,并使用最新的 JavaScript,PHP 或 Python 框架即时构建。结果,这些网站更加脆弱:数据库崩溃,升级出错或者未修复的漏洞都可能使数据丢失。在我以前是一名 Web 开发人员时,我不得不接受客户希望网站基本上可以永久工作的想法。这种期望与 web 开发“快速行动和破除陈规”的理念不相符。在这方面,使用 [Drupal][2] 内容管理系统(CMS)尤其具有挑战性,因为重大更新会破坏与第三方模块的兼容性,这意味着客户很少承担的起高昂的升级成本。解决方案是将这些网站存档:以实时动态的网站为基础,将其转换为任何 web 服务器可以永久服务的纯 HTML 文件。此过程对你自己的动态网站非常有用,也适用于你想保护但无法控制的第三方网站。
+
+对于简单的静态网站,古老的 [Wget][3] 程序就可以胜任。然而,镜像保存一个完整页面的方法,虽然复杂但很固定:
+
+```
+ $ nice wget --mirror --execute robots=off --no-verbose --convert-links \
+ --backup-converted --page-requisites --adjust-extension \
+ --base=./ --directory-prefix=./ --span-hosts \
+ --domains=www.example.com,example.com http://www.example.com/
+
+```
+
+以上命令下载了网页的内容,但也抓取了指定域名中的所有内容。在对你喜欢的网站执行此操作之前,请考虑此类抓取可能对网站产生的影响。上面的命令故意忽略了 `robots.txt` 规则,就像现在[档案管理者的习惯做法][4],并尽可能快的存档网站。大多数抓取工具都可以选择点击暂停并限制带宽使用,以避免使网站瘫痪。
+
+上面的命令还将获取 “page requisites(译者注:单页面所需的所有元素)”,像样式表(CSS),图像和脚本等。下载的页面内容将会被修改,以便链接也指向本地副本。任意 web 服务器均可托管生成的文件集,从而生成原始网站的静态副本。
+
+以上所述是事情一切顺利的时候。任意使用过计算机的人都知道事情的进展很少如计划那样;各种各样的事情可以使程序以有趣的方式脱离正规。比如,在网站上有一个日历块很流行。内容管理系统会动态生成这些内容,这会使爬虫程序陷入死循环以尝试检索所有页面。灵巧的存档者可以使用正则表达式(例如 Wget 有一个 `--reject-regex` 选项)来忽略有问题的资源。如果可以访问网站的管理界面,另一个方法是禁用日历、登录表单、评论表单和其他动态区域。一旦网站变成静态的,(那些动态区域)也肯定会停止工作,因此从原始网站中移除这些杂乱的东西也不是全无意义。
+
+### JavaScript 的厄运
+
+很不幸,有些网站不仅仅是纯 HTML 文件构建的。比如,在单页面网站中,web 浏览器通过执行一个小的 JavaScript 程序来构建内容。像 Wget 这样的简单用户代理将难以重建这些网站的有意义的静态副本,因为它根本不支持 JavaScript。理论上,网站应该使用[渐进增强][5]技术,在不使用 JavaScript 的情况下提供内容和实现功能,但这些指示很少被遵循,因为使用 [NoScript][6] 或 [uMatrix][7] 等插件的人都很确定。
+
+传统的存档方法有时是最愚蠢的方式,会导致失败。在尝试为一个本地报纸网站([pamplemousse.ca][8])创建备份时,我发现 WordPress 在末尾包含 JavaScript,且添加了查询字符串(例如:`?ver=1.12.4`)。这会使提供存档服务的 web 服务器不能正确进行内容类型检测,因为其靠文件扩展名来发送正确的 `Content-Type` 头部信息。在 web 浏览器加载此类存档时,这些脚本将无法加载,导致动态网站受损。
+
+随着 web 向使用浏览器作为虚拟机执行任意代码转化,依赖于纯 HTML 文件解析的存档方法也需要随之适应。这个问题的解决方案是在抓取时记录(以及重现)服务器提供的 HTTP 头部信息,实际上专业的档案管理者就使用这种方法。
+
+### 创建和显示 WARC 文件Creating and displaying WARC files
+
+在 [Internet Archive][9] 网站,Brewster Kahle 和 Mike Burner 在 1996 年设计了 [ARC][10] (用于 "ARChive")文件格式,以提供一种聚合档案工作产生的百万个小文件的方法。该格式最终标准化为 WARC(“Web ARChive”)[规范][11],并在 2009 年作为 ISO 标准发布,2017 年修订。标准化工作由[国际互联网保护联盟][12](IIPC)领导,据维基百科称,这是一个“为共同保护未来互联网内容而建立的图书馆和国际组织”;它有美国国会图书馆和互联网档案馆等成员。后者内部在其基于 Java 的 [Heritrix crawler][13](译者注:一种爬虫程序)上使用 WARC 格式。
+
+WARC 在单个压缩文件中聚合了多种资源,像 HTTP 头部信息,文件内容,以及其他元数据。方便的是实际上 Wget 提供了 `--warc` 参数来支持 WARC 格式。不幸的是 web 浏览器不能直接显示 WARC 文件,所以为了访问存档文件,一个查看器或某些格式转换是很有必要的。我所发现的最简单的查看器是 [pywb][14],它以 Python 包的形式运行一个简单的 web 服务器提供一个像网站时光倒流机网站的界面,来浏览 WARC 文件的内容。执行以下命令将会在 `http://localhost:8080/` 地址显示 WARC 文件的内容:
+
+```
+ $ pip install pywb
+ $ wb-manager init example
+ $ wb-manager add example crawl.warc.gz
+ $ wayback
+
+```
+
+顺便说一句,这个工具是由 [Webrecorder][15] 服务提供者建立的,Webrecoder 服务可以使用 web 浏览器保存动态页面的内容。
+
+很不幸,pywb 无法加载 Wget 生成的 WARC 文件,因为它[遵循][16][不一致的 1.0 规范][17],[1.1 规范修复了此问题][17]。就算 Wget 或 pywb 修复了这些问题,Wget 生成的 WARC 文件对我的使用来说不够可靠,所以我找了其他的替代品。引起我注意的爬虫程序简称 [crawl][19]。以下是它的调用方式:
+
+```
+ $ crawl https://example.com/
+
+```
+
+(它的 README 文件说“非常简单”。)该程序确实支持一些命令行参数选项,但大多数默认值都是最佳的:它会从其他域获取页面需求(除非使用 `-exclude-related` 参数),但肯定不会递归出域。默认情况下,它会与远程站点建立十个并发连接,这个值可以使用 `-c` 参数更改。但是,最重要的是,生成的 WARC 文件可以使用 pywb 完美加载。
+
+### 未来的工作和替代方案
+
+这里还有更多有关使用 WARC 文件的[资源][20]。特别要提的是,这里有一个专门用来存档网站的 Wget 的直接替代品,叫做 [Wpull][21]。它实验性地支持了 [PhantomJS][22] 和 [youtube-dl][23] 的集成,即允许分别下载更复杂的 JavaScript 页面以及流媒体。该程序是一个叫做 [ArchiveBot][24] 的复杂档案工具的基础,ArchiveBot 被那些在 [ArchiveTeam][25] 的“零散离群的档案管理者、程序员、作家以及演说家”使用,他们致力于“在历史永远丢失之前保存他们”。集成 PhantomJS 好像并没有如团队期望的那样良好工作,所以 ArchiveTeam 也用其他的低等工具来镜像保存更复杂的网站。例如,[snscrape][26] 将抓取社交媒体配置文件以生成要发送到 ArchiveBot 的页面列表。团队使用的另一个工具是 [crocoite][27],它在 Chrome 浏览器下以无头文件信息的模式来存档 JavaScript 较多的网站。
+
+如果没有提到称做“网站复制者”的 [HTTrack][28] 项目,那么这篇文章算不上完整。工作方式和 Wget 相似,HTTrack 可以对远程站点创建一个本地的副本,但是不幸的是它不支持输出 WRAC 文件。对于不熟悉命令行的小白用户来说,它在人机交互方面显得更有价值。
+
+同样,在我的研究中,我发现了叫做 [Wget2][29] 的 Wget 的完全重制版本,它支持多线程操作,这可能使它比前身更快。和 Wget 相比,它[舍弃了一些功能][30],但是最值得注意的是拒绝模式、WARC 输出以及 FTP 支持,并增加了 RSS、DNS 缓存以及改进的 TLS 支持。
+
+最后,我个人对这些工具的愿景是将他们与现有的书签系统集成起来。目前我在 [Wallabag][31] 中保留了一些有趣的链接,这是一种自托管式的“稍后阅读”服务,意在成为 [Pocket][32](现在由 Mozilla 拥有)的免费替代品。但是 Wallabag 在设计上只保留了文章的“可读”副本,而不是一个完整的拷贝。在某些情况下,“可读版本”实际上[不可读][33],并且 Wallabag 有时[无法解析文章][34]。恰恰相反,像 [bookmark-archiver][35] 或 [reminiscence][36] 这样其他的工具会保存页面的屏幕截图以及完整的 HTML 文件,但遗憾的是,它没有 WRAC 文件所以没有办法更可信的重现网页内容。
+
+我所经历的有关镜像保存和存档的悲剧就是死数据。幸运的是,业余档案管理者可以利用工具将有趣的内容保存到网上。对于那些不想麻烦的人来说,互联网档案馆依然要留在这里,并且存档团队显然[正在为互联网档案馆本身做备份][37]。
+
+--------------------------------------------------------------------------------
+
+via: https://anarc.at/blog/2018-10-04-archiving-web-sites/
+
+作者:[Anarcat][a]
+选题:[lujun9972](https://github.com/lujun9972)
+译者:[fuowang](https://github.com/fuowang)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://anarc.at
+[1]: https://anarc.at/blog
+[2]: https://drupal.org
+[3]: https://www.gnu.org/software/wget/
+[4]: https://blog.archive.org/2017/04/17/robots-txt-meant-for-search-engines-dont-work-well-for-web-archives/
+[5]: https://en.wikipedia.org/wiki/Progressive_enhancement
+[6]: https://noscript.net/
+[7]: https://github.com/gorhill/uMatrix
+[8]: https://pamplemousse.ca/
+[9]: https://archive.org
+[10]: http://www.archive.org/web/researcher/ArcFileFormat.php
+[11]: https://iipc.github.io/warc-specifications/
+[12]: https://en.wikipedia.org/wiki/International_Internet_Preservation_Consortium
+[13]: https://github.com/internetarchive/heritrix3/wiki
+[14]: https://github.com/webrecorder/pywb
+[15]: https://webrecorder.io/
+[16]: https://github.com/webrecorder/pywb/issues/294
+[17]: https://github.com/iipc/warc-specifications/issues/23
+[18]: https://github.com/iipc/warc-specifications/pull/24
+[19]: https://git.autistici.org/ale/crawl/
+[20]: https://archiveteam.org/index.php?title=The_WARC_Ecosystem
+[21]: https://github.com/chfoo/wpull
+[22]: http://phantomjs.org/
+[23]: http://rg3.github.io/youtube-dl/
+[24]: https://www.archiveteam.org/index.php?title=ArchiveBot
+[25]: https://archiveteam.org/
+[26]: https://github.com/JustAnotherArchivist/snscrape
+[27]: https://github.com/PromyLOPh/crocoite
+[28]: http://www.httrack.com/
+[29]: https://gitlab.com/gnuwget/wget2
+[30]: https://gitlab.com/gnuwget/wget2/wikis/home
+[31]: https://wallabag.org/
+[32]: https://getpocket.com/
+[33]: https://github.com/wallabag/wallabag/issues/2825
+[34]: https://github.com/wallabag/wallabag/issues/2914
+[35]: https://pirate.github.io/bookmark-archiver/
+[36]: https://github.com/kanishka-linux/reminiscence
+[37]: http://iabak.archiveteam.org
diff --git a/translated/tech/20181015 How to Enable or Disable Services on Boot in Linux Using chkconfig and systemctl Command.md b/translated/tech/20181015 How to Enable or Disable Services on Boot in Linux Using chkconfig and systemctl Command.md
deleted file mode 100644
index 8184021df9..0000000000
--- a/translated/tech/20181015 How to Enable or Disable Services on Boot in Linux Using chkconfig and systemctl Command.md
+++ /dev/null
@@ -1,485 +0,0 @@
-如何使用chkconfig和systemctl命令启用或禁用linux服务
-======
-
-对于Linux管理员来说这是一个重要(美妙)的话题,所以每个人都必须知道并练习怎样才能更高效的使用它们。
-
-
-
-在Linux中,无论何时当你安装任何带有服务和守护进程的包,系统默认会把这些进程添加到 “init & systemd” 脚本中,不过此时它们并没有被启动 。
-
-
-
-我们需要手动的开启或者关闭那些服务。Linux中有三个著名的且一直在被使用的init系统。
-
-
-
-### 什么是init系统?
-
-
-
-在以Linux/Unix 为基础的操作系统上,init (初始化的简称) 是内核引导系统启动过程中第一个启动的进程。
-
-
-
-init的进程id(pid)是1,除非系统关机否则它将会一直在后台运行。
-
-
-
-Init 首先根据 `/etc/inittab` 文件决定Linux运行的级别,然后根据运行级别在后台启动所有其他进程和应用程序。
-
-
-
-BIOS, MBR, GRUB 和内核程序在启动init之前就作为linux的引导程序的一部分开始工作了。
-
-
-
-下面是Linux中可以使用的运行级别(从0~6总共七个运行级别)
-
-
-
- * **`0:`** 关机
-
- * **`1:`** 单用户模式
-
- * **`2:`** 多用户模式(没有NFS)
-
- * **`3:`** 完全的多用户模式
-
- * **`4:`** 系统未使用
-
- * **`5:`** 图形界面模式
-
- * **`:`** 重启
-
-
-
-
-
-下面是Linux系统中最常用的三个init系统
-
-
-
- * System V (Sys V)
-
- * Upstart
-
- * systemd
-
-
-
-
-
-### 什么是 System V (Sys V)?
-
-
-
-System V (Sys V)是类Unix系统第一个传统的init系统之一。init是内核引导系统启动过程中第一支启动的程序 ,它是所有程序的父进程。
-
-
-
-大部分Linux发行版最开始使用的是叫作System V(Sys V)的传统的init系统。在过去的几年中,已经有好几个init系统被发布用来解决标准版本中的设计限制,例如:launchd, the Service Management Facility, systemd 和 Upstart。
-
-
-
-与传统的 SysV init系统相比,systemd已经被几个主要的Linux发行版所采用。
-
-
-
-### 什么是 Upstart?
-
-
-
-Upstart 是一个基于事件的/sbin/init守护进程的替代品,它在系统启动过程中处理任务和服务的启动,在系统运行期间监视它们,在系统关机的时候关闭它们。
-
-
-
-它最初是为Ubuntu而设计,但是它也能够完美的部署在其他所有Linux系统中,用来代替古老的System-V。
-
-
-
-Upstart被用于Ubuntu 从 9.10 到 Ubuntu 14.10和基于RHEL 6的系统,之后它被systemd取代。
-
-
-
-### 什么是 systemd?
-
-
-
-Systemd是一个新的init系统和系统管理器, 和传统的SysV相比,它可以用于所有主要的Linux发行版。
-
-
-
-systemd 兼容 SysV 和 LSB init脚本。 它可以直接替代Sys V init系统。systemd是被内核启动的第一支程序,它的PID 是1。
-
-
-
-systemd是所有程序的父进程,Fedora 15 是第一个用systemd取代upstart的发行版。systemctl用于命令行,它是管理systemd的守护进程/服务的主要工具,例如:(开启,重启,关闭,启用,禁用,重载和状态)
-
-
-
-systemd 使用.service 文件而不是bash脚本 (SysVinit 使用的). systemd将所有守护进程添加到cgroups中排序,你可以通过浏览`/cgroup/systemd` 文件查看系统等级。
-
-
-
-### 如何使用chkconfig命令启用或禁用引导服务?
-
-
-
-chkconfig实用程序是一个命令行工具,允许你在指定运行级别下启动所选服务,以及列出所有可用服务及其当前设置。
-
-
-
-此外,它还允许我们从启动中启用或禁用服务。前提是你有超级管理员权限(root或者sudo)运行这个命令。
-
-
-
-所有的服务脚本位于 `/etc/rd.d/init.d`文件中
-
-
-
-### 如何列出运行级别中所有的服务
-
-
-
- `--list` 参数会展示所有的服务及其当前状态 (启用或禁用服务的运行级别)
-
-
-
-```
-
- # chkconfig --list
-
- NetworkManager 0:off 1:off 2:on 3:on 4:on 5:on 6:off
-
- abrt-ccpp 0:off 1:off 2:off 3:on 4:off 5:on 6:off
-
- abrtd 0:off 1:off 2:off 3:on 4:off 5:on 6:off
-
- acpid 0:off 1:off 2:on 3:on 4:on 5:on 6:off
-
- atd 0:off 1:off 2:off 3:on 4:on 5:on 6:off
-
- auditd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
-
- .
-
- .
-
-```
-
-
-
-### 如何查看指定服务的状态
-
-
-
-如果你想查看运行级别下某个服务的状态,你可以使用下面的格式匹配出需要的服务。
-
-
-
-比如说我想查看运行级别中`auditd`服务的状态
-
-
-
-```
-
- # chkconfig --list| grep auditd
-
- auditd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
-
-```
-
-
-
-### 如何在指定运行级别中启用服务
-
-
-
-使用`--level`参数启用指定运行级别下的某个服务,下面展示如何在运行级别3和运行级别5下启用 `httpd` 服务。
-
-
-
-```
-
- # chkconfig --level 35 httpd on
-
-```
-
-
-
-### 如何在指定运行级别下禁用服务
-
-
-
-同样使用 `--level`参数禁用指定运行级别下的服务,下面展示的是在运行级别3和运行级别5中禁用`httpd`服务。
-
-
-
-```
-
- # chkconfig --level 35 httpd off
-
-```
-
-
-
-### 如何将一个新服务添加到启动列表中
-
-
-
-`-–add`参数允许我们添加任何信服务到启动列表中, 默认情况下,新添加的服务会在运行级别2,3,4,5下自动开启。
-
-
-
-```
-
- # chkconfig --add nagios
-
-```
-
-
-
-### 如何从启动列表中删除服务
-
-
-
-可以使用 `--del` 参数从启动列表中删除服务,下面展示的事如何从启动列表中删除Nagios服务。
-
-
-
-```
-
- # chkconfig --del nagios
-
-```
-
-
-
-### 如何使用systemctl命令启用或禁用开机自启服务?
-
-
-
-systemctl用于命令行,它是一个基础工具用来管理systemd的守护进程/服务,例如:(开启,重启,关闭,启用,禁用,重载和状态)
-
-
-
-所有服务创建的unit文件位与`/etc/systemd/system/`.
-
-
-
-### 如何列出全部的服务
-
-
-
-使用下面的命令列出全部的服务(包括启用的和禁用的)
-
-
-
-```
-
- # systemctl list-unit-files --type=service
-
- UNIT FILE STATE
-
- arp-ethers.service disabled
-
- auditd.service enabled
-
- [email protected] enabled
-
- blk-availability.service disabled
-
- brandbot.service static
-
- [email protected] static
-
- chrony-wait.service disabled
-
- chronyd.service enabled
-
- cloud-config.service enabled
-
- cloud-final.service enabled
-
- cloud-init-local.service enabled
-
- cloud-init.service enabled
-
- console-getty.service disabled
-
- console-shell.service disabled
-
- [email protected] static
-
- cpupower.service disabled
-
- crond.service enabled
-
- .
-
- .
-
- 150 unit files listed.
-
-```
-
-
-
-使用下面的格式通过正则表达式匹配出你想要查看的服务的当前状态。下面是使用systemctl命令查看`httpd` 服务的状态。
-
-
-
-```
-
- # systemctl list-unit-files --type=service | grep httpd
-
- httpd.service disabled
-
-```
-
-
-
-### 如何让指定的服务开机自启
-
-
-
-使用下面格式的systemctl命令启用一个指定的服务。启用服务将会创建一个符号链接,如下可见
-
-
-
-```
-
- # systemctl enable httpd
-
- Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
-
-```
-
-
-
-运行下列命令再次确认服务是否被启用。
-
-
-
-```
-
- # systemctl is-enabled httpd
-
- enabled
-
-```
-
-
-
-### 如何禁用指定的服务
-
-
-
-运行下面的命令禁用服务将会移除你启用服务时所创建的
-
-
-
-```
-
- # systemctl disable httpd
-
- Removed symlink /etc/systemd/system/multi-user.target.wants/httpd.service.
-
-```
-
-
-
-运行下面的命令再次确认服务是否被禁用
-
-
-
-```
-
- # systemctl is-enabled httpd
-
- disabled
-
-```
-
-
-
-### 如何查看系统当前的运行级别
-
-
-
-使用systemctl命令确认你系统当前的运行级别,'运行级'别仍然由systemd管理,不过,运行级别对于systemd来说是一个历史遗留的概念。所以我建议你全部使用systemctl命令。
-
-
-
-我们当前处于`运行级别3`, 下面显示的是`multi-user.target`。
-
-
-
-```
-
- # systemctl list-units --type=target
-
- UNIT LOAD ACTIVE SUB DESCRIPTION
-
- basic.target loaded active active Basic System
-
- cloud-config.target loaded active active Cloud-config availability
-
- cryptsetup.target loaded active active Local Encrypted Volumes
-
- getty.target loaded active active Login Prompts
-
- local-fs-pre.target loaded active active Local File Systems (Pre)
-
- local-fs.target loaded active active Local File Systems
-
- multi-user.target loaded active active Multi-User System
-
- network-online.target loaded active active Network is Online
-
- network-pre.target loaded active active Network (Pre)
-
- network.target loaded active active Network
-
- paths.target loaded active active Paths
-
- remote-fs.target loaded active active Remote File Systems
-
- slices.target loaded active active Slices
-
- sockets.target loaded active active Sockets
-
- swap.target loaded active active Swap
-
- sysinit.target loaded active active System Initialization
-
- timers.target loaded active active Timers
-
-```
-
---------------------------------------------------------------------------------
-
-
-
-via: https://www.2daygeek.com/how-to-enable-or-disable-services-on-boot-in-linux-using-chkconfig-and-systemctl-command/
-
-
-
-作者:[Prakash Subramanian][a]
-
-选题:[lujun9972][b]
-
-译者:[way-ww](https://github.com/way-ww)
-
-校对:[校对者ID](https://github.com/校对者ID)
-
-
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-
-
-[a]: https://www.2daygeek.com/author/prakash/
-
-[b]: https://github.com/lujun9972
-
diff --git a/translated/tech/20181016 Final JOS project.md b/translated/tech/20181016 Final JOS project.md
new file mode 100644
index 0000000000..eda24d1d5a
--- /dev/null
+++ b/translated/tech/20181016 Final JOS project.md
@@ -0,0 +1,116 @@
+最终的 JOS 项目
+======
+### 简介
+
+对于最后的项目,你有两个选择:
+
+* 继续使用你自己的 JOS 内核并做 [实验 6][1],包括实验 6 中的一个挑战问题。(你可以随意地、以任何有趣的方式去扩展实验 6 或者 JOS 的任何部分,当然了,这不是课程规定的。)
+
+* 在一个、二个或三个人组成的团队中,你选择去做一个涉及了你的 JOS 的项目。这个项目必须是涉及到与实验 6 相同或更大的(如果你是团队中的一员)领域。
+
+目标是为了获得乐趣或探索更高级的 O/S 的话题;你不需要做最新的研究。
+
+如果你做了你自己的项目,我们将根据你的工作量有多少、你的设计有多优雅、你的解释有多高明、以及你的解决方案多么有趣或多有创意来为你打分。我们知道时间有限,因此也不期望你能在本学期结束之前重写 Linux。要确保你的目标是合理的;合理地设定一个绝对可以实现的最小目标(即:控制你的实验 6 的规模),如果进展顺利,可以设定一个更大的目标。
+
+如果你做了实验 6,我们将根据你是否通过了测试和挑战练习来为你打分。
+
+### 交付期限
+
+```
+11 月 3 日:Piazza 讨论和 1、2、或 3 年级组选择(根据你的最终选择来定)。使用在 Piazza 上的 lab7 标记/目录。在 Piazza 上的文章评论区与其它人计论想法。使用这些文章帮你去找到有类似想法的其它学生一起组建一个小组。课程的教学人员将在 Piazza 上为你的项目想法给出反馈;如果你想得到更详细的反馈,可以与我们单独讨论。
+```
+
+```markdown
+11 月 9 日:在 [提交网站][19] 上提交一个提议,只需要一到两个段落就可以。提议要包括你的小组成员列表、你的计划、以及明确的设计和实现打算。(如果你做实验 6,就不用做这个了)
+```
+
+```markdown
+12 月 7 日:和你的简短报告一起提交源代码。将你的报告放在与名为 "README.pdf" 的文件相同的目录下。由于你只是这个实验任务小组中的一员,你可能需要去使用 git 在小组成员之间共享你的项目代码。因此你需要去决定哪些源代码将作为你的小组项目的共享起始点。一定要为你的最终项目去创建一个分支,并且命名为 `lab7`。(如果你做了实验 6,就按实验 6 的提交要求做即可。)
+```
+
+```
+12 月 11 日这一周:简短的课堂演示。为你的 JOS 项目准备一个简短的课堂演示。为了你的项目演示,我们将提供一个投影仪。根据小组数量和每个小组选择的项目类型,我们可能会限制总的演讲数,并且有些小组可能最终没有机会上台演示。
+```
+
+```
+12 月 11 日这一周:助教们验收。向助教演示你的项目,因此我们可能会提问一些问题,去了解你所做的一些细节。
+```
+
+### 项目想法
+
+如果你不做实验 6,下面是一个启迪你的想法列表。但是,你应该大胆地去实现你自己的想法。其中一些想法只是一个开端,并且本身不在实验 6 的领域内,并且其它的可能是在更大的领域中。
+
+* 使用 [x86 虚拟机支持][2] 去构建一个能够运行多个访客系统(比如,多个 JOS 实例)的虚拟机监视器。
+
+* 使用 Intel SGX 硬件保护机制做一些有用的事情。[这是使用 Intel SGX 的最新的论文][3]。
+
+* 让 JOS 文件系统支持写入、文件创建、为持久性使用日志、等等。或许你可以从 Linux EXT3 上找到一些启示。
+
+* 从 [软更新][4]、[WAFL][5]、ZFS、或其它较高级的文件系统上找到一些使用文件系统的想法。
+
+* 给一个文件系统添加快照功能,以便于用户能够查看过去的多个时间点上的文件系统。为了降低空间使用量,你或许要使用一些写时复制技术。
+
+* 使用分页去提供实时共享的内存,来构建一个 [分布式的共享内存][6](DSM)系统,以便于你在一个机器集群上运行多线程的共享内存的并行程序。当一个线程尝试去访问位于另外一个机器上的页时,页故障将给 DSM 系统提供一个机会,让它基于网络去从当前存储这个页的任意一台机器上获取这个页。
+
+* 允许进程在机器之间基于网络进行迁移。你将需要做一些关于一个进程状态的多个片段方面的事情,但是由于在 JOS 中许多状态是在用户空间中,它或许从 Linux 上的进程迁移要容易一些。
+
+* 在 JOS 中实现 [分页][7] 到磁盘,这样那个进程使用的内存就可以大于真实的内存。使用交换空间去扩展你的内存。
+
+* 为 JOS 实现文件的 [mmap()][8]。
+
+* 使用 [xfi][9] 将一个进程的代码沙箱化。
+
+* 支持 x86 的 [2MB 或 4MB 的页大小][10]。
+
+* 修改 JOS 让内核支持进程内的线程。从查看 [课堂上的 uthread 任务][11] 去开始。实现调度器触发将是实现这个项目的一种方式。
+
+* 在 JOS 的内核中或文件系统中(实现多线程之后),使用细粒度锁或无锁并发。Linux 内核使用 [读复制更新][12] 去执行无需上锁的读取操作。通过在 JOS 中实现它来探索 RCU,并使用它去支持无锁读取的名称缓存。
+
+* 实现 [外内核论文][13] 中的想法。例如包过滤器。
+
+* 使 JOS 拥有软实时行为。用它来辨识一些应用程序时非常有用。
+
+* 使 JOS 运行在 64 位 CPU 上。这包括重设计虚拟内存让它使用 4 级页表。有关这方面的文档,请查看 [参考页][14]。
+
+* 移植 JOS 到一个不同的微处理器。这个 [osdev wiki][15] 或许对你有帮助。
+
+* 为 JOS 系统增加一个“窗口”系统,包括图形驱动和鼠标。有关这方面的文档,请查看 [参考页][16]。[sqrt(x)][17] 就是一个 JOS “窗口” 系统的示例。
+
+* 在 JOS 中实现 [dune][18],以提供特权硬件指令给用户空间应用程序。
+
+* 写一个用户级调试器,添加类似跟踪的功能;硬件寄存器概要(即:Oprofile);调用跟踪等等。
+
+* 为(静态的)Linux 可运行程序做一个二进制仿真。
+
+--------------------------------------------------------------------------------
+
+via: https://pdos.csail.mit.edu/6.828/2018/labs/lab7/
+
+作者:[csail.mit][a]
+选题:[lujun9972][b]
+译者:[qhwdw](https://github.com/qhwdw)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://pdos.csail.mit.edu
+[b]: https://github.com/lujun9972
+[1]: https://pdos.csail.mit.edu/6.828/2018/labs/lab6/index.html
+[2]: http://www.intel.com/technology/itj/2006/v10i3/1-hardware/3-software.htm
+[3]: https://www.usenix.org/system/files/conference/osdi14/osdi14-paper-baumann.pdf
+[4]: http://www.ece.cmu.edu/~ganger/papers/osdi94.pdf
+[5]: https://ng.gnunet.org/sites/default/files/10.1.1.40.3691.pdf
+[6]: http://www.cdf.toronto.edu/~csc469h/fall/handouts/nitzberg91.pdf
+[7]: http://en.wikipedia.org/wiki/Paging
+[8]: http://en.wikipedia.org/wiki/Mmap
+[9]: http://static.usenix.org/event/osdi06/tech/erlingsson.html
+[10]: http://en.wikipedia.org/wiki/Page_(computer_memory)
+[11]: http://pdos.csail.mit.edu/6.828/2018/homework/xv6-uthread.html
+[12]: http://en.wikipedia.org/wiki/Read-copy-update
+[13]: http://pdos.csail.mit.edu/6.828/2018/readings/engler95exokernel.pdf
+[14]: http://pdos.csail.mit.edu/6.828/2018/reference.html
+[15]: http://wiki.osdev.org/Main_Page
+[16]: http://pdos.csail.mit.edu/6.828/2018/reference.html
+[17]: http://web.mit.edu/amdragon/www/pubs/sqrtx-6.828.html
+[18]: https://www.usenix.org/system/files/conference/osdi12/osdi12-final-117.pdf
+[19]: https://6828.scripts.mit.edu/2018/handin.py/
diff --git a/translated/tech/20181016 Lab 6- Network Driver.md b/translated/tech/20181016 Lab 6- Network Driver.md
new file mode 100644
index 0000000000..39a2689473
--- /dev/null
+++ b/translated/tech/20181016 Lab 6- Network Driver.md
@@ -0,0 +1,507 @@
+实验 6:网络驱动程序
+======
+### 实验 6:网络驱动程序(缺省的最终设计)
+
+### 简介
+
+这个实验是缺省的最终项目中你自己能够做的最后的实验。
+
+现在你有了一个文件系统,一个典型的操作系统都应该有一个网络栈。在本实验中,你将继续为一个网卡去写一个驱动程序。这个网卡基于 Intel 82540EM 芯片,也就是众所周知的 E1000 芯片。
+
+##### 预备知识
+
+使用 Git 去提交你的实验 5 的源代码(如果还没有提交的话),获取课程仓库的最新版本,然后创建一个名为 `lab6` 的本地分支,它跟踪我们的远程分支 `origin/lab6`:
+
+```c
+ athena% cd ~/6.828/lab
+ athena% add git
+ athena% git commit -am 'my solution to lab5'
+ nothing to commit (working directory clean)
+ athena% git pull
+ Already up-to-date.
+ athena% git checkout -b lab6 origin/lab6
+ Branch lab6 set up to track remote branch refs/remotes/origin/lab6.
+ Switched to a new branch "lab6"
+ athena% git merge lab5
+ Merge made by recursive.
+ fs/fs.c | 42 +++++++++++++++++++
+ 1 files changed, 42 insertions(+), 0 deletions(-)
+ athena%
+```
+
+然后,仅有网卡驱动程序并不能够让你的操作系统接入因特网。在新的实验 6 的代码中,我们为你提供了网络栈和一个网络服务器。与以前的实验一样,使用 git 去拉取这个实验的代码,合并到你自己的代码中,并去浏览新的 `net/` 目录中的内容,以及在 `kern/` 中的新文件。
+
+除了写这个驱动程序以外,你还需要去创建一个访问你的驱动程序的系统调用。你将要去实现那些在网络服务器中缺失的代码,以便于在网络栈和你的驱动程序之间传输包。你还需要通过完成一个 web 服务器来将所有的东西连接到一起。你的新 web 服务器还需要你的文件系统来提供所需要的文件。
+
+大部分的内核设备驱动程序代码都需要你自己去从头开始编写。本实验提供的指导比起前面的实验要少一些:没有框架文件、没有现成的系统调用接口、并且很多设计都由你自己决定。因此,我们建议你在开始任何单独练习之前,阅读全部的编写任务。许多学生都反应这个实验比前面的实验都难,因此请根据你的实际情况计划你的时间。
+
+##### 实验要求
+
+与以前一样,你需要做实验中全部的常规练习和至少一个挑战问题。在实验中写出你的详细答案,并将挑战问题的方案描述写入到 `answers-lab6.txt` 文件中。
+
+#### QEMU 的虚拟网络
+
+我们将使用 QEMU 的用户模式网络栈,因为它不需要以管理员权限运行。QEMU 的文档的[这里][1]有更多关于用户网络的内容。我们更新后的 makefile 启用了 QEMU 的用户模式网络栈和虚拟的 E1000 网卡。
+
+缺省情况下,QEMU 提供一个运行在 IP 地址 10.2.2.2 上的虚拟路由器,它给 JOS 分配的 IP 地址是 10.0.2.15。为了简单起见,我们在 `net/ns.h` 中将这些缺省值硬编码到网络服务器上。
+
+虽然 QEMU 的虚拟网络允许 JOS 随意连接因特网,但 JOS 的 10.0.2.15 的地址并不能在 QEMU 中的虚拟网络之外使用(也就是说,QEMU 还得做一个 NAT),因此我们并不能直接连接到 JOS 上运行的服务器,即便是从运行 QEMU 的主机上连接也不行。为解决这个问题,我们配置 QEMU 在主机的某些端口上运行一个服务器,这个服务器简单地连接到 JOS 中的一些端口上,并在你的真实主机和虚拟网络之间传递数据。
+
+你将在端口 7(echo)和端口 80(http)上运行 JOS,为避免在共享的 Athena 机器上发生冲突,makefile 将为这些端口基于你的用户 ID 来生成转发端口。你可以运行 `make which-ports` 去找出是哪个 QEMU 端口转发到你的开发主机上。为方便起见,makefile 也提供 `make nc-7` 和 `make nc-80`,它允许你在终端上直接与运行这些端口的服务器去交互。(这些目标仅能连接到一个运行中的 QEMU 实例上;你必须分别去启动它自己的 QEMU)
+
+##### 包检查
+
+makefile 也可以配置 QEMU 的网络栈去记录所有的入站和出站数据包,并将它保存到你的实验目录中的 `qemu.pcap` 文件中。
+
+使用 `tcpdump` 命令去获取一个捕获的 hex/ASCII 包转储:
+
+```
+ tcpdump -XXnr qemu.pcap
+```
+
+或者,你可以使用 [Wireshark][2] 以图形化界面去检查 pcap 文件。Wireshark 也知道如何去解码和检查成百上千的网络协议。如果你在 Athena 上,你可以使用 Wireshark 的前辈:ethereal,它运行在加锁的保密互联网协议网络中。
+
+##### 调试 E1000
+
+我们非常幸运能够去使用仿真硬件。由于 E1000 是在软件中运行的,仿真的 E1000 能够给我们提供一个人类可读格式的报告、它的内部状态以及它遇到的任何问题。通常情况下,对祼机上做驱动程序开发的人来说,这是非常难能可贵的。
+
+E1000 能够产生一些调试输出,因此你可以去打开一个专门的日志通道。其中一些对你有用的通道如下:
+
+| 标志 | 含义 |
+| --------- | :----------------------- |
+| tx | 包发送日志 |
+| txerr | 包发送错误日志 |
+| rx | 到 RCTL 的日志通道 |
+| rxfilter | 入站包过滤日志 |
+| rxerr | 接收错误日志 |
+| unknown | 未知寄存器的读写日志 |
+| eeprom | 读取 EEPROM 的日志 |
+| interrupt | 中断和中断寄存器变更日志 |
+
+例如,你可以使用 `make E1000_DEBUG=tx,txerr` 去打开 "tx" 和 "txerr" 日志功能。
+
+注意:`E1000_DEBUG` 标志仅能在打了 6.828 补丁的 QEMU 版本上工作。
+
+你可以使用软件去仿真硬件,来做进一步的调试工作。如果你使用它时卡壳了,不明白为什么 E1000 没有如你预期那样响应你,你可以查看在 `hw/e1000.c` 中的 QEMU 的 E1000 实现。
+
+#### 网络服务器
+
+从头开始写一个网络栈是很困难的。因此我们将使用 lwIP,它是一个开源的、轻量级 TCP/IP 协议套件,它能做包括一个网络栈在内的很多事情。你能在 [这里][3] 找到很多关于 IwIP 的信息。在这个任务中,对我们而言,lwIP 就是一个实现了一个 BSD 套接字接口和拥有一个包输入端口和包输出端口的黑盒子。
+
+一个网络服务器其实就是一个有以下四个环境的混合体:
+
+ * 核心网络服务器环境(包括套接字调用派发器和 lwIP)
+ * 输入环境
+ * 输出环境
+ * 定时器环境
+
+
+
+下图展示了各个环境和它们之间的关系。下图展示了包括设备驱动的整个系统,我们将在后面详细讲到它。在本实验中,你将去实现图中绿色高亮的部分。
+
+![Network server architecture][4]
+
+##### 核心网络服务器环境
+
+核心网络服务器环境由套接字调用派发器和 IwIP 自身组成的。套接字调用派发器就像一个文件服务器一样。用户环境使用 stubs(可以在 `lib/nsipc.c` 中找到它)去发送 IPC 消息到核心网络服务器环境。如果你看了 `lib/nsipc.c`,你就会发现核心网络服务器与我们创建的文件服务器 `i386_init` 的工作方式是一样的,`i386_init` 是使用 NS_TYPE_NS 创建的 NS 环境,因此我们检查 `envs`,去查找这个特殊的环境类型。对于每个用户环境的 IPC,网络服务器中的派发器将调用相应的、由 IwIP 提供的、代表用户的 BSD 套接字接口函数。
+
+普通用户环境不能直接使用 `nsipc_*` 调用。而是通过在 `lib/sockets.c` 中的函数来使用它们,这些函数提供了基于文件描述符的套接字 API。以这种方式,用户环境通过文件描述符来引用套接字,就像它们引用磁盘上的文件一样。一些操作(`connect`、`accept`、等等)是特定于套接字的,但 `read`、`write`、和 `close` 是通过 `lib/fd.c` 中一般的文件描述符设备派发代码的。就像文件服务器对所有的打开的文件维护唯一的内部 ID 一样,lwIP 也为所有的打开的套接字生成唯一的 ID。不论是文件服务器还是网络服务器,我们都使用存储在 `struct Fd` 中的信息去映射每个环境的文件描述符到这些唯一的 ID 空间上。
+
+尽管看起来文件服务器的网络服务器的 IPC 派发器行为是一样的,但它们之间还有很重要的差别。BSD 套接字调用(像 `accept` 和 `recv`)能够无限期阻塞。如果派发器让 lwIP 去执行其中一个调用阻塞,派发器也将被阻塞,并且在整个系统中,同一时间只能有一个未完成的网络调用。由于这种情况是无法接受的,所以网络服务器使用用户级线程以避免阻塞整个服务器环境。对于每个入站 IPC 消息,派发器将创建一个线程,然后在新创建的线程上来处理请求。如果线程被阻塞,那么只有那个线程被置入休眠状态,而其它线程仍然处于运行中。
+
+除了核心网络环境外,还有三个辅助环境。核心网络服务器环境除了接收来自用户应用程序的消息之外,它的派发器也接收来自输入环境和定时器环境的消息。
+
+##### 输出环境
+
+在为用户环境套接字调用提供服务时,lwIP 将为网卡生成用于发送的包。IwIP 将使用 `NSREQ_OUTPUT` 去发送在 IPC 消息页参数中附加了包的 IPC 消息。输出环境负责接收这些消息,并通过你稍后创建的系统调用接口来转发这些包到设备驱动程序上。
+
+##### 输入环境
+
+网卡接收到的包需要传递到 lwIP 中。输入环境将每个由设备驱动程序接收到的包拉进内核空间(使用你将要实现的内核系统调用),并使用 `NSREQ_INPUT` IPC 消息将这些包发送到核心网络服务器环境。
+
+包输入功能是独立于核心网络环境的,因为在 JOS 上同时实现接收 IPC 消息并从设备驱动程序中查询或等待包有点困难。我们在 JOS 中没有实现 `select` 系统调用,这是一个允许环境去监视多个输入源以识别准备处理哪个输入的系统调用。
+
+如果你查看了 `net/input.c` 和 `net/output.c`,你将会看到在它们中都需要去实现那个系统调用。这主要是因为实现它要依赖你的系统调用接口。在你实现了驱动程序和系统调用接口之后,你将要为这两个辅助环境写这个代码。
+
+##### 定时器环境
+
+定时器环境周期性发送 `NSREQ_TIMER` 类型的消息到核心服务器,以提醒它那个定时器已过期。IwIP 使用来自线程的定时器消息来实现各种网络超时。
+
+### Part A:初始化和发送包
+
+你的内核还没有一个时间概念,因此我们需要去添加它。这里有一个由硬件产生的每 10 ms 一次的时钟中断。每收到一个时钟中断,我们将增加一个变量值,以表示时间已过去 10 ms。它在 `kern/time.c` 中已实现,但还没有完全集成到你的内核中。
+
+```markdown
+练习 1、为 `kern/trap.c` 中的每个时钟中断增加一个到 `time_tick` 的调用。实现 `sys_time_msec` 并增加到 `kern/syscall.c` 中的 `syscall`,以便于用户空间能够访问时间。
+```
+
+使用 `make INIT_CFLAGS=-DTEST_NO_NS run-testtime` 去测试你的代码。你应该会看到环境计数从 5 开始以 1 秒为间隔减少。"-DTEST_NO_NS” 参数禁止在网络服务器环境上启动,因为在当前它将导致 JOS 崩溃。
+
+#### 网卡
+
+写驱动程序要求你必须深入了解硬件和软件中的接口。本实验将给你提供一个如何使用 E1000 接口的高度概括的文档,但是你在写驱动程序时还需要大量去查询 Intel 的手册。
+
+```markdown
+练习 2、为开发 E1000 驱动,去浏览 Intel 的 [软件开发者手册][5]。这个手册涵盖了几个与以太网控制器紧密相关的东西。QEMU 仿真了 82540EM。
+
+现在,你应该去浏览第 2 章,以对设备获得一个整体概念。写驱动程序时,你需要熟悉第 3 到 14 章,以及 4.1(不包括 4.1 的子节)。你也应该去参考第 13 章。其它章涵盖了 E1000 的组件,你的驱动程序并不与这些组件去交互。现在你不用担心过多细节的东西;只需要了解文档的整体结构,以便于你后面需要时容易查找。
+
+在阅读手册时,记住,E1000 是一个拥有很多高级特性的很复杂的设备,一个能让 E1000 工作的驱动程序仅需要它一小部分的特性和 NIC 提供的接口即可。仔细考虑一下,如何使用最简单的方式去使用网卡的接口。我们强烈推荐你在使用高级特性之前,只去写一个基本的、能够让网卡工作的驱动程序即可。
+```
+
+##### PCI 接口
+
+E1000 是一个 PCI 设备,也就是说它是插到主板的 PCI 总线插槽上的。PCI 总线有地址、数据、和中断线,并且 PCI 总线允许 CPU 与 PCI 设备通讯,以及 PCI 设备去读取和写入内存。一个 PCI 设备在它能够被使用之前,需要先发现它并进行初始化。发现 PCI 设备是 PCI 总线查找已安装设备的过程。初始化是分配 I/O 和内存空间、以及协商设备所使用的 IRQ 线的过程。
+
+我们在 `kern/pci.c` 中已经为你提供了使用 PCI 的代码。PCI 初始化是在引导期间执行的,PCI 代码遍历PCI 总线来查找设备。当它找到一个设备时,它读取它的供应商 ID 和设备 ID,然后使用这两个值作为关键字去搜索 `pci_attach_vendor` 数组。这个数组是由像下面这样的 `struct pci_driver` 条目组成:
+
+```c
+ struct pci_driver {
+ uint32_t key1, key2;
+ int (*attachfn) (struct pci_func *pcif);
+ };
+```
+
+如果发现的设备的供应商 ID 和设备 ID 与数组中条目匹配,那么 PCI 代码将调用那个条目的 `attachfn` 去执行设备初始化。(设备也可以按类别识别,那是通过 `kern/pci.c` 中其它的驱动程序表来实现的。)
+
+绑定函数是传递一个 _PCI 函数_ 去初始化。一个 PCI 卡能够发布多个函数,虽然这个 E1000 仅发布了一个。下面是在 JOS 中如何去表示一个 PCI 函数:
+
+```c
+ struct pci_func {
+ struct pci_bus *bus;
+
+ uint32_t dev;
+ uint32_t func;
+
+ uint32_t dev_id;
+ uint32_t dev_class;
+
+ uint32_t reg_base[6];
+ uint32_t reg_size[6];
+ uint8_t irq_line;
+ };
+```
+
+上面的结构反映了在 Intel 开发者手册里第 4.1 节的表 4-1 中找到的一些条目。`struct pci_func` 的最后三个条目我们特别感兴趣的,因为它们将记录这个设备协商的内存、I/O、以及中断资源。`reg_base` 和 `reg_size` 数组包含最多六个基址寄存器或 BAR。`reg_base` 为映射到内存中的 I/O 区域(对于 I/O 端口而言是基 I/O 端口)保存了内存的基地址,`reg_size` 包含了以字节表示的大小或来自 `reg_base` 的相关基值的 I/O 端口号,而 `irq_line` 包含了为中断分配给设备的 IRQ 线。在表 4-2 的后半部分给出了 E1000 BAR 的具体涵义。
+
+当设备调用了绑定函数后,设备已经被发现,但没有被启用。这意味着 PCI 代码还没有确定分配给设备的资源,比如地址空间和 IRQ 线,也就是说,`struct pci_func` 结构的最后三个元素还没有被填入。绑定函数将调用 `pci_func_enable`,它将去启用设备、协商这些资源、并在结构 `struct pci_func` 中填入它。
+
+```markdown
+练习 3、实现一个绑定函数去初始化 E1000。添加一个条目到 `kern/pci.c` 中的数组 `pci_attach_vendor` 上,如果找到一个匹配的 PCI 设备就去触发你的函数(确保一定要把它放在表末尾的 `{0, 0, 0}` 条目之前)。你在 5.2 节中能找到 QEMU 仿真的 82540EM 的供应商 ID 和设备 ID。在引导期间,当 JOS 扫描 PCI 总线时,你也可以看到列出来的这些信息。
+
+到目前为止,我们通过 `pci_func_enable` 启用了 E1000 设备。通过本实验我们将添加更多的初始化。
+
+我们已经为你提供了 `kern/e1000.c` 和 `kern/e1000.h` 文件,这样你就不会把构建系统搞糊涂了。不过它们现在都是空的;你需要在本练习中去填充它们。你还可能在内核的其它地方包含这个 `e1000.h` 文件。
+
+当你引导你的内核时,你应该会看到它输出的信息显示 E1000 的 PCI 函数已经启用。这时你的代码已经能够通过 `make grade` 的 `pci attach` 测试了。
+```
+
+##### 内存映射的 I/O
+
+软件与 E1000 通过内存映射的 I/O(MMIO) 来沟通。你在 JOS 的前面部分可能看到过 MMIO 两次:CGA 控制台和 LAPIC 都是通过写入和读取“内存”来控制和查询设备的。但这些读取和写入不是去往内存芯片的,而是直接到这些设备的。
+
+`pci_func_enable` 为 E1000 协调一个 MMIO 区域,来存储它在 BAR 0 的基址和大小(也就是 `reg_base[0]` 和 `reg_size[0]`),这是一个分配给设备的一段物理内存地址,也就是说你可以通过虚拟地址访问它来做一些事情。由于 MMIO 区域一般分配高位物理地址(一般是 3GB 以上的位置),因此你不能使用 `KADDR` 去访问它们,因为 JOS 被限制为最大使用 256MB。因此,你可以去创建一个新的内存映射。我们将使用 `MMIOBASE`(从实验 4 开始,你的 `mmio_map_region` 区域应该确保不能被 LAPIC 使用的映射所覆盖)以上的部分。由于在 JOS 创建用户环境之前,PCI 设备就已经初始化了,因此你可以在 `kern_pgdir` 处创建映射,并且让它始终可用。
+
+```markdown
+练习 4、在你的绑定函数中,通过调用 `mmio_map_region`(它就是你在实验 4 中写的,是为了支持 LAPIC 内存映射)为 E1000 的 BAR 0 创建一个虚拟地址映射。
+
+你将希望在一个变量中记录这个映射的位置,以便于后面访问你映射的寄存器。去看一下 `kern/lapic.c` 中的 `lapic` 变量,它就是一个这样的例子。如果你使用一个指针指向设备寄存器映射,一定要声明它为 `volatile`;否则,编译器将允许缓存它的值,并可以在内存中再次访问它。
+
+为测试你的映射,尝试去输出设备状态寄存器(第 12.4.2 节)。这是一个在寄存器空间中以字节 8 开头的 4 字节寄存器。你应该会得到 `0x80080783`,它表示以 1000 MB/s 的速度启用一个全双工的链路,以及其它信息。
+```
+
+提示:你将需要一些常数,像寄存器位置和掩码位数。如果从开发者手册中复制这些东西很容易出错,并且导致调试过程很痛苦。我们建议你使用 QEMU 的 [`e1000_hw.h`][6] 头文件做为基准。我们不建议完全照抄它,因为它定义的值远超过你所需要,并且定义的东西也不见得就是你所需要的,但它仍是一个很好的参考。
+
+##### DMA
+
+你可能会认为是从 E1000 的寄存器中通过写入和读取来传送和接收数据包的,其实这样做会非常慢,并且还要求 E1000 在其中去缓存数据包。相反,E1000 使用直接内存访问(DMA)从内存中直接读取和写入数据包,而且不需要 CPU 参与其中。驱动程序负责为发送和接收队列分配内存、设置 DMA 描述符、以及配置 E1000 使用的队列位置,而在这些设置完成之后的其它工作都是异步方式进行的。发送包的时候,驱动程序复制它到发送队列的下一个 DMA 描述符中,并且通知 E1000 下一个发送包已就绪;当轮到这个包发送时,E1000 将从描述符中复制出数据。同样,当 E1000 接收一个包时,它从接收队列中将它复制到下一个 DMA 描述符中,驱动程序将能在下一次读取到它。
+
+总体来看,接收队列和发送队列非常相似。它们都是由一系列的描述符组成。虽然这些描述符的结构细节有所不同,但每个描述符都包含一些标志和包含了包数据的一个缓存的物理地址(发送到网卡的数据包,或网卡将接收到的数据包写入到由操作系统分配的缓存中)。
+
+队列被实现为一个环形数组,意味着当网卡或驱动到达数组末端时,它将重新回到开始位置。它有一个头指针和尾指针,队列的内容就是这两个指针之间的描述符。硬件就是从头开始移动头指针去消费描述符,在这期间驱动程序不停地添加描述符到尾部,并移动尾指针到最后一个描述符上。发送队列中的描述符表示等待发送的包(因此,在平静状态下,发送队列是空的)。对于接收队列,队列中的描述符是表示网卡能够接收包的空描述符(因此,在平静状态下,接收队列是由所有的可用接收描述符组成的)。正确的更新尾指针寄存器而不让 E1000 产生混乱是很有难度的;要小心!
+
+指向到这些数组及描述符中的包缓存地址的指针都必须是物理地址,因为硬件是直接在物理内存中且不通过 MMU 来执行 DMA 的读写操作的。
+
+#### 发送包
+
+E1000 中的发送和接收功能本质上是独立的,因此我们可以同时进行发送接收。我们首先去攻克简单的数据包发送,因为我们在没有先去发送一个 “I'm here!" 包之前是无法测试接收包功能的。
+
+首先,你需要初始化网卡以准备发送,详细步骤查看 14.5 节(不必着急看子节)。发送初始化的第一步是设置发送队列。队列的详细结构在 3.4 节中,描述符的结构在 3.3.3 节中。我们先不要使用 E1000 的 TCP offload 特性,因此你只需专注于 “传统的发送描述符格式” 即可。你应该现在就去阅读这些章节,并要熟悉这些结构。
+
+##### C 结构
+
+你可以用 C `struct` 很方便地描述 E1000 的结构。正如你在 `struct Trapframe` 中所看到的结构那样,C `struct` 可以让你很方便地在内存中描述准确的数据布局。C 可以在字段中插入数据,但是 E1000 的结构就是这样布局的,这样就不会是个问题。如果你遇到字段对齐问题,进入 GCC 查看它的 "packed” 属性。
+
+查看手册中表 3-8 所给出的一个传统的发送描述符,将它复制到这里作为一个示例:
+
+```
+ 63 48 47 40 39 32 31 24 23 16 15 0
+ +---------------------------------------------------------------+
+ | Buffer address |
+ +---------------|-------|-------|-------|-------|---------------+
+ | Special | CSS | Status| Cmd | CSO | Length |
+ +---------------|-------|-------|-------|-------|---------------+
+```
+
+从结构右上角第一个字节开始,我们将它转变成一个 C 结构,从上到下,从右到左读取。如果你从右往左看,你将看到所有的字段,都非常适合一个标准大小的类型:
+
+```c
+ struct tx_desc
+ {
+ uint64_t addr;
+ uint16_t length;
+ uint8_t cso;
+ uint8_t cmd;
+ uint8_t status;
+ uint8_t css;
+ uint16_t special;
+ };
+```
+
+你的驱动程序将为发送描述符数组去保留内存,并由发送描述符指向到包缓冲区。有几种方式可以做到,从动态分配页到在全局变量中简单地声明它们。无论你如何选择,记住,E1000 是直接访问物理内存的,意味着它能访问的任何缓存区在物理内存中必须是连续的。
+
+处理包缓存也有几种方式。我们推荐从最简单的开始,那就是在驱动程序初始化期间,为每个描述符保留包缓存空间,并简单地将包数据复制进预留的缓冲区中或从其中复制出来。一个以太网包最大的尺寸是 1518 字节,这就限制了这些缓存区的大小。主流的成熟驱动程序都能够动态分配包缓存区(即:当网络使用率很低时,减少内存使用量),或甚至跳过缓存区,直接由用户空间提供(就是“零复制”技术),但我们还是从简单开始为好。
+
+```markdown
+练习 5、执行一个 14.5 节中的初始化步骤(它的子节除外)。对于寄存器的初始化过程使用 13 节作为参考,对发送描述符和发送描述符数组参考 3.3.3 节和 3.4 节。
+
+要记住,在发送描述符数组中要求对齐,并且数组长度上有限制。因为 TDLEN 必须是 128 字节对齐的,而每个发送描述符是 16 字节,你的发送描述符数组必须是 8 个发送描述符的倍数。并且不能使用超过 64 个描述符,以及不能在我们的发送环形缓存测试中溢出。
+
+对于 TCTL.COLD,你可以假设为全双工操作。对于 TIPG、IEEE 802.3 标准的 IPG(不要使用 14.5 节中表上的值),参考在 13.4.34 节中表 13-77 中描述的缺省值。
+```
+
+尝试运行 `make E1000_DEBUG=TXERR,TX qemu`。如果你使用的是打了 6.828 补丁的 QEMU,当你设置 TDT(发送描述符尾部)寄存器时你应该会看到一个 “e1000: tx disabled" 的信息,并且不会有更多 "e1000” 信息了。
+
+现在,发送初始化已经完成,你可以写一些代码去发送一个数据包,并且通过一个系统调用使它可以访问用户空间。你可以将要发送的数据包添加到发送队列的尾部,也就是说复制数据包到下一个包缓冲区中,然后更新 TDT 寄存器去通知网卡在发送队列中有另外的数据包。(注意,TDT 是一个进入发送描述符数组的索引,不是一个字节偏移量;关于这一点文档中说明的不是很清楚。)
+
+但是,发送队列只有这么大。如果网卡在发送数据包时卡住或发送队列填满时会发生什么状况?为了检测这种情况,你需要一些来自 E1000 的反馈。不幸的是,你不能只使用 TDH(发送描述符头)寄存器;文档上明确说明,从软件上读取这个寄存器是不可靠的。但是,如果你在发送描述符的命令字段中设置 RS 位,那么,当网卡去发送在那个描述符中的数据包时,网卡将设置描述符中状态字段的 DD 位,如果一个描述符中的 DD 位被设置,你就应该知道那个描述符可以安全地回收,并且可以用它去发送其它数据包。
+
+如果用户调用你的发送系统调用,但是下一个描述符的 DD 位没有设置,表示那个发送队列已满,该怎么办?在这种情况下,你该去决定怎么办了。你可以简单地丢弃数据包。网络协议对这种情况的处理很灵活,但如果你丢弃大量的突发数据包,协议可能不会去重新获得它们。可能需要你替代网络协议告诉用户环境让它重传,就像你在 `sys_ipc_try_send` 中做的那样。在环境上回推产生的数据是有好处的。
+
+```
+练习 6、写一个函数去发送一个数据包,它需要检查下一个描述符是否空闲、复制包数据到下一个描述符并更新 TDT。确保你处理的发送队列是满的。
+```
+
+现在,应该去测试你的包发送代码了。通过从内核中直接调用你的发送函数来尝试发送几个包。在测试时,你不需要去创建符合任何特定网络协议的数据包。运行 `make E1000_DEBUG=TXERR,TX qemu` 去测试你的代码。你应该看到类似下面的信息:
+
+```c
+ e1000: index 0: 0x271f00 : 9000002a 0
+ ...
+```
+
+在你发送包时,每行都给出了在发送数组中的序号、那个发送的描述符的缓存地址、`cmd/CSO/length` 字段、以及 `special/CSS/status` 字段。如果 QEMU 没有从你的发送描述符中输出你预期的值,检查你的描述符中是否有合适的值和你配置的正确的 TDBAL 和 TDBAH。如果你收到的是 "e1000: TDH wraparound @0, TDT x, TDLEN y" 的信息,意味着 E1000 的发送队列持续不断地运行(如果 QEMU 不去检查它,它将是一个无限循环),这意味着你没有正确地维护 TDT。如果你收到了许多 "e1000: tx disabled" 的信息,那么意味着你没有正确设置发送控制寄存器。
+
+一旦 QEMU 运行,你就可以运行 `tcpdump -XXnr qemu.pcap` 去查看你发送的包数据。如果从 QEMU 中看到预期的 "e1000: index” 信息,但你捕获的包是空的,再次检查你发送的描述符,是否填充了每个必需的字段和位。(E1000 或许已经遍历了你的发送描述符,但它认为不需要去发送)
+
+```
+练习 7、添加一个系统调用,让你从用户空间中发送数据包。详细的接口由你来决定。但是不要忘了检查从用户空间传递给内核的所有指针。
+```
+
+#### 发送包:网络服务器
+
+现在,你已经有一个系统调用接口可以发送包到你的设备驱动程序端了。输出辅助环境的目标是在一个循环中做下面的事情:从核心网络服务器中接收 `NSREQ_OUTPUT` IPC 消息,并使用你在上面增加的系统调用去发送伴随这些 IPC 消息的数据包。这个 `NSREQ_OUTPUT` IPC 是通过 `net/lwip/jos/jif/jif.c` 中的 `low_level_output` 函数来发送的。它集成 lwIP 栈到 JOS 的网络系统。每个 IPC 将包含一个页,这个页由一个 `union Nsipc` 和在 `struct jif_pkt pkt` 字段中的一个包组成(查看 `inc/ns.h`)。`struct jif_pkt` 看起来像下面这样:
+
+```c
+ struct jif_pkt {
+ int jp_len;
+ char jp_data[0];
+ };
+```
+
+`jp_len` 表示包的长度。在 IPC 页上的所有后续字节都是为了包内容。在结构的结尾处使用一个长度为 0 的数组来表示缓存没有一个预先确定的长度(像 `jp_data` 一样),这是一个常见的 C 技巧(也有人说这是一个令人讨厌的做法)。因为 C 并不做数组边界的检查,只要你确保结构后面有足够的未使用内存即可,你可以把 `jp_data` 作为一个任意大小的数组来使用。
+
+当设备驱动程序的发送队列中没有足够的空间时,一定要注意在设备驱动程序、输出环境和核心网络服务器之间的交互。核心网络服务器使用 IPC 发送包到输出环境。如果输出环境在由于一个发送包的系统调用而挂起,导致驱动程序没有足够的缓存去容纳新数据包,这时核心网络服务器将阻塞以等待输出服务器去接收 IPC 调用。
+
+```markdown
+练习 8、实现 `net/output.c`。
+```
+
+你可以使用 `net/testoutput.c` 去测试你的输出代码而无需整个网络服务器参与。尝试运行 `make E1000_DEBUG=TXERR,TX run-net_testoutput`。你将看到如下的输出:
+
+```c
+ Transmitting packet 0
+ e1000: index 0: 0x271f00 : 9000009 0
+ Transmitting packet 1
+ e1000: index 1: 0x2724ee : 9000009 0
+ ...
+```
+
+运行 `tcpdump -XXnr qemu.pcap` 将输出:
+
+
+```c
+ reading from file qemu.pcap, link-type EN10MB (Ethernet)
+ -5:00:00.600186 [|ether]
+ 0x0000: 5061 636b 6574 2030 30 Packet.00
+ -5:00:00.610080 [|ether]
+ 0x0000: 5061 636b 6574 2030 31 Packet.01
+ ...
+```
+
+使用更多的数据包去测试,可以运行 `make E1000_DEBUG=TXERR,TX NET_CFLAGS=-DTESTOUTPUT_COUNT=100 run-net_testoutput`。如果它导致你的发送队列溢出,再次检查你的 DD 状态位是否正确,以及是否告诉硬件去设置 DD 状态位(使用 RS 命令位)。
+
+你的代码应该会通过 `make grade` 的 `testoutput` 测试。
+
+```
+问题
+
+ 1、你是如何构造你的发送实现的?在实践中,如果发送缓存区满了,你该如何处理?
+```
+
+
+### Part B:接收包和 web 服务器
+
+#### 接收包
+
+就像你在发送包中做的那样,你将去配置 E1000 去接收数据包,并提供一个接收描述符队列和接收描述符。在 3.2 节中描述了接收包的操作,包括接收队列结构和接收描述符、以及在 14.4 节中描述的详细的初始化过程。
+
+```
+练习 9、阅读 3.2 节。你可以忽略关于中断和 offload 校验和方面的内容(如果在后面你想去使用这些特性,可以再返回去阅读),你现在不需要去考虑阈值的细节和网卡内部缓存是如何工作的。
+```
+
+除了接收队列是由一系列的等待入站数据包去填充的空缓存包以外,接收队列的其它部分与发送队列非常相似。所以,当网络空闲时,发送队列是空的(因为所有的包已经被发送出去了),而接收队列是满的(全部都是空缓存包)。
+
+当 E1000 接收一个包时,它首先与网卡的过滤器进行匹配检查(例如,去检查这个包的目标地址是否为这个 E1000 的 MAC 地址),如果这个包不匹配任何过滤器,它将忽略这个包。否则,E1000 尝试从接收队列头部去检索下一个接收描述符。如果头(RDH)追上了尾(RDT),那么说明接收队列已经没有空闲的描述符了,所以网卡将丢弃这个包。如果有空闲的接收描述符,它将复制这个包的数据到描述符指向的缓存中,设置这个描述符的 DD 和 EOP 状态位,并递增 RDH。
+
+如果 E1000 在一个接收描述符中接收到了一个比包缓存还要大的数据包,它将按需从接收队列中检索尽可能多的描述符以保存数据包的全部内容。为表示发生了这种情况,它将在所有的这些描述符上设置 DD 状态位,但仅在这些描述符的最后一个上设置 EOP 状态位。在你的驱动程序上,你可以去处理这种情况,也可以简单地配置网卡拒绝接收这种”长包“(这种包也被称为”巨帧“),你要确保接收缓存有足够的空间尽可能地去存储最大的标准以太网数据包(1518 字节)。
+
+```markdown
+练习 10、设置接收队列并按 14.4 节中的流程去配置 E1000。你可以不用支持 ”长包“ 或多播。到目前为止,我们不用去配置网卡使用中断;如果你在后面决定去使用接收中断时可以再去改。另外,配置 E1000 去除以太网的 CRC 校验,因为我们的评级脚本要求必须去掉校验。
+
+默认情况下,网卡将过滤掉所有的数据包。你必须使用网卡的 MAC 地址去配置接收地址寄存器(RAL 和 RAH)以接收发送到这个网卡的数据包。你可以简单地硬编码 QEMU 的默认 MAC 地址 52:54:00:12:34:56(我们已经在 lwIP 中硬编码了这个地址,因此这样做不会有问题)。使用字节顺序时要注意;MAC 地址是从低位字节到高位字节的方式来写的,因此 52:54:00:12 是 MAC 地址的低 32 位,而 34:56 是它的高 16 位。
+
+E1000 的接收缓存区大小仅支持几个指定的设置值(在 13.4.22 节中描述的 RCTL.BSIZE 值)。如果你的接收包缓存够大,并且拒绝长包,那你就不用担心跨越多个缓存区的包。另外,要记住的是,和发送一样,接收队列和包缓存必须是连接的物理内存。
+
+你应该使用至少 128 个接收描述符。
+```
+
+现在,你可以做接收功能的基本测试了,甚至都无需写代码去接收包了。运行 `make E1000_DEBUG=TX,TXERR,RX,RXERR,RXFILTER run-net_testinput`。`testinput` 将发送一个 ARP(地址解析协议)通告包(使用你的包发送的系统调用),而 QEMU 将自动回复它,即便是你的驱动尚不能接收这个回复,你也应该会看到一个 "e1000: unicast match[0]: 52:54:00:12:34:56" 的消息,表示 E1000 接收到一个包,并且匹配了配置的接收过滤器。如果你看到的是一个 "e1000: unicast mismatch: 52:54:00:12:34:56” 消息,表示 E1000 过滤掉了这个包,意味着你的 RAL 和 RAH 的配置不正确。确保你按正确的顺序收到了字节,并不要忘记设置 RAH 中的 "Address Valid” 位。如果你没有收到任何 "e1000” 消息,或许是你没有正确地启用接收功能。
+
+现在,你准备去实现接收数据包。为了接收数据包,你的驱动程序必须持续跟踪希望去保存下一下接收到的包的描述符(提示:按你的设计,这个功能或许已经在 E1000 中的一个寄存器来实现了)。与发送类似,官方文档上表示,RDH 寄存器状态并不能从软件中可靠地读取,因为确定一个包是否被发送到描述符的包缓存中,你需要去读取描述符中的 DD 状态位。如果 DD 位被设置,你就可以从那个描述符的缓存中复制出这个数据包,然后通过更新队列的尾索引 RDT 来告诉网卡那个描述符是空闲的。
+
+如果 DD 位没有被设置,表明没有接收到包。这就与发送队列满的情况一样,这时你可以有几种做法。你可以简单地返回一个 ”重传“ 错误来要求对端重发一次。对于满的发送队列,由于那是个临时状况,这种做法还是很好的,但对于空的接收队列来说就不太合理了,因为接收队列可能会保持好长一段时间的空的状态。第二个方法是挂起调用环境,直到在接收队列中处理了这个包为止。这个策略非常类似于 `sys_ipc_recv`。就像在 IPC 的案例中,因为我们每个 CPU 仅有一个内核栈,一旦我们离开内核,栈上的状态就会被丢弃。我们需要设置一个标志去表示那个环境由于接收队列下溢被挂起并记录系统调用参数。这种方法的缺点是过于复杂:E1000 必须被指示去产生接收中断,并且驱动程序为了恢复被阻塞等待一个包的环境,必须处理这个中断。
+
+```
+练习 11、写一个函数从 E1000 中接收一个包,然后通过一个系统调用将它发布到用户空间。确保你将接收队列处理成空的。
+```
+
+```markdown
+小挑战!如果发送队列是满的或接收队列是空的,环境和你的驱动程序可能会花费大量的 CPU 周期是轮询、等待一个描述符。一旦完成发送或接收描述符,E1000 能够产生一个中断,以避免轮询。修改你的驱动程序,处理发送和接收队列是以中断而不是轮询的方式进行。
+
+注意,一旦确定为中断,它将一直处于中断状态,直到你的驱动程序明确处理完中断为止。在你的中断服务程序中,一旦处理完成要确保清除掉中断状态。如果你不那样做,从你的中断服务程序中返回后,CPU 将再次跳转到你的中断服务程序中。除了在 E1000 网卡上清除中断外,也需要使用 `lapic_eoi` 在 LAPIC 上清除中断。
+```
+
+#### 接收包:网络服务器
+
+在网络服务器输入环境中,你需要去使用你的新的接收系统调用以接收数据包,并使用 `NSREQ_INPUT` IPC 消息将它传递到核心网络服务器环境。这些 IPC 输入消息应该会有一个页,这个页上绑定了一个 `union Nsipc`,它的 `struct jif_pkt pkt` 字段中有从网络上接收到的包。
+
+```markdown
+练习 12、实现 `net/input.c`。
+```
+
+使用 `make E1000_DEBUG=TX,TXERR,RX,RXERR,RXFILTER run-net_testinput` 再次运行 `testinput`,你应该会看到:
+
+```c
+ Sending ARP announcement...
+ Waiting for packets...
+ e1000: index 0: 0x26dea0 : 900002a 0
+ e1000: unicast match[0]: 52:54:00:12:34:56
+ input: 0000 5254 0012 3456 5255 0a00 0202 0806 0001
+ input: 0010 0800 0604 0002 5255 0a00 0202 0a00 0202
+ input: 0020 5254 0012 3456 0a00 020f 0000 0000 0000
+ input: 0030 0000 0000 0000 0000 0000 0000 0000 0000
+```
+
+"input:” 打头的行是一个 QEMU 的 ARP 回复的十六进制转储。
+
+你的代码应该会通过 `make grade` 的 `testinput` 测试。注意,在没有发送至少一个包去通知 QEMU 中的 JOS 的 IP 地址上时,是没法去测试包接收的,因此在你的发送代码中的 bug 可能会导致测试失败。
+
+为彻底地测试你的网络代码,我们提供了一个称为 `echosrv` 的守护程序,它在端口 7 上设置运行 `echo` 的服务器,它将回显通过 TCP 连接发送给它的任何内容。使用 `make E1000_DEBUG=TX,TXERR,RX,RXERR,RXFILTER run-echosrv` 在一个终端中启动 `echo` 服务器,然后在另一个终端中通过 `make nc-7` 去连接它。你输入的每一行都被这个服务器回显出来。每次在仿真的 E1000 上接收到一个包,QEMU 将在控制台上输出像下面这样的内容:
+
+```c
+ e1000: unicast match[0]: 52:54:00:12:34:56
+ e1000: index 2: 0x26ea7c : 9000036 0
+ e1000: index 3: 0x26f06a : 9000039 0
+ e1000: unicast match[0]: 52:54:00:12:34:56
+```
+
+做到这一点后,你应该也就能通过 `echosrv` 的测试了。
+
+```
+问题
+
+ 2、你如何构造你的接收实现?在实践中,如果接收队列是空的并且一个用户环境要求下一个入站包,你怎么办?
+```
+
+
+```
+小挑战!在开发者手册中阅读关于 EEPROM 的内容,并写出从 EEPROM 中加载 E1000 的 MAC 地址的代码。目前,QEMU 的默认 MAC 地址是硬编码到你的接收初始化代码和 lwIP 中的。修复你的初始化代码,让它能够从 EEPROM 中读取 MAC 地址,和增加一个系统调用去传递 MAC 地址到 lwIP 中,并修改 lwIP 去从网卡上读取 MAC 地址。通过配置 QEMU 使用一个不同的 MAC 地址去测试你的变更。
+```
+
+```
+小挑战!修改你的 E1000 驱动程序去使用 "零复制" 技术。目前,数据包是从用户空间缓存中复制到发送包缓存中,和从接收包缓存中复制回到用户空间缓存中。一个使用 ”零复制“ 技术的驱动程序可以通过直接让用户空间和 E1000 共享包缓存内存来实现。还有许多不同的方法去实现 ”零复制“,包括映射内容分配的结构到用户空间或直接传递用户提供的缓存到 E1000。不论你选择哪种方法,都要注意你如何利用缓存的问题,因为你不能在用户空间代码和 E1000 之间产生争用。
+```
+
+```
+小挑战!把 ”零复制“ 的概念用到 lwIP 中。
+
+一个典型的包是由许多头构成的。用户发送的数据被发送到 lwIP 中的一个缓存中。TCP 层要添加一个 TCP 包头,IP 层要添加一个 IP 包头,而 MAC 层有一个以太网头。甚至还有更多的部分增加到包上,这些部分要正确地连接到一起,以便于设备驱动程序能够发送最终的包。
+
+E1000 的发送描述符设计是非常适合收集分散在内存中的包片段的,像在 IwIP 中创建的包的帧。如果你排队多个发送描述符,但仅设置最后一个描述符的 EOP 命令位,那么 E1000 将在内部把这些描述符串成包缓存,并在它们标记完 EOP 后仅发送串起来的缓存。因此,独立的包片段不需要在内存中把它们连接到一起。
+
+修改你的驱动程序,以使它能够发送由多个缓存且无需复制的片段组成的包,并且修改 lwIP 去避免它合并包片段,因为它现在能够正确处理了。
+```
+
+```markdown
+小挑战!增加你的系统调用接口,以便于它能够为多于一个的用户环境提供服务。如果有多个网络栈(和多个网络服务器)并且它们各自都有自己的 IP 地址运行在用户模式中,这将是非常有用的。接收系统调用将决定它需要哪个环境来转发每个入站的包。
+
+注意,当前的接口并不知道两个包之间有何不同,并且如果多个环境去调用包接收的系统调用,各个环境将得到一个入站包的子集,而那个子集可能并不包含调用环境指定的那个包。
+
+在 [这篇][7] 外内核论文的 2.2 节和 3 节中对这个问题做了深度解释,并解释了在内核中(如 JOS)处理它的一个方法。用这个论文中的方法去解决这个问题,你不需要一个像论文中那么复杂的方案。
+```
+
+#### Web 服务器
+
+一个最简单的 web 服务器类型是发送一个文件的内容到请求的客户端。我们在 `user/httpd.c` 中提供了一个非常简单的 web 服务器的框架代码。这个框架内码处理入站连接并解析请求头。
+
+```markdown
+练习 13、这个 web 服务器中缺失了发送一个文件的内容到客户端的处理代码。通过实现 `send_file` 和 `send_data` 完成这个 web 服务器。
+```
+
+在你完成了这个 web 服务器后,启动这个 web 服务器(`make run-httpd-nox`),使用你喜欢的浏览器去浏览 http:// _host_ : _port_ /index.html 地址。其中 _host_ 是运行 QEMU 的计算机的名字(如果你在 athena 上运行 QEMU,使用 `hostname.mit.edu`(其中 hostname 是在 athena 上运行 `hostname` 命令的输出,或者如果你在运行 QEMU 的机器上运行 web 浏览器的话,直接使用 `localhost`),而 _port_ 是 web 服务器运行 `make which-ports` 命令报告的端口号。你应该会看到一个由运行在 JOS 中的 HTTP 服务器提供的一个 web 页面。
+
+到目前为止,你的评级测试得分应该是 105 分(满分为105)。
+
+```markdown
+小挑战!在 JOS 中添加一个简单的聊天服务器,多个人可以连接到这个服务器上,并且任何用户输入的内容都被发送到其它用户。为实现它,你需要找到一个一次与多个套接字通讯的方法,并且在同一时间能够在同一个套接字上同时实现发送和接收。有多个方法可以达到这个目的。lwIP 为 `recv`(查看 `net/lwip/api/sockets.c` 中的 `lwip_recvfrom`)提供了一个 MSG_DONTWAIT 标志,以便于你不断地轮询所有打开的套接字。注意,虽然网络服务器的 IPC 支持 `recv` 标志,但是通过普通的 `read` 函数并不能访问它们,因此你需要一个方法来传递这个标志。一个更高效的方法是为每个连接去启动一个或多个环境,并且使用 IPC 去协调它们。而且碰巧的是,对于一个套接字,在结构 Fd 中找到的 lwIP 套接字 ID 是全局的(不是每个环境私有的),因此,比如一个 `fork` 的子环境继承了它的父环境的套接字。或者,一个环境通过构建一个包含了正确套接字 ID 的 Fd 就能够发送到另一个环境的套接字上。
+```
+
+```
+问题
+
+ 3、由 JOS 的 web 服务器提供的 web 页面显示了什么?
+ 4. 你做这个实验大约花了多长的时间?
+```
+
+**本实验到此结束了。**一如既往,不要忘了运行 `make grade` 并去写下你的答案和挑战问题的解决方案的描述。在你动手之前,使用 `git status` 和 `git diff` 去检查你的变更,并不要忘了去 `git add answers-lab6.txt`。当你完成之后,使用 `git commit -am 'my solutions to lab 6’` 去提交你的变更,然后 `make handin` 并关注它的动向。
+
+--------------------------------------------------------------------------------
+
+via: https://pdos.csail.mit.edu/6.828/2018/labs/lab6/
+
+作者:[csail.mit][a]
+选题:[lujun9972][b]
+译者:[qhwdw](https://github.com/qhwdw)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://pdos.csail.mit.edu
+[b]: https://github.com/lujun9972
+[1]: http://wiki.qemu.org/download/qemu-doc.html#Using-the-user-mode-network-stack
+[2]: http://www.wireshark.org/
+[3]: http://www.sics.se/~adam/lwip/
+[4]: https://pdos.csail.mit.edu/6.828/2018/labs/lab6/ns.png
+[5]: https://pdos.csail.mit.edu/6.828/2018/readings/hardware/8254x_GBe_SDM.pdf
+[6]: https://pdos.csail.mit.edu/6.828/2018/labs/lab6/e1000_hw.h
+[7]: http://pdos.csail.mit.edu/papers/exo:tocs.pdf
diff --git a/translated/tech/20181017 How To Determine Which System Manager Is Running On Linux System.md b/translated/tech/20181017 How To Determine Which System Manager Is Running On Linux System.md
deleted file mode 100644
index b2240b2959..0000000000
--- a/translated/tech/20181017 How To Determine Which System Manager Is Running On Linux System.md
+++ /dev/null
@@ -1,175 +0,0 @@
-弄清 Linux 系统运行何种系统管理程序
-======
-虽然我们经常听到系统管理器这词,但很少有人深究其确切意义。现在我们将向你展示其区别。
-
-我会尽自己所能来解释清楚一切。我们大多都知道 System V 和 systemd 两种系统管理器。 System V (简写 Sysv) 是老系统所使用的古老且传统的 init 进程和系统管理器。
-
-Systemd 是全新的 init 进程和系统管理器,并且适配大部分主发布版本 Linux 系统。
-
-Linux 系统中主要有三种 init 进程系统,很出名且仍在使用。大多数 Linux 发布版本都使用其中之一。
-
-### 什么是初始化系统管理器 (init System Manager)?
-
-在基于 Linux/Unix 的操作系统中,init (初始化的简称) 是内核启动系统时开启的第一个进程。
-
-它持有的进程 ID(PID)号为 1,其在后台一直运行着,直到关机。
-
-Init 会查找 `/etc/inittab` 文件中相应配置信息来确定系统的运行级别,然后根据运行级别启动所有的后台进程和后台应用。
-
-作为 Linux 启动过程的一部分,BIOS,MBR,GRUB 和内核进程此进程之前就被激活了。
-
-下面列出的是 Linux 的可用运行级别(存在七个运行级别,从零到六)。
-
- * **`0:`** 停机
- * **`1:`** 单用户模式
- * **`2:`** 多用户, 无 NFS (译者注:Network File System 即网络文件系统)
- * **`3:`** 全功能多用户模式
- * **`4:`** 未使用
- * **`5:`** X11 (GUI – 图形用户界面)
- * **`6:`** 重启
-
-
-
-下面列出的是 Linux 系统中广泛使用的三种 init 进程系统。
-
- * **`System V (Sys V):`** System V(Sys V)是类 Unix 操作系统的首款传统的 `init` 进程系统。
- * **`Upstart:`** Upstart 基于事件驱动,是 `/sbin/init` 守护进程的替代品。
- * **`systemd:`** Systemd 是一款全新的 `init` 进程系统和系统管理器,它通过传统的 `SysV init` 进程系统来实现/适配全部的 Linux 主版本。
-
-
-
-### 什么是 System V (Sys V)?
-
-System V(Sys V)是类 Unix 操作系统的首款传统的 `init` 进程系统。init 是内核启动系统期间启动的第一个进程,它是所有进程的父进程。
-
-起初,大多数 Linux 发行版都使用名为 System V(Sys V)的传统 `init` 进程系统。 多年来,为了解决标准版本中的设计限制,发布了几个替代的 init 进程系统,例如launchd、Service Management Facility、systemd 和 Upstart。
-
-但只有 systemd 最终被几个主要 Linux 发行版本所采用,而放弃传统的 SysV。
-
-### 在 Linux 上如何识别出 `System V(Sys V)` 系统管理器
-
-在系统上运行如下命令来查看是否在运行着 System V (Sys V) 系统管理器:
-
-### 方法 1: 使用 `ps` 命令
-
-**ps** – 显示当前进程快照。`ps` 会显示当前活动进程的信息。其输出区分不出是 System V(SysV) 还是 upstart,所以我建议使用其它方法。
-
-```
-# ps -p1 | grep "init\|upstart\|systemd"
- 1 ? 00:00:00 init
-```
-
-### 方法 2: 使用 `rpm` 命令
-
-RPM 即 `Red Hat Package Manager (红帽包管理)`,是一款功能强大的[安装包管理][1]命令行具,在基于 Red Hat 的发布系统中使用,如 RHEL、CentOS、Fedora、openSUSE 和 Mageia。此工具可以在系统/服务上对软件进行安装、更新、删除、查询及验证等操作。通常 RPM 文件都带有 `.rpm` 后缀。
-RPM 会使用必须的库和依赖库来构建软件,并具不会与系统上安装的其它包冲突。
-
-```
-# rpm -qf /sbin/init
-SysVinit-2.86-17.el5
-```
-
-### 什么是 Upstart?
-
-Upstart 基于事件驱动,是 `/sbin/init` 守护进程的替代品。用来启动、停止及监视系统的所有任务和服务。
-
-最初,它是为 Ubuntu 系统而开发的,但也可以在所有的 Linux 发布版本中部署运行,以替代古老的 System-V init 进程系统。
-
-它在 Ubuntu 9.10 到 14.10 版本和基于 RHEL 6 的系统中使用,之后的 Linux 版本被 systemd 取代了。
-
-### 在 Linux 上如何识别出 `Upstart` 系统管理器
-
-在系统上运行如下命令来查看是否在运行着 Upstart 系统管理器:
-
-### 方法 1: 使用 `ps` 命令
-
-**ps** – 显示当前进程快照。`ps` 会显示当前活动进程的信息。其输出区分不出是 System V(SysV) 还是 upstart,所以我建议使用其它方法。
-
-```
-# ps -p1 | grep "init\|upstart\|systemd"
- 1 ? 00:00:00 init
-```
-
-### 方法 2: 使用 `rpm` 命令
-
-RPM 即 `Red Hat Package Manager (红帽包管理)`,是一款功能强大的安装包管理命令行具,在基于 Red Hat 的发布系统中使用,如 RHEL、CentOS、Fedora、openSUSE 和 Mageia。此[ RPM 命令][2]可以让你在系统/服务上对软件进行安装、更新、删除、查询及验证等操作。通常 RPM 文件都带有 `.rpm` 后缀。
-RPM 会使用必须的库和依赖库来构建软件,并具不会与系统上安装的其它包冲突。
-
-```
-# rpm -qf /sbin/init
-upstart-0.6.5-16.el6.x86_64
-```
-
-### 方法 3: 使用 `/sbin/init` 文件
-
-`/sbin/init` 程序会将根文件系统从内存加载或切换到磁盘。
-这是启动过程的主要部分。这个进程开始时的运行级别为 “N”(无)。`/sbin/init` 此程序会按照 `/etc/inittab` 配制文件的描述来初始化系统。
-
-```
-# /sbin/init --version
-init (upstart 0.6.5)
-Copyright (C) 2010 Canonical Ltd.
-
-This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-```
-
-### 什么是 systemd?
-
-Systemd 是一款全新的 `init` 进程系统和系统管理器,它通过传统的 `SysV init` 进程系统来实现/适配全部的 Linux 主版本。
-
-systemd 与 SysV 和 LSB (全称:Linux Standards Base) init 脚本兼容。它可以作为 sysv init 系统的直接替代品。其是内核启动的第一个进程并占有 1 的 PID。
-
-它是所有进程的父进程,Fedora 15 是第一个采用 systemd 而不是 upstart 的发行版本。[systemctl][3] 是一款命令行工具,它是管理 systemd 守护进程/服务(如 start、restart、stop、enable、disable、reload 和 status )的主要工具。
-
-systemd 使用 `.service` 文件而不是 bash 脚本(SysV init 使用)。systemd 把所有守护进程按顺序排列到自己 Cgroups (译者注:Cgroups 是 control groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物理资源(如:cpu,memory,IO等等)的机制。最初由 google 的工程师提出,后来被整合进Linux内核。Cgroups 也是 LXC 为实现虚拟化所使用的资源管理手段,可以说没有 cgroups 就没有 LXC。)中,所以通过探索 `/ cgroup/systemd` 文件就可以查看系统层次结构。
-
-### 在 Linux 上如何识别出 `systemd` 系统管理器
-
-在系统上运行如下命令来查看是否在运行着 systemd 系统管理器:
-
-### 方法 1: 使用 `ps` 命令
-
-**ps** – 显示当前进程快照。`ps` 会显示当前活动进程的信息。
-
-```
-# ps -p1 | grep "init\|upstart\|systemd"
- 1 ? 00:18:09 systemd
-```
-
-### 方法 2: 使用 `rpm` 命令
-
-RPM 即 `Red Hat Package Manager (红帽包管理)`,是一款功能强大的安装包管理命令行具,在基于 Red Hat 的发布系统中使用,如 RHEL、CentOS、Fedora、openSUSE 和 Mageia。此工具可以在系统/服务上对软件进行安装、更新、删除、查询及验证等操作。通常 RPM 文件都带有 `.rpm` 后缀。
-
-RPM 会使用必须的库和依赖库来构建软件,并具不会与系统上安装的其它包冲突。
-
-```
-# rpm -qf /sbin/init
-systemd-219-30.el7_3.9.x86_64
-```
-
-### 方法 3: 使用 `/sbin/init` 文件
-
-`/sbin/init` 程序会将根文件系统从内存加载或切换到磁盘。
-这是启动过程的主要部分。这个进程开始时的运行级别为 “N”(无)。`/sbin/init` 此程序会按照 `/etc/inittab` 配制文件的描述来初始化系统。
-
-```
-# file /sbin/init
-/sbin/init: symbolic link to `../lib/systemd/systemd'
-```
-
---------------------------------------------------------------------------------
-
-via: https://www.2daygeek.com/how-to-determine-which-init-system-manager-is-running-on-linux-system/
-
-作者:[Prakash Subramanian][a]
-选题:[lujun9972][b]
-译者:[runningwater](https://github.com/runningwater)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://www.2daygeek.com/author/prakash/
-[b]: https://github.com/lujun9972
-[1]: https://www.2daygeek.com/category/package-management/
-[2]: https://www.2daygeek.com/rpm-command-examples/
-[3]: https://www.2daygeek.com/how-to-check-all-running-services-in-linux/
diff --git a/translated/tech/20181026 An Overview of Android Pie.md b/translated/tech/20181026 An Overview of Android Pie.md
new file mode 100644
index 0000000000..9eb3ea5206
--- /dev/null
+++ b/translated/tech/20181026 An Overview of Android Pie.md
@@ -0,0 +1,126 @@
+Android 9.0 概览
+======
+
+
+
+我们来谈论一下 Android。尽管 Android 只是一款内核经过修改的 Linux,但经过多年的发展,Android 开发者们(或许包括正在阅读这篇文章的你)已经为这个平台的演变做出了很多值得称道的贡献。当然,可能很多人都已经知道,但我们还是要说,Android 并不完全开源,当你使用 Google 服务的时候,就已经接触到闭源的部分了。Google Play 商店就是其中之一,它不是一个开放的服务,不过这与 Android 是否开源没有太直接的联系,而是为了让你享用到美味、营养、高效、省电的馅饼(注:Android 9.0 代号为 Pie)。
+
+我在我的 Essential PH-1 手机上运行了 Android 9.0(我真的很喜欢这款手机,也很了解这家公司的境况并不好)。在我自己体验了一段时间之后,我认为它是会被大众接受的。那么 Android 9.0 到底好在哪里呢?下面我们就来深入探讨一下。我们的出发点是用户的角度,而不是开发人员的角度,因此我也不会深入探讨太底层的方面。
+
+### 手势操作
+
+Android 系统在新的手势操作方面投入了很多,但实际体验却不算太好。这个功能确实引起了我的兴趣。在这个功能发布之初,大家都对它了解甚少,纷纷猜测它会不会让用户使用多点触控的手势来浏览 Android 界面?又或者会不会是一个完全颠覆人们认知的东西?
+
+实际上,手势操作比大多数人设想的要更加微妙和简单,因为很多功能都浓缩到了 Home 键上。打开手势操作功能之后,Recent 键的功能就合并到 Home 键上了。因此,如果需要查看最近打开的应用程序,就不能简单地通过 Recent 键来查看,而应该从 Home 键向上轻扫一下。(图1)
+
+![Android Pie][2]
+
+图 1:Android 9.0 中的”最近的应用程序“界面。
+
+另一个不同的地方是 App Drawer。类似于查看最近打开的应用,需要在 Home 键向上滑动才能打开 App Drawer。
+
+而后退按钮则没有去掉。在应用程序需要用到后退功能时,它就会出现在屏幕的左下方。有时候即使应用程序自己带有后退按钮,Android 的后退按钮也会出现。
+
+当然,如果你不喜欢使用手势操作,也可以禁用这个功能。只需要按照下列步骤操作:
+
+
+ 1. 打开”设置“
+
+ 2. 向下滑动并进入 系统 > 手势
+
+ 3. 从 Home 键向上滑动
+
+ 4. 将 On/Off 滑块(图2)滑动至 Off 位置
+
+
+
+图 2:关闭手势操作。
+
+### 电池寿命
+
+人工智能已经在 Android 得到了充分的使用。现在,Android 使用人工智能大大提供了电池的续航时间,这样的新技术称为自适应电池。自适应电池可以根据用户的个人使用习惯来决定各种应用和服务的耗电优先级。通过使用人工智能技术,Android 可以分析用户对每一个应用或服务的使用情况,并适当地关闭未使用的应用程序,以免长期驻留在内存中白白消耗电池电量。
+
+对于这个功能的唯一一个警告是,如果人工智能出现问题并导致电池电量过早耗尽,就只能通过恢复出厂设置来解决这个问题了。尽管有这样的缺陷,在电池续航时间方面,Android 9.0 也比 Android 8.0 有所改善。
+
+### 分屏功能
+
+分屏对于 Android 来说不是一个新功能,但在 Android 9.0 上,它的使用方式和以往相比略有不同,而且只对于手势操作有影响,不使用手势操作的用户不受影响。要在 Android 9.0 上使用分屏功能,需要按照下列步骤操作:
+
+![Adding an app][5]
+
+图 3:在 Android 9.0 上将应用添加到分屏模式中。
+
+[Used with permission][3]
+
+ 1. 从 Home 键向上滑动,打开“最近的应用程序”。
+
+ 2. 找到需要放置在屏幕顶部的应用程序。
+
+ 3. 长按应用程序顶部的图标以显示新的弹出菜单。(图 3)
+
+ 4. 点击分屏,应用程序会在屏幕的上半部分打开。
+
+ 5. 找到要打开的第二个应用程序,然后点击它添加到屏幕的下半部分。
+
+使用分屏功能关闭应用程序的方法和原来保持一致。
+
+### 应用操作
+
+这个功能在早前已经引入了,但直到 Android 9.0 发布,人们才开始对它产生明显的关注。应用操作功能可以让用户直接从应用启动器来执行应用里的某些操作。
+
+例如,长按 GMail 启动器,就可以执行回复最近的邮件、撰写新邮件等功能。在 Android 8.0 中,这个功能则以弹出动作列表的方式展现。在 Android 9.0 中,这个功能更契合 Google 的材料设计Material Design风格(图 4)。
+
+![Actions][7]
+
+图 4:Android 应用操作。
+
+### 声音控制
+
+在 Android 中,声音控制的方式经常发生变化。在 Android 8.0 对“请勿打扰”功能进行调整之后,声音控制已经做得相当不错了。而在 Android 9.0 当中,声音控制再次进行了优化。
+
+Android 9.0 这次优化针对的是设备上快速控制声音的按钮。如果用户按下音量增大或减小按钮,就会看到一个新的弹出菜单,可以让用户控制设备的静音和震动情况。点击这个弹出菜单顶部的图标(图 5),可以在完全静音、静音和正常声音几种状态之间切换。
+
+![Sound control][9]
+
+图 5:Android 9.0 上的声音控制。
+
+### 屏幕截图
+
+由于我要撰写关于 Android 的文章,所以我会常常需要进行屏幕截图。而 Android 9.0 有意向我最喜欢的更新,就是分享屏幕截图。Android 9.0 可以在截取屏幕截图后,直接共享、编辑,或者删除不喜欢的截图,而不需要像以前一样打开 Google 相册、找到要共享的屏幕截图、打开图像然后共享图像。
+
+![Sharing ][11]
+
+图 6:共享屏幕截图变得更加容易。
+
+如果你想分享屏幕截图,只需要在截图后等待弹出菜单,点击分享(图 6),从标准的 Android 分享菜单中分享即可。
+
+### 更令人满意的 Android 体验
+
+Android 9.0 带来了更令人满意的用户体验。当然,以上说到的内容只是它的冰山一角。如果需要更多信息,可以查阅 Google 的官方 [Android 9.0 网站][12]。如果你的设备还没有收到升级推送,请耐心等待,Android 9.0 值得等待。
+
+--------------------------------------------------------------------------------
+
+via: https://www.linux.com/learn/2018/10/overview-android-pie
+
+作者:[Jack Wallen][a]
+选题:[lujun9972][b]
+译者:[HankChow](https://github.com/HankChow)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.linux.com/users/jlwallen
+[b]: https://github.com/lujun9972
+[1]: /files/images/pie1png
+[2]: https://www.linux.com/sites/lcom/files/styles/floated_images/public/pie_1.png?itok=BsSe8kqS "Android Pie"
+[3]: /licenses/category/used-permission
+[4]: /files/images/pie3png
+[5]: https://www.linux.com/sites/lcom/files/styles/floated_images/public/pie_3.png?itok=F-NB1dqI "Adding an app"
+[6]: /files/images/pie4png
+[7]: https://www.linux.com/sites/lcom/files/styles/floated_images/public/pie_4.png?itok=Ex-NzYSo "Actions"
+[8]: /files/images/pie5png
+[9]: https://www.linux.com/sites/lcom/files/styles/floated_images/public/pie_5.png?itok=NMW2vIlL "Sound control"
+[10]: /files/images/pie6png
+[11]: https://www.linux.com/sites/lcom/files/styles/floated_images/public/pie_6.png?itok=7Ik8_4jC "Sharing "
+[12]: https://www.android.com/versions/pie-9-0/
+
diff --git a/translated/tech/20181102 How To Create A Bootable Linux USB Drive From Windows OS 7,8 and 10.md b/translated/tech/20181102 How To Create A Bootable Linux USB Drive From Windows OS 7,8 and 10.md
new file mode 100644
index 0000000000..b51fbd8221
--- /dev/null
+++ b/translated/tech/20181102 How To Create A Bootable Linux USB Drive From Windows OS 7,8 and 10.md
@@ -0,0 +1,78 @@
+如何从 Windows OS 7、8 和 10 创建可启动的 Linux USB 盘?
+======
+如果你想了解 Linux,首先要做的是在你的系统上安装 Linux 系统。
+
+它可以通过两种方式实现,使用 Virtualbox、VMWare 等虚拟化应用,或者在你的系统上安装 Linux。
+
+如果你倾向从 Windows 系统迁移到 Linux 系统或计划在备用机上安装 Linux 系统,那么你须为此创建可启动的 USB 盘。
+
+我们已经写过许多[在 Linux 上创建可启动 USB 盘][1] 的文章,如 [BootISO][2]、[Etcher][3] 和 [dd 命令][4],但我们从来没有机会写一篇文章关于在 Windows 中创建 Linux 可启动 USB 盘的文章。不管怎样,我们今天有机会做这件事了。
+
+在本文中,我们将向你展示如何从 Windows 10 创建可启动的 Ubuntu USB 盘。
+
+这些步骤也适用于其他 Linux,但你必须从下拉列表中选择相应的操作系统而不是 Ubuntu。
+
+### 步骤 1:下载 Ubuntu ISO
+
+访问 [Ubuntu 发布][5] 页面并下载最新版本。我想建议你下载最新的 LTS 版而不是普通的发布。
+
+通过 MD5 或 SHA256 验证校验和,确保下载了正确的 ISO。输出值应与 Ubuntu 版本页面值匹配。
+
+### 步骤 2:下载 Universal USB Installer
+
+有许多程序可供使用,但我的首选是 [Universal USB Installer][6],它使用起来非常简单。只需访问 Universal USB Installer 页面并下载该程序即可。
+
+### 步骤3:如何使用 Universal USB Installer 创建可启动的 Ubuntu ISO
+
+这个程序在使用上不复杂。首先连接 USB 盘,然后点击下载的 Universal USB Installer。启动后,你可以看到类似于我们的界面。
+![][8]
+
+ * **`步骤 1:`** 选择Ubuntu 系统。
+ * **`步骤 2:`** 选择 Ubuntu ISO 下载位置。
+ * **`步骤 3:`** 默认它选择的是 USB 盘,但是要验证一下,接着勾选格式化选项。
+
+
+
+![][9]
+
+当你点击 `Create` 按钮时,它会弹出一个带有警告的窗口。不用担心,只需点击 `Yes` 继续进行此操作即可。
+![][10]
+
+USB 盘分区正在进行中。
+![][11]
+
+要等待一会儿才能完成。如你您想将它移至后台,你可以点击 `Background` 按钮。
+![][12]
+
+好了,完成了。
+![][13]
+
+现在你可以进行[安装 Ubuntu 系统][14]了。但是,它也提供了一个 live 模式,如果你想在安装之前尝试,那么可以使用它。
+
+--------------------------------------------------------------------------------
+
+via: https://www.2daygeek.com/create-a-bootable-live-usb-drive-from-windows-using-universal-usb-installer/
+
+作者:[Prakash Subramanian][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.2daygeek.com/author/prakash/
+[b]: https://github.com/lujun9972
+[1]: https://www.2daygeek.com/category/bootable-usb/
+[2]: https://www.2daygeek.com/bootiso-a-simple-bash-script-to-securely-create-a-bootable-usb-device-in-linux-from-iso-file/
+[3]: https://www.2daygeek.com/etcher-easy-way-to-create-a-bootable-usb-drive-sd-card-from-an-iso-image-on-linux/
+[4]: https://www.2daygeek.com/create-a-bootable-usb-drive-from-an-iso-image-using-dd-command-on-linux/
+[5]: http://releases.ubuntu.com/
+[6]: https://www.pendrivelinux.com/universal-usb-installer-easy-as-1-2-3/
+[7]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
+[8]: https://www.2daygeek.com/wp-content/uploads/2018/11/create-a-live-linux-os-usb-from-windows-using-universal-usb-installer-1.png
+[9]: https://www.2daygeek.com/wp-content/uploads/2018/11/create-a-live-linux-os-usb-from-windows-using-universal-usb-installer-2.png
+[10]: https://www.2daygeek.com/wp-content/uploads/2018/11/create-a-live-linux-os-usb-from-windows-using-universal-usb-installer-3.png
+[11]: https://www.2daygeek.com/wp-content/uploads/2018/11/create-a-live-linux-os-usb-from-windows-using-universal-usb-installer-4.png
+[12]: https://www.2daygeek.com/wp-content/uploads/2018/11/create-a-live-linux-os-usb-from-windows-using-universal-usb-installer-5.png
+[13]: https://www.2daygeek.com/wp-content/uploads/2018/11/create-a-live-linux-os-usb-from-windows-using-universal-usb-installer-6.png
+[14]: https://www.2daygeek.com/how-to-install-ubuntu-16-04/
diff --git a/translated/tech/20181105 5 Easy Tips for Linux Web Browser Security.md b/translated/tech/20181105 5 Easy Tips for Linux Web Browser Security.md
new file mode 100644
index 0000000000..6e7ea17a3a
--- /dev/null
+++ b/translated/tech/20181105 5 Easy Tips for Linux Web Browser Security.md
@@ -0,0 +1,141 @@
+提高 Linux 网络浏览器安全性的 5 个建议
+======
+
+
+如果你使用 Linux 桌面但从来不使用网络浏览器,那你算得上是百里挑一。网络浏览器是绝大多数人最常用的工具之一,无论是工作、娱乐、看新闻、社交、理财,对网络浏览器的依赖都比本地应用要多得多。因此,我们需要知道如何使用网络浏览器才是安全的。一直以来都有不法的犯罪分子以及他们建立的网页试图窃取私密的信息。正是由于我们需要通过网络浏览器收发大量的敏感信息,安全性就更是至关重要。
+
+对于用户来说,需要采取什么措施呢?在下文中,我会提出一些基本的建议,让你的重要数据不会被他人轻易窃取。尽管我用于演示的是 Firefox 网络浏览器,但其中大部分建议在任何一种网络浏览器当中都可以适用。
+
+### 正确选择浏览器
+
+尽管我我提出的建议具有普适性,但是正确选择网络浏览器也是很必要的。网络浏览器的更新频率是它安全性的一个重要体现。网络浏览器会不断暴露出新的问题,因此版本越新的网络浏览器修复的问题就越多,也越安全。在主流的网络浏览器当中,2017 年版本更新的发布量排行榜如下:
+
+ 1. Chrome 发布了 8 个更新(Chromium 全年跟进发布了大量安全补丁)。
+ 2. Firefox 发布了 7 个更新。
+ 3. Edge 发布了 2 个更新。
+ 4. Safari 发布了 1 个更新(苹果也会每年发布 5 到 6 个安全补丁)。
+
+
+
+
+网络浏览器会经常发布更新,同时用户方面也要及时升级到最新的版本,否则毫无意义了。尽管大部分流行的 Linux 发行版都会自动更新网络浏览器到最新版本,但还是有一些 Linux 发行版不会自动进行更新,所以最好还是手动保持浏览器更新到最新版本。这就意味着你所使用的 Linux 发行版对应的标准软件库中存放的很可能就不是最新版本的网络浏览器,在这种情况下,你可以随时从网络浏览器开发者提供的最新版本下载页中进行下载安装。
+
+如果你是一个勇于探索的人,你还可以尝试使用测试版或者每日构建daily build版的网络浏览器,不过,这些版本将伴随着不能稳定运行的可能性。在基于 Ubuntu 的发行版中,你可以使用到每日构建版的 Firefox,只需要执行以下命令添加所需的存储库:
+
+```
+sudo apt-add-repository ppa:ubuntu-mozilla-daily/ppa
+```
+
+按照以下命令更新 `apt` 并安装每日构建版 Firefox:
+
+```
+sudo apt-get update
+sudo apt-get install firefox
+```
+
+最重要的事情就是永远不要让你的网络浏览器版本过时,必须使用最新版本的网络浏览器。就是这样。如果你没有跟上版本更新的脚步,你使用的将会是一个暴露着各种问题的浏览器。
+
+### 使用隐私窗口
+
+将网络浏览器更新到最新版本之后,又该如何使用呢?答案是使用隐私窗口,如果你确实很重视安全的话。隐私窗口不会保存你的数据:密码?cookie?缓存?历史?什么都不会保存。因此隐私窗口的一个显著缺点就是每次访问常用的网站或者服务时,都得重新输入密码才能登录使用。当然,如果你认为网络浏览器的安全性很重要,就永远都不要保存任何密码。
+
+说到这里,我觉得每一个人都需要让自己的密码变得更强。事实上,大家都应该使用强密码,然后通过管理器来存储。而我的选择是[通用密码管理器Universal Password Manager][1]。
+
+### 保护好密码
+
+有的人可能会认为,每次都需要重复输入密码,这样的操作太麻烦了。在 Firefox 中,如果你既想保护好自己的密码,又不想经常输入密码,就可以通过 Master Password 这一款内置的工具来实现你的需求。起用了这个工具之后,需要输入正确的主密码,才能后续使用保存在浏览器中的其它密码。你可以按照以下步骤进行操作:
+
+ 1. 打开 Firefox。
+
+ 2. 点击菜单按钮。
+
+ 3. 点击“偏好设置”。
+
+ 4. 在偏好设置页面,点击“隐私与安全”。
+
+ 5. 在页面中勾选“使用主密码”选项(图 1)。
+
+ 6. 确认以后,输入新的主密码(图 2)。
+
+ 7. 重启 Firefox。
+
+
+
+
+![Master Password][3]
+
+图 1: Firefox 偏好设置页中的主密码设置。
+
+![Setting password][6]
+
+图 2:在 Firefox 中设置主密码。
+
+### 了解你使用的扩展和插件
+
+大多数网络浏览器在保护隐私方面都有很多扩展,你可以根据自己的需求选择不同的扩展。而我自己则选择了一下这些扩展:
+
+ * [Firefox Multi-Account Containers][7] \- 允许将某些站点配置为在容器化选项卡中打开。
+ * [Facebook Container][8] \- 始终在容器化选项卡中打开 Facebook(这个扩展需要 Firefox Multi-Account Containers)。
+ * [Avast Online Security][9] \- 识别并拦截已知的钓鱼网站,并显示网站的安全评级(由超过 4 亿用户的 Avast 社区支持)。
+ * [Mining Blocker][10] \- 拦截所有使用 CPU 的挖矿工具。
+ * [PassFF][11] \- 通过集成 `pass` (一个 UNIX 密码管理器)以安全存储密码。
+ * [Privacy Badger][12] \- 自动拦截网站跟踪。
+ * [uBlock Origin][13] \- 拦截已知的网站跟踪。
+
+
+除此以外,以下这些浏览器还有很多安全方面的扩展:
+
++ [Firefox][2]
+
++ [Chrome、Chromium,、Vivaldi][5]
+
++ [Opera][14]
+
+
+但并非每一个网络浏览器都会向用户提供扩展或插件。例如 Midoria 就只有少量可以开启或关闭的内置插件(图 3),同时这些轻量级浏览器的第三方插件也相当缺乏。
+
+![Midori Browser][15]
+
+图 3:Midori 浏览器的插件窗口。
+
+### 虚拟化
+
+如果担心数据在本地存储会被窃取,也可以在虚拟机上运行网络浏览器。只需要安装诸如 [VirtualBox][16] 的软件并安装 Linux 系统,然后就可以在虚拟机中运行任何一款浏览器了。再结合以上几条建议,基本可以保证一定的安全性。
+
+### 事情的真相
+
+实际上,如果你的机器连接到互联网,就永远不能保证 100% 的安全。当然,只要你正确地使用网络浏览器,你的安全系数会更高,数据也不会轻易被窃取。Linux 的一个好处是被安装恶意软件的几率比其它操作系统要低得多。另外,请记住要使用最新版本的网络浏览器、保持更新操作系统,并且谨慎访问一切网站。
+
+你还可以通过 Linux 基金会和 edX 开办的 “[Linux 介绍][17]” 公开课学习到更多这方面的内容。
+
+--------------------------------------------------------------------------------
+
+via: https://www.linux.com/learn/intro-to-linux/2018/11/5-easy-tips-linux-web-browser-security
+
+作者:[Jack Wallen][a]
+选题:[lujun9972][b]
+译者:[HankChow](https://github.com/HankChow)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.linux.com/users/jlwallen
+[b]: https://github.com/lujun9972
+[1]: http://upm.sourceforge.net/
+[2]: https://addons.mozilla.org/en-US/firefox/search/?q=security
+[3]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/browsersecurity_1.jpg?itok=gHMPKEvr "Master Password"
+[4]: https://www.linux.com/licenses/category/used-permission
+[5]: https://chrome.google.com/webstore/search/security
+[6]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/browsersecurity_2.jpg?itok=4L7DR2Ik "Setting password"
+[7]: https://addons.mozilla.org/en-US/firefox/addon/multi-account-containers/?src=search
+[8]: https://addons.mozilla.org/en-US/firefox/addon/facebook-container/?src=search
+[9]: https://addons.mozilla.org/en-US/firefox/addon/avast-online-security/?src=search
+[10]: https://addons.mozilla.org/en-US/firefox/addon/miningblocker/?src=search
+[11]: https://addons.mozilla.org/en-US/firefox/addon/passff/?src=search
+[12]: https://addons.mozilla.org/en-US/firefox/addon/privacy-badger17/
+[13]: https://addons.mozilla.org/en-US/firefox/addon/ublock-origin/?src=search
+[14]: https://addons.opera.com/en/search/?query=security
+[15]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/browsersecurity_3.jpg?itok=hdNor0gw "Midori Browser"
+[16]: https://www.virtualbox.org/
+[17]: https://training.linuxfoundation.org/linux-courses/system-administration-training/introduction-to-linux
+
diff --git a/translated/tech/20181106 How to partition and format a drive on Linux.md b/translated/tech/20181106 How to partition and format a drive on Linux.md
new file mode 100644
index 0000000000..038d0b1b5c
--- /dev/null
+++ b/translated/tech/20181106 How to partition and format a drive on Linux.md
@@ -0,0 +1,213 @@
+如何在 Linux 上对驱动器进行分区和格式化
+======
+这里有所有你想知道的关于设置存储器而又不敢问的一切。
+
+
+
+在大多数的计算机系统上,Linux 或者是其它,当你插入一个 USB 设备时,你会注意到一个提示驱动器存在的警告。如果该驱动器已经按你想要的进行分区和格式化,你只需要你的计算机在文件管理器或桌面上的某个地方列出驱动器。这是一个简单的要求,而且通常计算机都能满足。
+
+然而,有时候,驱动器并没有按你想要的方式进行格式化。对于这些,你必须知道如何查找准备连接到您计算机上的存储设备。
+
+### 什么是块设备?
+
+硬盘驱动器通常被称为“块设备”,因为硬盘驱动器以固定大小的块进行读写。这就可以区分硬盘驱动器和其它可能插入到您计算机的一些设备,如打印机,游戏手柄,麦克风,或相机。一个简单的方法用来列出连接到你 Linux 系统上的块设备就是使用 `lsblk` (list block devices)命令:
+
+```
+$ lsblk
+NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
+sda 8:0 0 238.5G 0 disk
+├─sda1 8:1 0 1G 0 part /boot
+└─sda2 8:2 0 237.5G 0 part
+ └─luks-e2bb...e9f8 253:0 0 237.5G 0 crypt
+ ├─fedora-root 253:1 0 50G 0 lvm /
+ ├─fedora-swap 253:2 0 5.8G 0 lvm [SWAP]
+ └─fedora-home 253:3 0 181.7G 0 lvm /home
+sdb 8:16 1 14.6G 0 disk
+└─sdb1 8:17 1 14.6G 0 part
+```
+
+最左列是设备标识符,每个都是以 `sd` 开头,并以一个字母结尾,字母从 `a` 开始。每个块设备上的分区分配一个数字,从 1 开始。例如,第一个设备上的第二个分区用 `sda2` 表示。如果你不确定到底是哪个分区,那也不要紧,只需接着往下读。
+
+`lsblk` 命令是无损的,仅仅用于检测,所以你可以放心的使用而不用担心破坏你驱动器上的数据。
+
+### 使用 `dmesg` 进行测试
+
+如果你有疑问,你可以通过在 `dmesg` 命令的最后几行查看驱动器的卷标,这个命令显示了操作系统最近的日志(比如说插入或移除一个驱动器)。一句话,如果你想确认你插入的设备是不是 `/dev/sdc` ,那么,把设备插到你的计算机上,然后运行这个 `dmesg` 命令:
+
+```
+$ sudo dmesg | tail
+```
+
+显示中列出的最新的驱动器就是你刚刚插入的那个。如果你拔掉它,并再运行这个命令一次,你可以看到,这个设备已经被移除。如果你再插上它再运行命令,这个设备又会出现在那里。换句话说,你可以监控内核对驱动器的识别。
+
+### 解理文件系统
+
+如果你只需要设备卷标,那么你的工作就完成了。但是如果你的目的是想创建一个可用的驱动器,那你还必须给这个驱动器做一个文件系统。
+
+如果你还不知道什么是文件系统,那么通过了解当没有文件系统时会发生什么,可能会更容易理解这个概念。如果你有多余的设备驱动器,并且上面没有什么重要的数据资料,你可以跟着做一下下面的这个实验。否则,请不要尝试,因为根据设计,这个肯定会删除您的资料。
+
+当一个驱动器没有文件系统时也是可以使用的。一旦你已经肯定,正解识别了一个驱动器,并且已经确定上面没有任何重要的资料,那就可以把它插到你的计算机上——但是不要挂载它,如果它被自动挂载上了,那就请手动卸载掉它。
+
+```
+$ su -
+# umount /dev/sdx{,1}
+```
+
+为了防止灾难性的复制-粘贴错误,下面的例子将使用不太可能出现的 `sdx` 来作为驱动器的卷标。
+
+现在,这个驱动器已经被卸载了,尝试使用下面的命令:
+
+```
+# echo 'hello world' > /dev/sdx
+```
+
+你已经可以将数据写入到块设备中,而无需将其挂载到你的操作系统上,也不需要一个文件系统。
+
+再把刚写入的数据取出来,你可以看到驱动器上的原始数据:
+
+```
+# head -n 1 /dev/sdx
+hello world
+```
+
+这看起来工作得很好,但是想象一下如果 "hello world" 这个短语是一个文件,如果你想要用这种方法写入一个新的文件,则必须:
+
+ 1. 知道第 1 行已经存在一个文件了
+ 2. 知道已经存在的文件只占用了 1 行
+ 3. 创建一种新的方法来在后面添加数据,或者在写第 2 行的时候重写第 1 行
+
+例如:
+
+```
+# echo 'hello world
+> this is a second file' >> /dev/sdx
+```
+
+获取第 1 个文件,没有任何改变。
+
+```
+# head -n 1 /dev/sdx
+hello world
+```
+
+但是,获取第 2 个文件的时候就显得有点复杂了。
+
+```
+# head -n 2 /dev/sdx | tail -n 1
+this is a second file
+```
+
+显然,通过这种方式读写数据并不实用,因此,开发人员创建了一个系统来跟踪文件的组成,并标识一个文件的开始和结束,等等。
+
+大多数的文件系统都需要一个分区。
+
+### 创建分区
+
+分区是硬盘驱动器的一种边界,用来告诉文件系统它可以占用哪些空间。举例来说,你有一个 4GB 的 USB 驱动器,你可以只分一个分区占用一个驱动器 (4GB),或两个分区,每个 2GB (又或者是一个 1GB,一个 3GB,只要你愿意),或者三个不同的尺寸大小,等等。这种组合将是无穷无尽的。
+
+假设你的驱动器是 4GB,你可以 GNU `parted` 命令来创建一个大的分区。
+
+```
+# parted /dev/sdx --align opt mklabel msdos 0 4G
+```
+
+按 `parted` 命令的要求,首先指定了驱动器的路径。
+
+`\--align` 选项让 `parted` 命令自动选择一个最佳的开始点和结束点。
+
+`mklabel` 命令在驱动器上创建了一个分区表 (称为磁盘卷标)。这个例子使用了 msdos 磁盘卷标,因为它是一个非常兼容和流行的卷标,虽然 gpt 正变得越来越普遍。
+
+最后定义了分区所需的起点和终点。因为使用了 `\--align opt` 标志,所以 `parted` 将根据需要调整大小以优化驱动器的性能,但这些数字仍然可以做为参考。
+
+接下来,创建实际的分区。如果你开始点和结束点的选择并不是最优的, `parted` 会向您发出警告并让您做出调整。
+
+```
+# parted /dev/sdx -a opt mkpart primary 0 4G
+
+Warning: The resulting partition is not properly aligned for best performance: 1s % 2048s != 0s
+Ignore/Cancel? C
+# parted /dev/sdx -a opt mkpart primary 2048s 4G
+```
+
+如果你再次运行 `lsblk` 命令,(你可能必须要拔掉驱动器,并把它再插回去),你就可以看到你的驱动器上现在已经有一个分区了。
+
+### 手动创建一个文件系统
+
+我们有很多文件系统可以使用。有些是开源和免费的,另外的一些并不是。一些公司拒绝支持开源文件系统,所以他们的用户无法使用开源的文件系统读取,而开源的用户也无法在不对其进行逆向工程的情况下从封闭的文件系统中读取。
+
+尽管有这种特殊的情况存在,还是仍然有很多操作系统可以使用,选择哪个取决于驱动器的用途。如果你希望你的驱动器兼容多个系统,那么你唯一的选择是 exFAT 文件系统。然而微软尚未向任何开源内核提交 exFAT 的代码,因此你可能必须在软件包管理器中安装 exFAT 支持,但是 Windows 和 MacOS 都支持 exFAT 文件系统。
+
+一旦你安装了 exFAT 支持,你可以在驱动器上你创建好的分区中创建一个 exFAT 文件系统。
+
+```
+# mkfs.exfat -n myExFatDrive /dev/sdx1
+```
+
+现在你的驱动器可由封闭系统和其它开源的系统(尚未经过微软批准)内核模块进行读写了。
+
+Linux 中常见的文件系统是 [ext4][1]。但对于便携式的设备来说,这可能是一个麻烦的文件系统,因为它保留了用户的权限,这些权限通常因为计算机而异,但是它通常是一个可靠而灵活的文件系统。只要你熟悉管理权限,那 ext4 对于便携式的设备来说就是一个很棒的文件系统。
+
+```
+# mkfs.ext4 -L myExt4Drive /dev/sdx1
+```
+
+拔掉你的驱动器,再把它插回去。对于 ext4 文件系统的便携设备来说,使用 `sudo` 创建一个目录,并将该目录的权限授予用户和系统中通用的组。如果你不确定使用哪个用户和组,也可以使用 `sudo` 或 `root` 来修改出现问题的设备的读写权限。
+
+### 使用桌面工具
+
+很高兴知道了在只有一个 Linux shell的时候,如何操作和处理你的块设备,但是,有时候你仅仅是想让一个驱动器可用,而不需要进行那么多的检测。 GNOME 的 KDE 的开发者们提供了这样的一些优秀的工具让这个过程变得简单。
+
+[GNOME 磁盘][2] 和 [KDE 分区管理器][3] 是一个图形化的工具,为本文到目前为止提到的一切提供了一个一体化的解决方案。启动其中的任何一个,来查看所有连接的设备(在左侧列表中),创建和调整分区大小,和创建文件系统。
+
+![KDE 分区管理器][5]
+
+KDE 分区管理器
+
+可以预见的是,GNOME 版本会比 KDE 版本更加简单,因此,我将使用复杂的版本进行演示——如果你愿意动手的话,很容易弄清楚 GNOME 磁盘工具的使用。
+
+启动 KDE 分区管理工具,然后输入你的 root 密码。
+
+在最左边的一列,选择你想要格式化的驱动器。如果你的驱动器并没有列出来,确认下是否已经插好,然后选择 Tools > Refresh devices (或使用键盘上的 F5 键)。
+
+除非你想销毁驱动器已经存在的分区表,否则请勿继续。选择好驱动器后,单击顶部工具栏中的 New Partition Table 。系统会提示你为该分区选择一个卷标: gpt 或 msdos 。前者更加灵活可以处理更大的驱动器,而后者像很多微软的技术一样,是占据大量市场份额的事实上的标准。
+
+现在您有了一个新的分区表,在右侧的面板中右键单击你的设备,然后选择 New 来创建新的分区,按照提示设置分区的类型和大小。此操作包括了分区步骤和创建文件系统。
+
+![创建一个新分区][7]
+
+创建一个新分区
+
+要将更改应用于你的驱动器,单击窗口左上角的 Apply 按钮。
+
+### 硬盘驱动器, 容易驱动
+
+在 Linux 上处理硬盘驱动器很容易,甚至如果你理解硬盘驱动器的语言就更容易了。自从切换到 Linux 系统以来,我已经能够以任何我想要的方式来处理我的硬盘驱动器了。由于 Linux 在处理存储提供的透明性,因此恢复数据也变得更加容易了。
+
+如果你想实验并了解有关硬盘驱动器的更多的信息,请参考下面的几个提示:
+
+ 1. 备份您的数据,而不仅仅是你在实验的驱动器上。仅仅需要一个小小的错误操作来破坏一个重要驱动器的分区。(这是一个用来学习重建丢失分区的很好的方法,但并不是很有趣)。
+ 2. 反复确认你所定位的驱动器是正确的驱动器。我经常使用 `lsblk` 来确定我并没有移动驱动器。(因为从两个独立的 USB 端口移除两个驱动器很容易,然后以不同的顺序重新连接它们,就会很容易导致它们获得了新的驱动器标签。)
+ 3. 花点时间“销毁”你测试的驱动器,看看你是否可以把数据恢复。在删除文件系统后,重新创建分区表或尝试恢复数据是一个很好的学习体验。
+
+还有一些更好玩的东西,如果你身边有一个封闭的操作系统,在上面尝试使用一个开源的文件系统。有一些项目致力于解决这种兼容性,并且尝试让它们以一种可靠稳定的方式工作是一个很好的业余项目。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/11/partition-format-drive-linux
+
+作者:[Seth Kenlon][a]
+选题:[lujun9972][b]
+译者:[Jamskr](https://github.com/Jamskr)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/seth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/article/17/5/introduction-ext4-filesystem
+[2]: https://wiki.gnome.org/Apps/Disks
+[3]: https://www.kde.org/applications/system/kdepartitionmanager/
+[4]: /file/413586
+[5]: https://opensource.com/sites/default/files/uploads/blockdevices_kdepartition.jpeg (KDE Partition Manager)
+[6]: /file/413591
+[7]: https://opensource.com/sites/default/files/uploads/blockdevices_newpartition.jpeg (Create a new partition)
diff --git a/translated/tech/20181107 Automate a web browser with Selenium.md b/translated/tech/20181107 Automate a web browser with Selenium.md
new file mode 100644
index 0000000000..0e0f821ce4
--- /dev/null
+++ b/translated/tech/20181107 Automate a web browser with Selenium.md
@@ -0,0 +1,121 @@
+使用 Selenium 自动化 Web 浏览器
+======
+
+
+[Selenium][1] 是浏览器自动化的绝佳工具。使用 Selenium IDE,你可以录制命令序列(如单击、拖动和输入),验证结果并最终存储此自动化测试供日后使用。这非常适合在浏览器中进行积极开发。但是当你想要将这些测试与 CI/CD 流集成时,是时候使用 Selenium WebDriver 了。
+
+WebDriver 公开了一个绑定了许多编程语言的 API,它允许你将浏览器测试与其他测试集成。这篇文章向你展示了如何在容器中运行 WebDriver 并将其与 Python 程序一起使用。
+
+### 使用 Podman 运行 Selenium
+
+Podman是下面例子的容器运行时。有关如何开始使用 Podman 的信息,请参见[此前文章][2]。
+
+此例使用了 Selenium 的独立容器,其中包含 WebDriver 服务器和浏览器本身。要在后台启动服务器容器,请运行以下命令:
+
+```
+$ podman run -d --network host --privileged --name server \
+ docker.io/selenium/standalone-firefox
+```
+
+当你使用特权标志和主机网络运行容器时,你可以稍后从在 Python 中连接到此容器。你不需要使用 sudo。
+
+### 在 Python 中使用 Selenium
+
+现在你可以提供一个使用此服务器的简单程序。这个程序很小,但应该会让你知道可以做什么:
+
+```
+from selenium import webdriver
+from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
+
+server ="http://127.0.0.1:4444/wd/hub"
+
+driver = webdriver.Remote(command_executor=server,
+ desired_capabilities=DesiredCapabilities.FIREFOX)
+
+print("Loading page...")
+driver.get("https://fedoramagazine.org/")
+print("Loaded")
+assert "Fedora" in driver.title
+
+driver.quit()
+print("Done.")
+```
+
+首先,程序连接到你已经启动的容器。然后它加载 Fedora Magazine 网页并判断 “Fedora” 是页面标题的一部分。最后,它退出会话。
+
+需要 Python 绑定才能运行此程序。既然你已经在使用容器了,为什么不在容器中这样做呢?将以下内容保存到 Dockerfile 中:
+
+```
+FROM fedora:29
+RUN dnf -y install python3
+RUN pip3 install selenium
+```
+
+然后使用 Podman 在与 Dockerfile 相同的文件夹中构建容器镜像:
+
+```
+$ podman build -t selenium-python .
+```
+
+要在容器中运行程序,在运行容器时将包含 Python 代码的文件作为卷挂载:
+
+```
+$ podman run -t --rm --network host \
+ -v $(pwd)/browser-test.py:/browser-test.py:z \
+ selenium-python python3 browser-test.py
+```
+
+输出看上去像这样:
+
+```
+Loading page...
+Loaded
+Done.
+```
+
+### 接下来做什么
+
+上面的示例程序是最小的,也许没那么有用。但这仅仅是最表面的东西!查看 [Selenium][3] 和 [Python 绑定][4] 的文档。在那里,你将找到有关如何在页面中查找元素、处理弹出窗口或填写表单的示例。拖放也是可能的,当然还有等待事件。
+
+在实现一些不错的测试后,你可能希望将它们包含在 CI/CD pipeline 中。幸运的是,这是相当直接的,因为一切都是容器化的。
+
+你可能也有兴趣设置 [grid][5] 来并行运行测试。这不仅有助于加快速度,还允许你同时测试多个不同的浏览器。
+
+### 清理
+
+当你容器使用完后,可以使用以下命令停止并删除独立容器:
+
+```
+$ podman stop server
+$ podman rm server
+```
+
+如果你还想释放磁盘空间,请运行以下命令删除镜像:
+
+```
+$ podman rmi docker.io/selenium/standalone-firefox
+$ podman rmi selenium-python fedora:29
+```
+
+### 总结
+
+在本篇中,你已经看到使用容器技术开始使用 Selenium 是多么容易。它允许你自动化与网站的交互,以及测试交互。Podman 允许你在没有超级用户权限或 Docker 守护程序的情况下运行所需的容器。最后,Python 绑定允许你使用普通的 Python 代码与浏览器进行交互。
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/automate-web-browser-selenium/
+
+作者:[Lennart Jern][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://fedoramagazine.org/author/lennartj/
+[b]: https://github.com/lujun9972
+[1]: https://www.seleniumhq.org/
+[2]: https://fedoramagazine.org/running-containers-with-podman/
+[3]: https://www.seleniumhq.org/docs/
+[4]: https://selenium-python.readthedocs.io
+[5]: https://www.seleniumhq.org/docs/07_selenium_grid.jsp
diff --git a/translated/tech/20181117 How to enter single user mode in SUSE 12 Linux.md b/translated/tech/20181117 How to enter single user mode in SUSE 12 Linux.md
new file mode 100644
index 0000000000..1a098bb0ab
--- /dev/null
+++ b/translated/tech/20181117 How to enter single user mode in SUSE 12 Linux.md
@@ -0,0 +1,54 @@
+如何在 SUSE 12 Linux 中进入单用户模式?
+======
+一篇了解如何在 SUSE 12 Linux 服务器中进入单用户模式的简短文章。
+
+![How to enter single user mode in SUSE 12 Linux][1]
+
+在这篇简短的文章中,我们将向你介绍在 SUSE 12 Linux 中进入单用户模式的步骤。在排除系统主要问题时,单用户模式始终是首选。单用户模式禁用网并且没有其他用户登录,你可以排除许多多用户系统的情况,可以帮助你快速排除故障。单用户模式最常见的一种用处是[重置忘记的 root 密码][2]。
+
+### 1\. 暂停启动过程
+
+首先,你需要拥有机器的控制台才能进入单用户模式。如果它是 VM 就要 VM 控制台,如果它是物理机那么你需要连接它的 iLO/串口控制台。重启系统并按任意键停止 grub 启动菜单中的内核自动启动。
+
+![Kernel selection menu at boot in SUSE 12][3]
+
+### 2\. 编辑内核的启动选项
+
+进入上面的页面后,在所选内核(通常是你首选的最新内核)上按 “e” 更新其启动选项。你会看到下面的页面。
+
+![grub2 edits in SUSE 12][4]
+
+现在,向下滚动到内核引导行,并在行尾添加 `init=/bin/bash`,如下所示。
+
+![Edit to boot in single user shell][5]
+
+### 3\. 引导编辑后的内核
+
+现在按 `Ctrl-x` 或 `F10` 来启动这个编辑过的内核。内核将以单用户模式启动,你将看到井号提示符,即有服务器的 root 访问权限。此时,根文件系统以只读模式挂载。因此,你对系统所做的任何更改都不会被保存。
+
+运行以下命令以将根文件系统重新挂载为可重写入的。
+
+```
+kerneltalks:/ # mount -o remount,rw /
+```
+
+这就完成了!继续在单用户模式中做你必要的事情吧。完成后不要忘了重启服务器引导到普通多用户模式。
+
+--------------------------------------------------------------------------------
+
+via: https://kerneltalks.com/howto/how-to-enter-single-user-mode-in-suse-12-linux/
+
+作者:[kerneltalks][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://kerneltalks.com
+[b]: https://github.com/lujun9972
+[1]: https://a4.kerneltalks.com/wp-content/uploads/2018/11/How-to-enter-single-user-mode-in-SUSE-12-Linux.png
+[2]: https://kerneltalks.com/linux/recover-forgotten-root-password-rhel/
+[3]: https://a1.kerneltalks.com/wp-content/uploads/2018/11/Grub-menu-in-SUSE-12.png
+[4]: https://a3.kerneltalks.com/wp-content/uploads/2018/11/grub2-editor.png
+[5]: https://a4.kerneltalks.com/wp-content/uploads/2018/11/Edit-to-boot-in-single-user-shell.png
diff --git a/translated/tech/20181119 9 obscure Python libraries for data science.md b/translated/tech/20181119 9 obscure Python libraries for data science.md
new file mode 100644
index 0000000000..ec9cab2858
--- /dev/null
+++ b/translated/tech/20181119 9 obscure Python libraries for data science.md
@@ -0,0 +1,268 @@
+
+9个不为人知晓的Python数据科学库
+======
+
+除了 pandas 、scikit-learn 和 matplotlib,还要学习一些用 Python 进行数据科学的新技巧。
+
+
+
+
+Python 是一种令人惊叹的语言。事实上,它是世界上增长最快的编程语言之一。它一次又一次地证明了它在各个行业的开发者和数据科学者中的作用。Python 及其库的整个生态系统使其成为全世界用户(初学者和高级用户)的恰当选择。它成功和受欢迎的原因之一是它的一组强大的库,使它如此动态和快速。
+
+在本文中,我们将看到 Python 库中的一些数据科学工具,而不是那些常用的工具,如 **pandas,scikit-learn** ,和 **matplotlib** 。虽然像 **pandas,scikit-learn** 这样的库是机器学习中最常想到的,但是了解这个领域的其他 Python 产品库也是非常有帮助的。
+
+### Wget
+
+提取数据,尤其是从网络中提取数据,是数据科学家的重要任务之一。[Wget][1] 是一个免费的工具,用于从网络上非交互式下载文件。它支持 HTTP、HTTPS 和 FTP 协议,以及通过 HTTP 代理进行检索。因为它是非交互式的,所以即使用户没有登录,它也可以在后台工作。所以下次你想下载一个网站或者网页上的所有图片,**wget** 会提供帮助。
+
+#### 安装
+
+```
+$ pip install wget
+```
+
+#### 例子
+
+```
+import wget
+url = 'http://www.futurecrew.com/skaven/song_files/mp3/razorback.mp3'
+
+filename = wget.download(url)
+100% [................................................] 3841532 / 3841532
+
+filename
+'razorback.mp3'
+```
+
+### 钟摆
+
+对于在 Python 中处理时间感到沮丧的人来说, **[Pendulum][2]** 库是很有帮助的。这是一个 Python 包,可以简化 **datetime** 操作。它是 Python 原生类的一个替换。有关详细信息,请参阅[documentation][3]。
+
+
+#### 安装
+
+```
+$ pip install pendulum
+```
+
+#### 例子
+
+```
+import pendulum
+
+dt_toronto = pendulum.datetime(2012, 1, 1, tz='America/Toronto')
+dt_vancouver = pendulum.datetime(2012, 1, 1, tz='America/Vancouver')
+
+print(dt_vancouver.diff(dt_toronto).in_hours())
+
+3
+```
+
+### 不平衡学习
+
+当每个类别中的样本数几乎相同(即平衡)时,大多数分类算法会工作得最好。但是现实生活中的案例中充满了不平衡的数据集,这可能会影响到机器学习算法的学习和后续预测。幸运的是, **[imbalanced-learn][4]** 库就是为了解决这个问题而创建的。它与[**scikit-learn**][5] 兼容,并且是 **[scikit-learn-contrib][6]** 项目的一部分。下次遇到不平衡的数据集时,可以尝试一下。
+
+#### 安装
+
+```
+pip install -U imbalanced-learn
+
+# or
+
+conda install -c conda-forge imbalanced-learn
+```
+
+#### 例子
+
+有关用法和示例,请参阅 [documentation][7] 。
+
+
+### 闪光灯文字
+
+在自然语言处理( NLP )任务中清理文本数据通常需要替换句子中的关键词或从句子中提取关键词。通常,这种操作可以用正则表达式来完成,但是如果要搜索的术语数达到数千个,它们可能会变得很麻烦。
+
+Python的 **[FlashText][8]** 模块,基于 [FlashText algorithm][9]算法,为这种情况提供了一个合适的替代方案。FlashText 的最佳部分是运行时间与搜索项的数量无关。你可以在 [documentation][10] 中读到更多关于它的信息。
+
+#### 安装
+
+```
+$ pip install flashtext
+```
+
+#### 例子
+
+##### **提取关键词:**
+
+```
+from flashtext import KeywordProcessor
+keyword_processor = KeywordProcessor()
+
+# keyword_processor.add_keyword(, )
+
+keyword_processor.add_keyword('Big Apple', 'New York')
+keyword_processor.add_keyword('Bay Area')
+keywords_found = keyword_processor.extract_keywords('I love Big Apple and Bay Area.')
+
+keywords_found
+['New York', 'Bay Area']
+```
+
+**替代关键词:**
+
+```
+keyword_processor.add_keyword('New Delhi', 'NCR region')
+
+new_sentence = keyword_processor.replace_keywords('I love Big Apple and new delhi.')
+
+new_sentence
+'I love New York and NCR region.'
+```
+
+For more examples, refer to the [usage][11] section in the documentation.
+
+有关更多示例,请参阅文档中的 [usage][11] 一节。
+
+### 模糊处理
+
+这个名字听起来很奇怪,但是 **[FuzzyWuzzy][12]** 在字符串匹配方面是一个非常有用的库。它可以很容易地实现字符串比较、令牌比较等操作。对于匹配保存在不同数据库中的记录也很方便。
+
+#### 安装
+
+```
+$ pip install fuzzywuzzy
+```
+
+#### 例子
+
+```
+from fuzzywuzzy import fuzz
+from fuzzywuzzy import process
+
+# 简单的匹配率
+
+fuzz.ratio("this is a test", "this is a test!")
+97
+
+# 部分的匹配率
+fuzz.partial_ratio("this is a test", "this is a test!")
+ 100
+```
+
+更多的例子可以在 FuzzyWuzy 的 [GitHub repo.][12]得到。
+
+### PyFlux
+
+时间序列分析是机器学习中最常遇到的问题之一。**[PyFlux][13]** 是Python中的开源库,专门为处理时间序列问题而构建的。该库拥有一系列优秀的现代时间序列模型,包括但不限于 **ARIMA** 、 **GARCH** ,、以及**VAR**模型。简而言之,PyFlux 为时间序列建模提供了一种概率方法。这值得一试。
+
+#### 安装
+
+```
+pip install pyflux
+```
+
+#### 例子
+
+有关用法和示例,请参阅 [documentation][14]。
+
+### IPyvolume
+
+
+交流结果是数据科学的一个重要方面,可视化结果提供了显著优势。 **[**IPyvolume**][15]** 是一个Python库,用于在Jupyter笔记本中可视化3D体积和字形(例如3D散点图),配置和工作量极小。然而,它目前处于1.0之前的阶段。一个很好的类比是这样的: IPyVolumee **volshow** 是3D阵列,Matplotlib 的**imshow** 是2D阵列。你可以在 [documentation][16] 中读到更多关于它的信息。
+
+#### 安装
+
+```
+Using pip
+$ pip install ipyvolume
+
+Conda/Anaconda
+$ conda install -c conda-forge ipyvolume
+```
+
+#### 例子
+
+**Animation:**
+
+
+**Volume rendering:**
+
+
+### Dash
+
+**[Dash][17]** 是一个用于构建 Web 应用程序的高效 Python 框架。它写在Flask、Plotty.js和Response.js 的顶部,将下拉菜单、滑块和图形等流行 UI 元素与分析 Python 代码联系起来,而不需要JavaScript。Dash 非常适合构建可在 Web 浏览器中呈现的数据可视化应用程序。有关详细信息,请参阅 [user guide][18] 。
+
+#### 安装
+
+```
+pip install dash==0.29.0 # The core dash backend
+pip install dash-html-components==0.13.2 # HTML components
+pip install dash-core-components==0.36.0 # Supercharged components
+pip install dash-table==3.1.3 # Interactive DataTable component (new!)
+```
+
+#### 例子
+
+
+下面的示例显示了一个具有下拉功能的高度交互的图表。当用户在下拉列表中选择一个值时,应用程序代码将数据从Google Finance 动态导出到 Pandas 数据框架中。
+
+
+### Gym
+
+从[OpenAI][20] 而来的 **[Gym][19]** 是开发和比较强化学习算法的工具包。它与任何数值计算库兼容,如TensorFlow 或Theano 。Gym 是一个测试问题的集合,也称为环境,你可以用它来制定你的强化学习算法。这些环境有一个共享接口,允许您编写通用算法。
+
+#### 安装
+
+```
+pip install gym
+```
+
+#### 例子
+
+
+
+以下示例将在 **[CartPole-v0][21]** 环境中,运行1,000次,在每一步渲染环境。
+
+
+You can read about [other environments][22] on the Gym website.
+你可以在 Gym 网站上读到其他的 [other environments][22] 。
+
+### 结论
+
+这些是我挑选的有用但鲜为人知的数据科学 Python 库。如果你知道另一个要添加到这个列表中,请在下面的评论中提及。
+这本书最初发表在 [Analytics Vidhya][23] 的媒体频道上,并经许可转载。
+
+
+via: https://opensource.com/article/18/11/python-libraries-data-science
+
+作者:[Parul Pandey][a]
+选题:[lujun9972][b]
+译者:[heguangzhi](https://github.com/heguangzhi)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/parul-pandey
+[b]: https://github.com/lujun9972
+[1]: https://pypi.org/project/wget/
+[2]: https://github.com/sdispater/pendulum
+[3]: https://pendulum.eustace.io/docs/#installation
+[4]: https://github.com/scikit-learn-contrib/imbalanced-learn
+[5]: http://scikit-learn.org/stable/
+[6]: https://github.com/scikit-learn-contrib
+[7]: http://imbalanced-learn.org/en/stable/api.html
+[8]: https://github.com/vi3k6i5/flashtext
+[9]: https://arxiv.org/abs/1711.00046
+[10]: https://flashtext.readthedocs.io/en/latest/
+[11]: https://flashtext.readthedocs.io/en/latest/#usage
+[12]: https://github.com/seatgeek/fuzzywuzzy
+[13]: https://github.com/RJT1990/pyflux
+[14]: https://pyflux.readthedocs.io/en/latest/index.html
+[15]: https://github.com/maartenbreddels/ipyvolume
+[16]: https://ipyvolume.readthedocs.io/en/latest/?badge=latest
+[17]: https://github.com/plotly/dash
+[18]: https://dash.plot.ly/
+[19]: https://github.com/openai/gym
+[20]: https://openai.com/
+[21]: https://gym.openai.com/envs/CartPole-v0
+[22]: https://gym.openai.com/
+[23]: https://medium.com/analytics-vidhya/python-libraries-for-data-science-other-than-pandas-and-numpy-95da30568fad
diff --git a/选题模板.txt b/选题模板.txt
index a7cd92e614..4515fe78ab 100644
--- a/选题模板.txt
+++ b/选题模板.txt
@@ -1,43 +1,65 @@
-选题标题格式:
+选题标题格式:
- 原文日期 标题.md
+```
+原文日期 标题.md
+```
-正文内容:
+其中:
- 标题
- =======
-
- ### 子一级标题
-
- 正文
-
- #### 子二级标题
-
- 正文内容
-
- 
-
- ### 子一级标题
-
- 正文内容 : I have a [dream][1]。
+- 原文日期为该文章发表时的日期,采用 8 位数字表示
+- 标题需去除特殊字符,使用 `_` 替换。
- --------------------------------------------------------------------------------
-
- via: 原文地址
-
- 作者:[作者名][a]
- 译者:[译者ID](https://github.com/译者ID)
- 校对:[校对者ID](https://github.com/校对者ID)
-
- 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
- [a]: 作者介绍地址
- [1]: 引文链接地址
+正文内容:
-说明:
-1. 标题层级很多时从 “##” 开始
-2. 引文链接地址在下方集中写
+```
+[#]: collector: (选题人 GitHub ID)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: subject: (文章标题)
+[#]: via: (原文 URL)
+[#]: author: (作者名 作者链接 URL)
+[#]: url: ( )
+
+标题
+=======
+
+### 子一级标题
+
+正文
+
+#### 子二级标题
+
+正文内容
+
+![][1]
+
+### 子一级标题
+
+正文内容 : I have a [dream][2]。
+
+--------------------------------------------------------------------------------
+
+via: 原文 链接 URL
+
+作者:[作者名][a]
+译者:[选题 ID][b]
+译者:[译者 ID](https://github.com/译者 ID)
+校对:[校对 ID](https://github.com/校对 ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: 作者链接 URL
+[b]: 选题链接 URL
+[1]: 图片链接地址
+[2]: 文内链接地址
+```
+
+说明:
+
+1. 标题层级很多时从 `##` 开始
+2. 图片链接和引文链接地址在下方集中写
3. 因为 Windows 系统文件名有限制,所以文章名不要有特殊符号,如 `\/:*"<>|`,同时也不推荐全大写,或者其它不利阅读的格式
4. 正文格式参照中文排版指北(https://github.com/LCTT/TranslateProject/blob/master/%E4%B8%AD%E6%96%87%E6%8E%92%E7%89%88%E6%8C%87%E5%8C%97.md)
-5. 我们使用的 markdown 语法和 github 一致,具体语法可参见 https://github.com/guodongxiaren/README 。而实际中使用的都是基本语法,比如链接、包含图片、标题、列表、字体控制和代码高亮。
+5. 我们使用的 markdown 语法和 GitHub 一致。而实际中使用的都是基本语法,比如链接、包含图片、标题、列表、字体控制和代码高亮。
6. 选题的内容分为两类: 干货和湿货。干货就是技术文章,比如针对某种技术、工具的介绍、讲解和讨论。湿货则是和技术、开发、计算机文化有关的文章。选题时主要就是根据这两条来选择文章,文章需要对大家有益处,篇幅不宜太短,可以是系列文章,也可以是长篇大论,但是文章要有内容,不能有严重的错误,最好不要选择已经有翻译的原文。