diff --git a/translated/tech/20170918 Fun and Games in Emacs.md b/published/20170918 Fun and Games in Emacs.md
similarity index 97%
rename from translated/tech/20170918 Fun and Games in Emacs.md
rename to published/20170918 Fun and Games in Emacs.md
index 9b547de0de..2602ba804c 100644
--- a/translated/tech/20170918 Fun and Games in Emacs.md
+++ b/published/20170918 Fun and Games in Emacs.md
@@ -1,8 +1,8 @@
[#]: collector: (lujun9972)
[#]: translator: (lujun9972)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11949-1.html)
[#]: subject: (Fun and Games in Emacs)
[#]: via: (https://www.masteringemacs.org/article/fun-games-in-emacs)
[#]: author: (Mickey Petersen https://www.masteringemacs.org/about)
@@ -78,9 +78,9 @@ Emacs 中汉诺塔的实现可以追溯到 20 世纪 80 年代中期——确实
我喜欢 `fortune` 命令。每当我启动一个新 shell 时,这些与文学片段、谜语相结合的刻薄、无益、常常带有讽刺意味的“建议”就会点亮我的一天。
-令人困惑的是,Emacs 中有两个包或多或少地做着类似的事情:`fortune` 和 `cookie1`。前者主要用于在电子邮件签名中添加幸运饼干消息,而后者只是一个简单的 fortune 格式阅读器。
+令人困惑的是,Emacs 中有两个包或多或少地做着类似的事情:`fortune` 和 `cookie`。前者主要用于在电子邮件签名中添加幸运饼干消息,而后者只是一个简单的 fortune 格式阅读器。
-不管怎样,使用 Emacs 的 `cookie1` 包前,你首先需要通过 `customize-option RET cookie RET` 来自定义变量 `cookie-file` 告诉它从哪找到 fortune 文件。
+不管怎样,使用 Emacs 的 `cookie` 包前,你首先需要通过 `customize-option RET cookie RET` 来自定义变量 `cookie-file` 告诉它从哪找到 fortune 文件。
如果你的操作系统是 Ubuntu,那么你先安装 `fortune` 软件包,然后就能在 `/usr/share/games/fortune/` 目录中找到这些文件了。
diff --git a/published/20180306 Exploring free and open web fonts.md b/published/20180306 Exploring free and open web fonts.md
new file mode 100644
index 0000000000..3e688cbd35
--- /dev/null
+++ b/published/20180306 Exploring free and open web fonts.md
@@ -0,0 +1,71 @@
+探索自由而开放的 Web 字体
+======
+
+> 谷歌字体和开放字体库中的免费 Web 字体已经改变了游戏规则,但仅在有限的范围内。
+
+![](https://img.linux.net.cn/data/attachment/album/202003/08/174910xoklikblgkkbooib.jpg)
+
+毫无疑问,近些年来互联网的面貌已经被开源字体所改变。早在 2010 年之前,你在 Web 浏览器上几乎只能看到微软制作的通常“Web 安全”的[核心字体][1]。但这一年(2010)正好是好几轮技术革新开始的见证之年:[Web 开放字体格式][2](WOFF)的引入为通过 HTTP 有效地传输字体文件提供了一个开放的标准,以及像[谷歌字体][3]和[开放字体库][4]这样的 Web 字体服务的推出,使得 Web 内容发布者可以在开源许可证之下免费使用海量的字体库。
+
+这些事件对 Web 排版的积极影响再夸大都不过分。但是要将 Web 开放字体的成功与整个开源排版等同起来,并得到结论——挑战已经远离了我们,困难悉数被解决了——却很容易。然而事实并非如此,如果你很关注字体,那么好消息是你有好多机会参与到对这些字体的改进工作当中去。
+
+对新手来说,至关重要的是必须要意识到谷歌字体和开放字体库提供了专用的服务(为网页提供字体),而没有为其他使用情况制定字体解决方案。这不是服务方面的缺点,这只是意味着我们必须去开发其它的解决方案。
+
+需要解决的问题还非常多。可能最明显的例子就是给 Linux 桌面计算机的其他软件安装字体所遇到的尴尬情况。你可以通过任何一种服务下载任何一种 Web 字体,但是你得到的只是一个最普通的压缩包文件,里面有一些 TTF 或 OTF 二进制文件和一个普通文本文件的许可证。接下来会发生什么完完全全需要你去猜。
+
+大部分用户很快学会了“正确”的步骤就是手动地复制这些字体二进制文件到他们硬盘里几个特殊文件夹里的某一个里。但是这样做只能使这个文件对操作系统可见。它并不能为用户体验带来什么提升。再强调一遍,这不是 Web 字体服务的缺陷,相反它佐证了对于关于服务到哪里停止和需要在其他方面做更多工作的观点。
+
+在用户视角来说,一个巨大的提升可能就是在“只是下载”这个阶段,操作系统或者桌面环境变得更智能。系统或桌面环境不仅会把字体文件安装到正确的位置上,更重要的是,当用户选择要在一个项目中使用的字体时,它会自己添加用户所需要的重要的元数据。
+
+这些附加信息包含的内容与它如何呈现给用户与另一个挑战有关:与其它操作系统相比,在 Linux 环境管理一个字体库显然不那么令人满意。字体管理器总是时不时的出现一下(例如 [GTK+ 字体管理器][5],这是最近的一个例子),但是它们很少变得流行起来。我一直在思考一大堆这些软件让人失望的方面。一个核心的原因是它们把自己局限于只展示内嵌在二进制字体文件内的信息:基本字符集的覆盖、粗细/宽度和斜率的设定,内置的许可证和版权说明等等。
+
+但是除了这些内嵌数据中的内容,在选择字体的过程中还涉及很多决策。严肃的字体用户,像信息设计者、杂志文章作者,或者书籍美工设计者,他们的字体选择是根据每一份文件的要求和需求做出的。这当然包含了许可证信息,但它还包含了更多,像关于设计师和厂商的信息、潮流风格的趋势,或者字体在使用中的细节。
+
+举个例子,如果你的文档包含了英语和阿拉伯文,你多半想要拉丁文和阿拉伯文的字体由同时熟悉这两种字母系统的设计师所设计。否则,你将浪费一大堆时间来微调字体大小和行间距来使两种字母系统良好地结合在一起。你可能从经验中学到,某些设计师或字体厂商比其他人更善于多种字母系统设计。或许和你职业相关的是今天的时尚杂志几乎无一例外的采用 “[Didone][6]”风格的字体,“[Didone][6]”是指一种两百多年前最先被 [Firmin Didot][7] 和 [Giambattista Bodoni][8] 设计出来的超高反差的字体风格。这种字体恰好就是现在的潮流。
+
+但是像 Didone、Didot 或 Bodoni 这些术语都不可能会出现在二进制文件的内置数据当中,你也不容易判断拉丁文和阿拉伯文是否相得益彰或其它关于字体的历史背景。这些信息有可能出现在补充的材料中,类似某种字形样本或字体文件中,如果这些东西存在的话。
+
+字形样本是一份设计好的文档(一般是 PDF),它展示了这种字体的使用情况,而且包括了背景信息。字形样本经常在挑选字体时充当市场营销和外观样例的双重角色。一份精心设计的样本展示了字体在实际应用中的情况和在自动生成的字符表中所不能体现的风格。字形样本文件也有可能包含了一些其他重要信息,比如怎样激活字体的 OpenType 特性、提供的数学表达式或古体字,或者它在支持的多种语言上的风格变化。在字体管理应用程序中向用户提供此类材料,对于帮助用户找到适合其项目需求的字体将大有帮助。
+
+当然,如果我们希望一个字体管理软件能够处理文件和样本问题,我们也必须仔细观察一下各种发行版提供的字体包所随附的内容。Linux 的用户刚开始只有自动安装的那几种字体,并且发行版存储库提供的包是大部分用户除了下载通用的压缩包档案之外的唯一字体来源。这些包往往非常的“简陋”。商业字体总的来说都包含了样本、文档,还有其他的支持项目,然而开源字体往往没有这些配套文件。
+
+也有一些优秀的开放字体提供了高质量的样本和文档(例如 [SIL Gentium][9] 和 [Bungee][10] 是两种差异明显但是都有效的方案),但是它们几乎不涉足下游的打包工作链。我们显然可以做的更好一些。
+
+要在系统的字体交互方面提供更丰富的用户体验上面还存在一些技术问题。一方面,[AppStream][11] 的元数据标准定义了一些字体文件特有的参数,但是到现在为止,这些参数没有包含样本、设计师/厂商和其他相关细节的任何信息。另外一个例子,[SPDX][13](软件包数据交换)格式也没有包含太多用于分发字体的软件许可证(及许可证变体)。
+
+最后,就像任何一个唱片爱好者都会告诉你的,一个不允许你编辑和完善你的 MP3 曲库中的 ID3 信息的音乐播放器很快就会变得令人失望(LCTT 译注:ID3 信息是 MP3 文件头部的元信息,用于存储歌曲信息)。你想要处理标签里的错误、想要添加注释和专辑封面之类的信息,本质上,这就是完善你的音乐库。同样,你可能也想要让你的本地字体库也保持在一个方便使用的状态。
+
+但是改动字体文件的内置数据一直有所忌讳,因为字体往往是被内置或附加到其他文件里的。如果你随意改变了字体二进制文件中的字段,然后将其与你的演示文稿一起重新分发,那么下载这些演示文稿的任何人最终都会得到错误的元数据,但这个错误不是他们自己造成的。所以任何一个要改善字体管理体验的人都要想明白如何从策略上解决对内置或外置的字体元数据的重复修改。
+
+除了技术角度之外,丰富的字体管理经验也是一项设计挑战。就像我在前面说的一样,有几种开放字体也带了良好的样本和精心编写的文档。但是更多的字体包这两者都没有,还有大量的更老的字体包已经没有人维护了。这很可能意味着大部分开放字体包想要获得样本和证明文件的唯一办法就是让社区去创建它们。
+
+也许这是一个很高的要求。但是开源设计社区现在比以往任何时候都要庞大,它是整个自由开源软件运动中的一个高度活跃的组成部分。所以谁知道呢,也许明年这个时候会发现,在 Linux 桌面系统查找、下载和使用字体会变成一种完全不同的体验。
+
+在这一连串关于现代 Linux 用户的文字设计上的挑战的思考中包含了打包、文档设计,甚至有可能需要在桌面环境加入不少新的软件部分。此外还有其他一系列的东西也需要考虑。其共通性就是在 Web 字体服务不可及的地方,事情就会变得更加困难。
+
+从我的视角来看,最好的消息是现在比起以前有更多的人对这个话题感兴趣。我认为我们要感谢像谷歌字体和开放字体库这样的 Web 字体服务巨头让开放字体得到了更高的关注。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/3/webfonts
+
+作者:[Nathan Willis][a]
+译者:[Fisherman110](https://github.com/Fisherman110)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:https://opensource.com/users/n8willis
+[1]:https://en.wikipedia.org/wiki/Core_fonts_for_the_Web
+[2]:https://en.wikipedia.org/wiki/Web_Open_Font_Format
+[3]:https://fonts.google.com/
+[4]:https://fontlibrary.org/
+[5]:https://fontmanager.github.io/
+[6]:https://en.wikipedia.org/wiki/Didone_(typography)
+[7]:https://en.wikipedia.org/wiki/Firmin_Didot
+[8]:https://en.wikipedia.org/wiki/Giambattista_Bodoni
+[9]:https://software.sil.org/gentium/
+[10]:https://djr.com/bungee/
+[11]:https://www.freedesktop.org/wiki/Distributions/AppStream/
+[12]:https://www.freedesktop.org/software/appstream/docs/sect-Metadata-Fonts.html
+[13]:https://spdx.org/
diff --git a/published/20180522 Advanced use of the less text file viewer in Linux.md b/published/20180522 Advanced use of the less text file viewer in Linux.md
new file mode 100644
index 0000000000..399f0d05b8
--- /dev/null
+++ b/published/20180522 Advanced use of the less text file viewer in Linux.md
@@ -0,0 +1,109 @@
+你所不知道的用 less 查看文件的高级用法
+======
+
+> 使用 less 文件查看器的一些技巧。
+
+![](https://img.linux.net.cn/data/attachment/album/202003/16/152826assmtybsohopo4b7.png)
+
+最近,我正在拜读 Scott Nesbitt 的文章《[在 Linux 命令行中使用 less 来查看文本文件][1]》,并受到了一些启发,所以我想分享一些使用 `less` 命令的技巧。
+
+### LESS 环境变量
+
+如果你定义了环境变量 `LESS`(例如在 `.bashrc` 中),那么 `less` 会将其视为一个选项列表,就像在命令行中传递给它一样。
+
+我这样定义:
+
+```
+LESS='-C -M -I -j 10 -# 4'
+```
+
+它的意思是:
+
+* `-C` – 通过不从底部滚动来加快全屏打印速度。
+* `-M` – 在最后一行(状态行)显示更多信息。你可以使用 `-PM` 来自定义显示的信息,但我通常只用 `-M`。
+* `-I` – 忽略搜索中的大小写。
+* `-j 10` – 在终端的第 10 行而不是第一行显示搜索结果。这样,每次按 `n` 或(`N`) 跳到下一个(或上一个)匹配项时,就会有 10 条上下文。
+* `-# 4` – 当按下向右或向左的箭头时,会向右或向左跳四个字符。默认情况时跳转半个屏幕,我觉得太多了。一般来说,`less` 似乎(至少部分)是按最初开发它时的环境优化的,那时使用慢速调制解调器和低带宽的互联网连接,所以跳过半个屏幕是有意义的。
+
+### PAGER 环境变量
+
+许多程序使用在 `PAGER` 环境变量中的命令来显示信息。因此,你可以在 `.bashrc` 中设置 `PAGER=less`,然后让程序运行 `less`。查看手册页(`man 7 environ`)中是否有其它此类变量。
+
+### -S
+
+`-S` 告诉 `less` 将长行切断而不是将它们换行。除非我在(或我要)查看文件,否则我很少需要这样做。幸运的是,你可以在 `less` 中输入所有命令行选项,就像它们是键盘命令一样。因此,如果我想在文件已经打开的情况下隔断长行,我可以简单地输入 `-S`。(LCTT 译注:注意大写 `S` ,并按回车)
+
+这是我经常使用的一个例子:
+
+```
+su - postgres
+export PAGER=less # 因为我不用在所有的机器上编辑 postgres 的 .bashrc
+psql
+```
+
+有时当我查看一个 `SELECT` 命令的输出非常宽时,我会输入 `-S` 以便将其格式化的漂亮一些。如果当我按下右箭头想查看更多内容时它跳得太远(因为我没有设置 `-#`),则可以输入 `-#8`,那么每次按下右箭头都会向右移动八个字符。
+
+有时在多次输入 `-S` 之后,我会退出 psql 并设置环境变量后再次运行它:
+
+```
+export LESS=-S
+```
+
+### F
+
+命令 `F` 可以使 `less` 像 `tail -f` 一样工作,等待更多的数据被添加到文件后再显示它们。与 `tail -f` 相比,它的一个优点是,高亮显示搜索匹配仍然有效。因此,你可以输入 `less /var/log/logfile`,搜索某些内容时,它将高亮显示所有出现的内容(除非你使用了 `-g`),然后按下 `F` 键,当更多数据写入到日志时,`less` 将显示它并高亮新的匹配项。
+
+按下 `F` 后,可以按 `Ctrl+C` 来停止其查找新数据(这不会干掉它),这样你可以返回文件查看旧内容,搜索其它内容等,然后再次按 `F` 键来查看更多新数据。
+
+### 搜索
+
+搜索使用系统的正则表达式库,这通常意味着你可以使用扩展正则表达式。特别是,搜索 `one|two|three` 可以找到并高亮所有的 one、two 或 three。
+
+我经常使用的另一种模式是 `.*someting.*`,特别是对于一些很长的日志行(例如,跨越多个终端宽度的行),它会高亮整行。这种模式使查看一行的起始和结束位置变得更加容易。我还会结合其它内容,例如 `.*one thing.*|.*another thing.*`,或者使用 `key: .*|.*marker.*` 来查看 `key` 的内容。例如,一个日志文件中包含一些字典/哈希的转储。它会高亮相关的标记行,这样我就看到上下文了,甚至,如果我知道这个值被引号引起来的话,就可以:
+
+```
+key: '[^']*'|.*marker.*
+```
+
+`less` 会保留你的搜索项的历史纪录,并将其保存到磁盘中以备将来调用。当你按下 `/` 或 `?` 时,可以使用向上或向下箭头浏览历史记录(以及进行基本的行编辑)。
+
+在撰写本文时,我无意间看了下 `less` 手册页,发现了一个非常有用的功能:使用 `&!pattern` 跳过无关的行。例如,当我在 `/var/log/messages` 中寻找内容时,经常会一个个迭代使用以下命令:
+
+```
+cat /var/log/messages | egrep -v 'systemd: Started Session' | less
+cat /var/log/messages | egrep -v 'systemd: Started Session|systemd: Starting Session' | less
+cat /var/log/messages | egrep -v 'systemd: Started Session|systemd: Starting Session|User Slice' | less
+cat /var/log/messages | egrep -v 'systemd: Started Session|systemd: Starting Session|User Slice|dbus' | less
+cat /var/log/messages | egrep -v 'systemd: Started Session|systemd: Starting Session|User Slice|dbus|PackageKit Daemon' | less
+```
+
+但是现在我知道如何在 `less` 中做同样的事情。例如,我可以输入 `&!systemd: Started Session`,然后想要隐藏 `systemd: Starting Session`,所以我输入 `&!`,并使用向上箭头从历史记录中获得上一次搜索的结果。然后我接着输入 `|systemd: Starting Session` 并按下回车,继续以相同的方式添加更多条目,直到我过滤掉足够多的条目,看到更有趣的内容。
+
+### =
+
+命令 `=` 显示有关文件和位置的更多信息,甚至比 `-M` 更多。如果文件非常大,计算 `=` 花费的时间太长,可以按下 `Ctrl+C`,它将停止尝试计算。
+
+如果你正在查看的内容来自管道而不是文件,则 `=`(和 `-M`)不会显示未知内容,包括文件中的行数和字节数。要查看这些数据,如果你知道管道命令将很快结束,则可以使用 `G` 跳到最后,然后 `less` 将开始显示这些信息。
+
+如果按下 `G` 并且写入管道的命令花费的时间比预期的长,你可以按下 `Ctrl+C`,该命令将被终止。即使你没有按 `G`,`Ctrl+C` 键也会杀死它。因此,如果你不想终止命令,请不要意外按下 `Ctrl+C`。出于这个原因,如果命令执行了某些操作(不仅是显示信息),通常更安全的做法是将其输出写入文件并在单独的终端中查看文件,而不是使用管道。
+
+### 为什么你需要 less
+
+`less` 是一个非常强大的程序,与该领域中较新的竞争者(例如 `most` 和 `moar`)不同,你可能会在几乎所有的系统上找到它,就像 `vi` 一样。因此,即使你使用 GUI 查看器或编辑器,花一些时间浏览 `less` 手册页也是值得的,至少可以了解一下它的用处。这样,当你需要做一些已有的功能可能提供的工作时,就会知道如何要搜索手册页或互联网来找到所需的内容。
+
+有关更多信息,访问 [less 主页][2]。该网站有一个不错的常见问题解答,其中包含更多提示和技巧。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/5/advanced-use-less-text-file-viewer
+
+作者:[Yedidyah Bar David][a]
+选题:[lujun9972](https://github.com/lujun9972)
+译者:[MjSeven](https://github.com/MjSeven)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:https://opensource.com/users/didib
+[1]:http://opensource.com/article/18/4/using-less-view-text-files-command-line
+[2]:http://www.greenwoodsoftware.com/less/
diff --git a/sources/tech/20181231 Troubleshooting hardware problems in Linux.md b/published/20181231 Troubleshooting hardware problems in Linux.md
similarity index 91%
rename from sources/tech/20181231 Troubleshooting hardware problems in Linux.md
rename to published/20181231 Troubleshooting hardware problems in Linux.md
index eee2160639..34dbed5f44 100644
--- a/sources/tech/20181231 Troubleshooting hardware problems in Linux.md
+++ b/published/20181231 Troubleshooting hardware problems in Linux.md
@@ -1,8 +1,8 @@
[#]: collector: (lujun9972)
[#]: translator: (wxy)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11953-1.html)
[#]: subject: (Troubleshooting hardware problems in Linux)
[#]: via: (https://opensource.com/article/18/12/troubleshooting-hardware-problems-linux)
[#]: author: (Daniel Oh https://opensource.com/users/daniel-oh)
@@ -12,11 +12,11 @@ Linux 硬件故障排除指南
> 了解是什么原因导致你的 Linux 硬件发生故障,以便你可以将其恢复并快速运行。
-![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003499_01_other11x_cc.png?itok=I_kCDYj0)
+![](https://img.linux.net.cn/data/attachment/album/202003/03/101312zcazy02wl2g8uhy1.jpg)
-[Linux 服务器][1]在物理机、虚拟化、私有云、公共云和混合云等许多不同种类的基础设施中运行着关键的业务应用程序。对于 Linux 系统管理员来说,了解如何管理 Linux 硬件基础设施(包括与 [网络][2]、存储、Linux 容器相关的软件定义的功能)和 Linux 服务器上的多种工具非常重要。
+[Linux 服务器][1]在物理机、虚拟化、私有云、公共云和混合云等许多不同种类的基础设施中运行着关键的业务应用程序。对于 Linux 系统管理员来说,了解如何管理 Linux 硬件基础设施(包括与 [网络][2]、存储、Linux 容器相关的软件定义功能)和 Linux 服务器上的多种工具非常重要。
-在 Linux 上进行故障排除和解决与硬件相关的问题可能需要一些时间。即使是经验丰富的系统管理员,有时也会花费数小时来解决神秘的硬件和软件差异。
+在 Linux 上进行排除和解决与硬件相关的问题可能需要一些时间。即使是经验丰富的系统管理员,有时也会花费数小时来解决神秘的硬件和软件差异。
以下提示可以使你更快、更轻松地对 Linux 中的硬件进行故障排除。许多不同的事情都可能导致 Linux 硬件出现问题。在开始诊断它们之前,明智的做法是了解最常见的问题以及最有可能找到问题的地方。
@@ -54,7 +54,7 @@ xvdb 202:16 0 20G 0 disk
....
```
-### 深入到多个日志当中
+### 深入到各个日志当中
使用 `dmesg` 可以找出内核最新消息中的错误和警告。例如,这是 `dmesg | more` 命令的输出:
@@ -93,7 +93,7 @@ Dec 1 13:21:33 bastion dnsmasq[30201]: using nameserver 127.0.0.1#53 for domai
### 分析网络功能
-你可能有成千上万的云原生应用程序在一个复杂的网络环境中为业务提供服务。其中可能包括虚拟化、多云和混合云。这意味着,作为故障排除的一部分,你应该分析网络连接是否正常工作。弄清 Linux 服务器中网络功能的有用命令包括:`ip addr`、`traceroute`、`nslookup`、`dig` 和 `ping` 等。例如,这是 `ip addr show` 命令的输出:
+你可能有成千上万的云原生应用程序在一个复杂的网络环境中为业务提供服务,其中可能包括虚拟化、多云和混合云。这意味着,作为故障排除的一部分,你应该分析网络连接是否正常工作。弄清 Linux 服务器中网络功能的有用命令包括:`ip addr`、`traceroute`、`nslookup`、`dig` 和 `ping` 等。例如,这是 `ip addr show` 命令的输出:
```
# ip addr show
@@ -129,7 +129,7 @@ via: https://opensource.com/article/18/12/troubleshooting-hardware-problems-linu
作者:[Daniel Oh][a]
选题:[lujun9972][b]
译者:[wxy](https://github.com/wxy)
-校对:[校对者ID](https://github.com/校对者ID)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/published/20190422 9 ways to save the planet.md b/published/20190422 9 ways to save the planet.md
new file mode 100644
index 0000000000..28a8cf2c55
--- /dev/null
+++ b/published/20190422 9 ways to save the planet.md
@@ -0,0 +1,98 @@
+[#]: collector: (lujun9972)
+[#]: translator: (MFGJT)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11978-1.html)
+[#]: subject: (9 ways to save the planet)
+[#]: via: (https://opensource.com/article/19/4/save-planet)
+[#]: author: (Jen Wike Huger https://opensource.com/users/jen-wike/users/alanfdoss/users/jmpearce)
+
+九种用开源拯救地球的方法
+======
+
+> 这些主意都用到了有关的开源技巧。
+
+![](https://img.linux.net.cn/data/attachment/album/202003/10/004034vbl5qb5lbij66zil.jpg)
+
+人们可以做些什么来拯救地球?这个问题可能会让人感到压抑,因为有时我们感觉个人可以做的贡献太少了。但是作为地球公民,我们从来不是一个人。所以,我向我们的作家社区征集了一些开源软件或硬件可以帮助改变现状的方法。以下是他们的回复。
+
+### 九种利用开源的方法来拯救地球的方式
+
+#### 1、在你的终端禁用闪烁的光标
+
+这听起来可能有点傻,但是那个无关紧要的闪烁的光标可能导致[每小时两瓦特的额外电力开销][2]。如果要禁用光标闪烁,可以通过更改终端设置:编辑 > 偏好设置 > 光标 > 光标闪烁 > 禁用。
+
+*由 Mars Toktonaliev 推荐*
+
+#### 2、减少有关动物产品和加工食物的消费
+
+这样做的一种方法是在你的手机中添加这些开源的 App:Daily Dozen、OpenFoodFacts、OpenVegeMap 和 Food Restrictions。这些 App 可以帮助你准备一份健康的素食饮食计划,为你找到素食主义者和严格素食主义者可以就餐的餐厅,还可以帮助你把你的饮食需求告诉别人,即使他们不和你讲同一种语言。如果想要了解更多有关这些的 App 的信息,你可以阅读《[4 款“吃草”的开源应用][3]》。
+
+*由 Joshua Allen Holm 推荐*
+
+#### 3、让旧电脑重焕新生
+
+怎么做?当然是用 Linux。通过给那些自己得不到新电脑的人创造一台新电脑来传递爱心,同时也可以避免让这台电脑进到垃圾填埋场。可以在 [The Asian Penguins][4] 看看我们是怎么做的。
+
+*由 Stu Keroff 推荐*
+
+#### 4、在你不使用设备时关闭它们
+
+你可以使用带有主插座和控制插座的“智能插座板”。把你的电脑连接到主插座上,这样的话当你打开电脑时所有你连接到控制插座上的设备如显示器,打印机等也都会打开。一个更简单的、技术含量更低的方法是使用一个带有计时器的插座板。我在家里就是用的这个。你可以用计时器上的开关设定一个定时开关电源的时间表。这样可以在没有人在家时自动关闭网络打印机。或者以我的用了六年的笔记本电脑为例,我通过一个交替使用外接电源(插座打开)和使用电脑电池(插座关闭)的电源计划延长了电脑电池的寿命。
+
+*由 Jim Hall 推荐*
+
+#### 5、减少供暖通风系统(HVAC)的使用
+
+在夏天,透过窗户的阳光可以为室内提供很多热量。使用 Home Assistant 可以[基于一天中的时间的][6],甚至是基于太阳高度角[自动调节][5]窗帘和遮阳棚。
+
+*由 Michael Hrivnak 推荐*
+
+#### 6、出门就把恒温器关闭或调低
+
+如果你的家用恒温器具有“离开”功能,你很容易忘记在出门时启用它。借助自动化,任何连接到网络的恒温器都可以在你不在家时自动节省能量。[Stataway][7] 就是一个这样项目。它通过调用你的手机的 GPS 坐标来决定是将你的恒温器设置为“在家”还是“离开”。
+
+*由 Michael Hrivnak 推荐*
+
+#### 7、为未来储蓄算力
+
+我有一个主意:创建一个可以读取可选的能量阵列(如风能或太阳能)的输出的脚本。这个脚本应该将计算集群中的服务器从睡眠模式更改为激活模式,直到过量的电能(超出可以储存的部分)被用尽。然后在高产能时段使用这些过量的电能来进行需要大量计算的项目,比如渲染。这个过程本质应该是免费的,因为使用的能量无法被储存起来挪作它用。我相信现有的监控、能量管理和服务器阵列工具一定可以实现这个功能。那么剩下的只是一些整合上的问题,就可以让整个系统工作起来。
+
+*由 Terry Hancock 推荐*
+
+#### 8、关掉你的灯
+
+根据[人工夜空亮度图集][8]的说法,光污染影响了全世界超过 80% 的人口。这一结论在 2016 年(遵循 CC-NC 4.0 协议)发表在公开访问的期刊《科学进展》上。关闭外部照明是一个可以使野生生物、人类健康受益并让我们享受夜晚的天空的快速途径,而且可以减少能量消耗。访问 [darksky.org][9] 来查看更多减少外部照明影响的方法。
+
+*由 Michael Hrivnak 推荐*
+
+#### 9、减少你的 CPU 数量
+
+就我个人而言,我记得我以前有很多在地下室运行的电脑作为我的 IT 游乐场/实验室。我现在对于能源消耗更加注意了,所以确实大大地减少了我的 CPU 数量。我现在更喜欢利用虚拟机、区域和容器等技术。另外,我很高兴有小型电脑和 SoC 电脑这种东西,比如树莓派,因为我可以用一台这样的电脑做很多事情,比如运行一个 DNS 或者 Web 服务器,而无需使整个屋子变热并积累昂贵的电费账单。
+
+P.S. 这些电脑都运行于 Linux、FreeBSD,或者 Raspbian 系统!
+
+*由 Alan Formy-Duvall 推荐*
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/4/save-planet
+
+作者:[Jen Wike Huger][a]
+选题:[lujun9972][b]
+译者:[MFGJT](https://github.com/MFGJT)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/jen-wike/users/alanfdoss/users/jmpearce
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/pixelated-world.png?itok=fHjM6m53
+[2]: https://www.redhat.com/archives/fedora-devel-list/2009-January/msg02406.html
+[3]: https://linux.cn/article-10926-1.html
+[4]: https://opensource.com/article/19/2/asian-penguins-close-digital-divide
+[5]: https://www.home-assistant.io/docs/automation/trigger/#sun-trigger
+[6]: https://www.home-assistant.io/components/cover/
+[7]: https://github.com/mhrivnak/stataway
+[8]: http://advances.sciencemag.org/content/2/6/e1600377
+[9]: http://darksky.org/
diff --git a/published/20190527 How To Enable Or Disable SSH Access For A Particular User Or Group In Linux.md b/published/20190527 How To Enable Or Disable SSH Access For A Particular User Or Group In Linux.md
new file mode 100644
index 0000000000..0c0a600eeb
--- /dev/null
+++ b/published/20190527 How To Enable Or Disable SSH Access For A Particular User Or Group In Linux.md
@@ -0,0 +1,288 @@
+[#]: collector: "lujun9972"
+[#]: translator: "way-ww"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-12027-1.html"
+[#]: subject: "How To Enable Or Disable SSH Access For A Particular User Or Group In Linux?"
+[#]: via: "https://www.2daygeek.com/allow-deny-enable-disable-ssh-access-user-group-in-linux/"
+[#]: author: "2daygeek http://www.2daygeek.com/author/2daygeek/"
+
+如何在 Linux 上为特定的用户或用户组启用或禁用 SSH?
+======
+
+![](https://img.linux.net.cn/data/attachment/album/202003/23/105915r1azn34i82sp48ca.jpg)
+
+由于你的公司标准规定,你可能只能允许部分人访问 Linux 系统。或者你可能只能够允许几个用户组中的用户访问 Linux 系统。那么如何实现这样的要求呢?最好的方法是什么呢?如何使用一个简单的方法去实现呢?
+
+是的,我们会有很多种方法去实现它。但是我们应该使用简单轻松的方法。为了简单轻松的完成目的,我们可以通过对 `/etc/ssh/sshd_config` 文件做必要的修改来实现。在这篇文章中我们将会向你展示实现要求的详细步骤。
+
+为什么我们要这样做呢?是出于安全的原因。你可以访问[这个链接][1]来获取更多关于 openSSH 的使用方法。
+
+### 什么是 SSH ?
+
+openssh 全称为 OpenBSD Secure Shell。Secure Shell(ssh)是一个自由开源的网络工具,它能让我们在一个不安全的网络中通过使用 Secure Shell(SSH)协议来安全访问远程主机。
+
+它采用了客户端-服务器架构(C/S),拥有用户身份认证、加密、在计算机和隧道之间传输文件等功能。
+
+我们也可以用 `telnet` 或 `rcp` 等传统工具来完成,但是这些工具都不安全,因为它们在执行任何动作时都会使用明文来传输密码。
+
+### 如何在 Linux 中允许用户使用 SSH?
+
+通过以下内容,我们可以为指定的用户或用户列表启用 `ssh` 访问。如果你想要允许多个用户,那么你可以在添加用户时在同一行中用空格来隔开他们。
+
+为了达到目的只需要将下面的值追加到 `/etc/ssh/sshd_config` 文件中去。 在这个例子中, 我们将会允许用户 `user3` 使用 ssh。
+
+```
+# echo "AllowUsers user3" >> /etc/ssh/sshd_config
+```
+
+你可以运行下列命令再次检查是否添加成功。
+
+```
+# cat /etc/ssh/sshd_config | grep -i allowusers
+AllowUsers user3
+```
+
+这样就行了, 现在只需要重启 `ssh` 服务和见证奇迹了。(下面这两条命令效果相同, 请根据你的服务管理方式选择一条执行即可)
+
+```
+# systemctl restart sshd
+或
+# service restart sshd
+```
+
+接下来很简单,只需打开一个新的终端或者会话尝试用不同的用户身份访问 Linux 系统。是的,这里 `user2` 用户是不被允许使用 SSH 登录的并且会得到如下所示的错误信息。
+
+```
+# ssh user2@192.168.1.4
+user2@192.168.1.4's password:
+Permission denied, please try again.
+```
+
+输出:
+
+```
+Mar 29 02:00:35 CentOS7 sshd[4900]: User user2 from 192.168.1.6 not allowed because not listed in AllowUsers
+Mar 29 02:00:35 CentOS7 sshd[4900]: input_userauth_request: invalid user user2 [preauth]
+Mar 29 02:00:40 CentOS7 unix_chkpwd[4902]: password check failed for user (user2)
+Mar 29 02:00:40 CentOS7 sshd[4900]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.1.6 user=user2
+Mar 29 02:00:43 CentOS7 sshd[4900]: Failed password for invalid user user2 from 192.168.1.6 port 42568 ssh2
+```
+
+与此同时用户 `user3` 被允许登入系统因为他在被允许的用户列表中。
+
+```
+# ssh user3@192.168.1.4
+user3@192.168.1.4's password:
+[user3@CentOS7 ~]$
+```
+
+输出:
+
+```
+Mar 29 02:01:13 CentOS7 sshd[4939]: Accepted password for user3 from 192.168.1.6 port 42590 ssh2
+Mar 29 02:01:13 CentOS7 sshd[4939]: pam_unix(sshd:session): session opened for user user3 by (uid=0)
+```
+
+### 如何在 Linux 中阻止用户使用 SSH ?
+
+通过以下内容,我们可以配置指定的用户或用户列表禁用 `ssh`。如果你想要禁用多个用户,那么你可以在添加用户时在同一行中用空格来隔开他们。
+
+为了达到目的只需要将以下值追加到 `/etc/ssh/sshd_config` 文件中去。 在这个例子中, 我们将禁用用户 `user1` 使用 `ssh`。
+
+```
+# echo "DenyUsers user1" >> /etc/ssh/sshd_config
+```
+
+你可以运行下列命令再次检查是否添加成功。
+
+```
+# cat /etc/ssh/sshd_config | grep -i denyusers
+DenyUsers user1
+```
+
+这样就行了, 现在只需要重启 `ssh` 服务和见证奇迹了。
+
+```
+# systemctl restart sshd
+活
+# service restart sshd
+```
+
+接下来很简单,只需打开一个新的终端或者会话,尝试使用被禁用的用户身份被访问 Linux 系统。是的,这里 `user1` 用户在禁用名单中。所以,当你尝试登录时,你将会得到如下所示的错误信息。
+
+```
+# ssh user1@192.168.1.4
+user1@192.168.1.4's password:
+Permission denied, please try again.
+```
+
+输出:
+
+```
+Mar 29 01:53:42 CentOS7 sshd[4753]: User user1 from 192.168.1.6 not allowed because listed in DenyUsers
+Mar 29 01:53:42 CentOS7 sshd[4753]: input_userauth_request: invalid user user1 [preauth]
+Mar 29 01:53:46 CentOS7 unix_chkpwd[4755]: password check failed for user (user1)
+Mar 29 01:53:46 CentOS7 sshd[4753]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.1.6 user=user1
+Mar 29 01:53:48 CentOS7 sshd[4753]: Failed password for invalid user user1 from 192.168.1.6 port 42522 ssh2
+```
+
+### 如何在 Linux 中允许用户组使用 SSH?
+
+通过以下内容,我们可以允许一个指定的组或多个组使用 `ssh`。
+
+如果你想要允许多个组使用 `ssh` 那么你在添加用户组时需要在同一行中使用空格来隔开他们。
+
+为了达到目的只需将以下值追加到 `/etc/ssh/sshd_config` 文件中去。在这个例子中,我们将允许 `2g-admin` 组使用 ssh。
+
+```
+# echo "AllowGroups 2g-admin" >> /etc/ssh/sshd_config
+```
+
+你可以运行下列命令再次检查是否添加成功。
+
+```
+# cat /etc/ssh/sshd_config | grep -i allowgroups
+AllowGroups 2g-admin
+```
+
+运行下列命令查看属于该用户组的用户有哪些。
+
+```
+# getent group 2g-admin
+2g-admin:x:1005:user1,user2,user3
+```
+
+这样就行了, 现在只需要重启 `ssh` 服务和见证奇迹了。
+
+```
+# systemctl restart sshd
+或
+# service restart sshd
+```
+
+是的, `user1` 被允许登入系统因为用户 `user1` 属于 `2g-admin` 组。
+
+```
+# ssh user1@192.168.1.4
+user1@192.168.1.4's password:
+[user1@CentOS7 ~]$
+```
+
+输出:
+
+```
+Mar 29 02:10:21 CentOS7 sshd[5165]: Accepted password for user1 from 192.168.1.6 port 42640 ssh2
+Mar 29 02:10:22 CentOS7 sshd[5165]: pam_unix(sshd:session): session opened for user user1 by (uid=0)
+```
+
+是的, `user2` 被允许登入系统因为用户 `user2` 同样属于 `2g-admin` 组。
+
+```
+# ssh user2@192.168.1.4
+user2@192.168.1.4's password:
+[user2@CentOS7 ~]$
+```
+
+输出:
+
+```
+Mar 29 02:10:38 CentOS7 sshd[5225]: Accepted password for user2 from 192.168.1.6 port 42642 ssh2
+Mar 29 02:10:38 CentOS7 sshd[5225]: pam_unix(sshd:session): session opened for user user2 by (uid=0)
+```
+
+当你尝试使用其他不在被允许的组中的用户去登入系统时, 你将会得到如下所示的错误信息。
+
+```
+# ssh ladmin@192.168.1.4
+ladmin@192.168.1.4's password:
+Permission denied, please try again.
+```
+
+输出:
+
+```
+Mar 29 02:12:36 CentOS7 sshd[5306]: User ladmin from 192.168.1.6 not allowed because none of user's groups are listed in AllowGroups
+Mar 29 02:12:36 CentOS7 sshd[5306]: input_userauth_request: invalid user ladmin [preauth]
+Mar 29 02:12:56 CentOS7 unix_chkpwd[5310]: password check failed for user (ladmin)
+Mar 29 02:12:56 CentOS7 sshd[5306]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.1.6 user=ladmin
+Mar 29 02:12:58 CentOS7 sshd[5306]: Failed password for invalid user ladmin from 192.168.1.6 port 42674 ssh2
+```
+
+### 如何在 Linux 中阻止用户组使用 SSH?
+
+通过以下内容,我们可以禁用指定的组或多个组使用 `ssh`。
+
+如果你想要禁用多个用户组使用 `ssh`,那么你需要在添加用户组时在同一行中使用空格来隔开他们。
+
+为了达到目的只需要将下面的值追加到 `/etc/ssh/sshd_config` 文件中去。
+
+```
+# echo "DenyGroups 2g-admin" >> /etc/ssh/sshd_config
+```
+
+你可以运行下列命令再次检查是否添加成功。
+
+```
+# # cat /etc/ssh/sshd_config | grep -i denygroups
+DenyGroups 2g-admin
+
+# getent group 2g-admin
+2g-admin:x:1005:user1,user2,user3
+```
+
+这样就行了, 现在只需要重启 `ssh` 服务和见证奇迹了。
+
+```
+# systemctl restart sshd
+或
+# service restart sshd
+```
+
+是的 `user1` 不被允许登入系统,因为他是 `2g-admin` 用户组中的一员。他属于被禁用 `ssh` 的组中。
+
+```
+# ssh user1@192.168.1.4
+user1@192.168.1.4's password:
+Permission denied, please try again.
+```
+
+输出:
+
+```
+Mar 29 02:17:32 CentOS7 sshd[5400]: User user1 from 192.168.1.6 not allowed because a group is listed in DenyGroups
+Mar 29 02:17:32 CentOS7 sshd[5400]: input_userauth_request: invalid user user1 [preauth]
+Mar 29 02:17:38 CentOS7 unix_chkpwd[5402]: password check failed for user (user1)
+Mar 29 02:17:38 CentOS7 sshd[5400]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.1.6 user=user1
+Mar 29 02:17:41 CentOS7 sshd[5400]: Failed password for invalid user user1 from 192.168.1.6 port 42710 ssh2
+```
+
+除了 `2g-admin` 用户组之外的用户都可以使用 ssh 登入系统。 例如,`ladmin` 等用户就允许登入系统。
+
+```
+# ssh ladmin@192.168.1.4
+ladmin@192.168.1.4's password:
+[ladmin@CentOS7 ~]$
+```
+
+输出:
+
+```
+Mar 29 02:19:13 CentOS7 sshd[5432]: Accepted password for ladmin from 192.168.1.6 port 42716 ssh2
+Mar 29 02:19:13 CentOS7 sshd[5432]: pam_unix(sshd:session): session opened for user ladmin by (uid=0)
+```
+
+--------------------------------------------------------------------------------
+
+via: https://www.2daygeek.com/allow-deny-enable-disable-ssh-access-user-group-in-linux/
+
+作者:[2daygeek][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]: http://www.2daygeek.com/author/2daygeek/
+[b]: https://github.com/lujun9972
+[1]: https://www.2daygeek.com/category/ssh-tutorials/
diff --git a/published/20190731 How to structure a multi-file C program- Part 2.md b/published/20190731 How to structure a multi-file C program- Part 2.md
new file mode 100644
index 0000000000..53dc8bb70e
--- /dev/null
+++ b/published/20190731 How to structure a multi-file C program- Part 2.md
@@ -0,0 +1,224 @@
+[#]: collector: (lujun9972)
+[#]: translator: (mengxinayan)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-12000-1.html)
+[#]: subject: (How to structure a multi-file C program: Part 2)
+[#]: via: (https://opensource.com/article/19/7/structure-multi-file-c-part-2)
+[#]: author: (Erik O'Shaughnessy https://opensource.com/users/jnyjny)
+
+如何组织构建多文件 C 语言程序(二)
+======
+
+> 我将在本系列的第二篇中深入研究由多个文件组成的 C 程序的结构。
+
+![](https://img.linux.net.cn/data/attachment/album/202003/16/122928i6qheufnh24jq2qf.jpg)
+
+在[第一篇][2]中,我设计了一个名为[喵呜喵呜][3]的多文件 C 程序,该程序实现了一个玩具[编解码器][4]。我也提到了程序设计中的 Unix 哲学,即在一开始创建多个空文件,并建立一个好的结构。最后,我创建了一个 `Makefile` 文件夹并阐述了它的作用。在本文中将另一个方向展开:现在我将介绍简单但具有指导性的喵呜喵呜编解码器的实现。
+
+当读过我的《[如何写一个好的 C 语言 main 函数][5]》后,你会觉得喵呜喵呜编解码器的 `main.c` 文件的结构很熟悉,其主体结构如下:
+
+```
+/* main.c - 喵呜喵呜流式编解码器 */
+
+/* 00 系统包含文件 */
+/* 01 项目包含文件 */
+/* 02 外部声明 */
+/* 03 定义 */
+/* 04 类型定义 */
+/* 05 全局变量声明(不要用)*/
+/* 06 附加的函数原型 */
+
+int main(int argc, char *argv[])
+{
+ /* 07 变量声明 */
+ /* 08 检查 argv[0] 以查看该程序是被如何调用的 */
+ /* 09 处理来自用户的命令行选项 */
+ /* 10 做点有用的事情 */
+}
+
+/* 11 其它辅助函数 */
+```
+
+### 包含项目头文件
+
+位于第二部分中的 `/* 01 项目包含文件 */` 的源代码如下:
+
+
+```
+/* main.c - 喵呜喵呜流式编解码器 */
+...
+/* 01 项目包含文件 */
+#include "main.h"
+#include "mmecode.h"
+#include "mmdecode.h"
+```
+
+`#include` 是 C 语言的预处理命令,它会将该文件名的文件内容拷贝到当前文件中。如果程序员在头文件名称周围使用双引号(`""`),编译器将会在当前目录寻找该文件。如果文件被尖括号包围(`<>`),编译器将在一组预定义的目录中查找该文件。
+
+[main.h][6] 文件中包含了 [main.c][7] 文件中用到的定义和类型定义。我喜欢尽可能多将声明放在头文件里,以便我在我的程序的其他位置使用这些定义。
+
+头文件 [mmencode.h][8] 和 [mmdecode.h][9] 几乎相同,因此我以 `mmencode.h` 为例来分析。
+
+```
+/* mmencode.h - 喵呜喵呜流编解码器 */
+
+#ifndef _MMENCODE_H
+#define _MMENCODE_H
+
+#include
+
+int mm_encode(FILE *src, FILE *dst);
+
+#endif /* _MMENCODE_H */
+```
+
+`#ifdef`、`#define`、`#endif` 指令统称为 “防护” 指令。其可以防止 C 编译器在一个文件中多次包含同一文件。如果编译器在一个文件中发现多个定义/原型/声明,它将会产生警告。因此这些防护措施是必要的。
+
+在这些防护内部,只有两个东西:`#include` 指令和函数原型声明。我在这里包含了 `stdio.h` 头文件,以便于能在函数原型中使用 `FILE` 定义。函数原型也可以被包含在其他 C 文件中,以便于在文件的命名空间中创建它。你可以将每个文件视为一个独立的命名空间,其中的变量和函数不能被另一个文件中的函数或者变量使用。
+
+编写头文件很复杂,并且在大型项目中很难管理它。不要忘记使用防护。
+
+### 喵呜喵呜编码的最终实现
+
+该程序的功能是按照字节进行 `MeowMeow` 字符串的编解码,事实上这是该项目中最简单的部分。截止目前我所做的工作便是支持允许在适当的位置调用此函数:解析命令行,确定要使用的操作,并打开将要操作的文件。下面的循环是编码的过程:
+
+```
+/* mmencode.c - 喵呜喵呜流式编解码器 */
+...
+ while (!feof(src)) {
+
+ if (!fgets(buf, sizeof(buf), src))
+ break;
+
+ for(i=0; i> 4;
+ fputs(tbl[hi], dst);
+ fputs(tbl[lo], dst);
+ }
+ }
+```
+
+简单的说,当文件中还有数据块时( `feof(3)` ),该循环读取(`feof(3)` )文件中的一个数据块。然后将读入的内容的每个字节分成两个 `hi` 和 `lo` 的半字节。半字节是半个字节,即 4 个位。这里的奥妙之处在于可以用 4 个位来编码 16 个值。我将 `hi` 和 `lo` 用作 16 个字符串查找表 `tbl` 的索引,表中包含了用半字节编码的 `MeowMeow` 字符串。这些字符串使用 `fputs(3)` 函数写入目标 `FILE` 流,然后我们继续处理缓存区的下一个字节。
+
+该表使用 [table.h][14] 中的宏定义进行初始化,在没有特殊原因(比如:要展示包含了另一个项目的本地头文件)时,我喜欢使用宏来进行初始化。我将在未来的文章中进一步探讨原因。
+
+### 喵呜喵呜解码的实现
+
+我承认在开始工作前花了一些时间。解码的循环与编码类似:读取 `MeowMeow` 字符串到缓冲区,将编码从字符串转换为字节
+
+```
+ /* mmdecode.c - 喵呜喵呜流式编解码器 */
+ ...
+ int mm_decode(FILE *src, FILE *dst)
+ {
+ if (!src || !dst) {
+ errno = EINVAL;
+ return -1;
+ }
+ return stupid_decode(src, dst);
+ }
+```
+
+这不符合你的期望吗?
+
+在这里,我通过外部公开的 `mm_decode()` 函数公开了 `stupid_decode()` 函数细节。我上面所说的“外部”是指在这个文件之外。因为 `stupid_decode()` 函数不在该头文件中,因此无法在其他文件中调用它。
+
+当我们想发布一个可靠的公共接口时,有时候会这样做,但是我们还没有完全使用函数解决问题。在本例中,我编写了一个 I/O 密集型函数,该函数每次从源中读取 8 个字节,然后解码获得 1 个字节写入目标流中。较好的实现是一次处理多于 8 个字节的缓冲区。更好的实现还可以通过缓冲区输出字节,进而减少目标流中单字节的写入次数。
+
+```
+/* mmdecode.c - 喵呜喵呜流式编解码器 */
+...
+int stupid_decode(FILE *src, FILE *dst)
+{
+ char buf[9];
+ decoded_byte_t byte;
+ int i;
+
+ while (!feof(src)) {
+ if (!fgets(buf, sizeof(buf), src))
+ break;
+ byte.field.f0 = isupper(buf[0]);
+ byte.field.f1 = isupper(buf[1]);
+ byte.field.f2 = isupper(buf[2]);
+ byte.field.f3 = isupper(buf[3]);
+ byte.field.f4 = isupper(buf[4]);
+ byte.field.f5 = isupper(buf[5]);
+ byte.field.f6 = isupper(buf[6]);
+ byte.field.f7 = isupper(buf[7]);
+
+ fputc(byte.value, dst);
+ }
+ return 0;
+}
+```
+
+我并没有使用编码器中使用的位移方法,而是创建了一个名为 `decoded_byte_t` 的自定义数据结构。
+
+```
+/* mmdecode.c - 喵呜喵呜流式编解码器 */
+...
+
+typedef struct {
+ unsigned char f7:1;
+ unsigned char f6:1;
+ unsigned char f5:1;
+ unsigned char f4:1;
+ unsigned char f3:1;
+ unsigned char f2:1;
+ unsigned char f1:1;
+ unsigned char f0:1;
+} fields_t;
+
+typedef union {
+ fields_t field;
+ unsigned char value;
+} decoded_byte_t;
+```
+
+初次看到代码时可能会感到有点儿复杂,但不要放弃。`decoded_byte_t` 被定义为 `fields_t` 和 `unsigned char` 的 **联合**。可以将联合中的命名成员看作同一内存区域的别名。在这种情况下,`value` 和 `field` 指向相同的 8 位内存区域。将 `field.f0` 设置为 `1` 也将会设置 `value` 中的最低有效位。
+
+虽然 `unsigned char` 并不神秘,但是对 `fields_t` 的类型定义(`typedef`)也许看起来有些陌生。现代 C 编译器允许程序员在结构体中指定单个位字段的值。字段所在的类型是一个无符号整数类型,并在成员标识符后紧跟一个冒号和一个整数,该整数指定了位字段的长度。
+
+这种数据结构使得按字段名称访问字节中的每个位变得简单,并可以通过联合中的 `value` 字段访问组合后的值。我们依赖编译器生成正确的移位指令来访问字段,这可以在调试时为你节省不少时间。
+
+最后,因为 `stupid_decode()` 函数一次仅从源 `FILE` 流中读取 8 个字节,所以它效率并不高。通常我们尝试最小化读写次数,以提高性能和降低调用系统调用的开销。请记住:少量的读取/写入大的块比大量的读取/写入小的块好得多。
+
+### 总结
+
+用 C 语言编写一个多文件程序需要程序员要比只是是一个 `main.c` 做更多的规划。但是当你添加功能或者重构时,只需要多花费一点儿努力便可以节省大量时间以及避免让你头痛的问题。
+
+回顾一下,我更喜欢这样做:多个文件,每个文件仅有简单功能;通过头文件公开那些文件中的小部分功能;把数字常量和字符串常量保存在头文件中;使用 `Makefile` 而不是 Bash 脚本来自动化处理事务;使用 `main()` 函数来处理命令行参数解析并作为程序主要功能的框架。
+
+我知道我只是蜻蜓点水般介绍了这个简单的程序,并且我很高兴知道哪些事情对你有所帮助,以及哪些主题需要详细的解释。请在评论中分享你的想法,让我知道。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/7/structure-multi-file-c-part-2
+
+作者:[Erik O'Shaughnessy][a]
+选题:[lujun9972][b]
+译者:[萌新阿岩](https://github.com/mengxinayan)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/jnyjny
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/file_system.jpg?itok=pzCrX1Kc (4 manilla folders, yellow, green, purple, blue)
+[2]: https://linux.cn/article-11935-1.html
+[3]: https://github.com/jnyjny/MeowMeow.git
+[4]: https://en.wikipedia.org/wiki/Codec
+[5]: https://linux.cn/article-10949-1.html
+[6]: https://github.com/JnyJny/meowmeow/blob/master/main.h
+[7]: https://github.com/JnyJny/meowmeow/blob/master/main.c
+[8]: https://github.com/JnyJny/meowmeow/blob/master/mmencode.h
+[9]: https://github.com/JnyJny/meowmeow/blob/master/mmdecode.h
+[10]: http://www.opengroup.org/onlinepubs/009695399/functions/feof.html
+[11]: http://www.opengroup.org/onlinepubs/009695399/functions/fgets.html
+[12]: http://www.opengroup.org/onlinepubs/009695399/functions/strlen.html
+[13]: http://www.opengroup.org/onlinepubs/009695399/functions/fputs.html
+[14]: https://github.com/JnyJny/meowmeow/blob/master/table.h
+[15]: http://www.opengroup.org/onlinepubs/009695399/functions/isupper.html
+[16]: http://www.opengroup.org/onlinepubs/009695399/functions/fputc.html
diff --git a/published/20190813 Building a non-breaking breakpoint for Python debugging.md b/published/20190813 Building a non-breaking breakpoint for Python debugging.md
new file mode 100644
index 0000000000..0ad21ebeab
--- /dev/null
+++ b/published/20190813 Building a non-breaking breakpoint for Python debugging.md
@@ -0,0 +1,215 @@
+[#]: collector: (lujun9972)
+[#]: translator: (caiichenr)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11986-1.html)
+[#]: subject: (Building a non-breaking breakpoint for Python debugging)
+[#]: via: (https://opensource.com/article/19/8/debug-python)
+[#]: author: (Liran Haimovitch https://opensource.com/users/liranhaimovitch)
+
+在 Python 调试过程中设置不中断的断点
+======
+
+> 你对如何让调试器变得更快产生过兴趣吗?本文将分享我们在为 Python 构建调试器时得到的一些经验。
+
+![](https://img.linux.net.cn/data/attachment/album/202003/12/104433hq3qx2k81w1wamwm.jpg)
+
+整段故事讲的是我们在 [Rookout][2] 公司的团队为 Python 调试器开发不中断断点的经历,以及开发过程中得到的经验。我将在本月于旧金山举办的 [PyBay 2019][3] 上介绍有关 Python 调试过程的更多细节,但现在就让我们立刻开始这段故事。
+
+### Python 调试器的心脏:sys.set_trace
+
+在诸多可选的 Python 调试器中,使用最广泛的三个是:
+
+* pdb,它是 Python 标准库的一部分
+* PyDev,它是内嵌在 Eclipse 和 Pycharm 等 IDE 中的调试器
+* ipdb,它是 IPython 的调试器
+
+Python 调试器的选择虽多,但它们几乎都基于同一个函数:`sys.settrace`。 值得一提的是, [sys.settrace][4] 可能也是 Python 标准库中最复杂的函数。
+
+![set_trace Python 2 docs page][5]
+
+简单来讲,`settrace` 的作用是为解释器注册一个跟踪函数,它在下列四种情形发生时被调用:
+
+* 函数调用
+* 语句执行
+* 函数返回
+* 异常抛出
+
+一个简单的跟踪函数看上去大概是这样:
+
+```
+def simple_tracer(frame, event, arg):
+ co = frame.f_code
+ func_name = co.co_name
+ line_no = frame.f_lineno
+ print("{e} {f} {l}".format(
+e=event, f=func_name, l=line_no))
+ return simple_tracer
+```
+
+在分析函数时我们首先关注的是参数和返回值,该跟踪函数的参数分别是:
+
+* `frame`,当前堆栈帧,它是包含当前函数执行时解释器里完整状态的对象
+* `event`,事件,它是一个值可能为 `call`、`line`、`return` 或 `exception` 的字符串
+* `arg`,参数,它的取值基于 `event` 的类型,是一个可选项
+
+该跟踪函数的返回值是它自身,这是由于解释器需要持续跟踪两类跟踪函数:
+
+* **全局跟踪函数(每线程)**:该跟踪函数由当前线程调用 `sys.settrace` 来设置,并在解释器创建一个新的堆栈帧时被调用(即代码中发生函数调用时)。虽然没有现成的方式来为不同的线程设置跟踪函数,但你可以调用 `threading.settrace` 来为所有新创建的 `threading` 模块线程设置跟踪函数。
+* **局部跟踪函数(每一帧)**:解释器将该跟踪函数的值设置为全局跟踪函数创建帧时的返回值。同样也没有现成的方法能够在帧被创建时自动设置局部跟踪函数。
+
+该机制的目的是让调试器对被跟踪的帧有更精确的把握,以减少对性能的影响。
+
+### 简单三步构建调试器 (我们最初的设想)
+
+仅仅依靠上文提到的内容,用自制的跟踪函数来构建一个真正的调试器似乎有些不切实际。幸运的是,Python 的标准调试器 pdb 是基于 Bdb 构建的,后者是 Python 标准库中专门用于构建调试器的基类。
+
+基于 Bdb 的简易断点调试器看上去是这样的:
+
+```
+import bdb
+import inspect
+
+class Debugger(bdb.Bdb):
+ def __init__(self):
+ Bdb.__init__(self)
+ self.breakpoints = dict()
+ self.set_trace()
+
+def set_breakpoint(self, filename, lineno, method):
+ self.set_break(filename, lineno)
+ try :
+ self.breakpoints[(filename, lineno)].add(method)
+ except KeyError:
+ self.breakpoints[(filename, lineno)] = [method]
+
+def user_line(self, frame):
+ if not self.break_here(frame):
+ return
+
+ # Get filename and lineno from frame
+ (filename, lineno, _, _, _) = inspect.getframeinfo(frame)
+
+ methods = self.breakpoints[(filename, lineno)]
+ for method in methods:
+ method(frame)
+```
+
+这个调试器类的全部构成是:
+
+1. 继承 `Bdb`,定义一个简单的构造函数来初始化基类,并开始跟踪。
+2. 添加 `set_breakpoint` 方法,它使用 `Bdb` 来设置断点,并跟踪这些断点。
+3. 重载 `Bdb` 在当前用户行调用的 `user_line` 方法,该方法一定被一个断点调用,之后获取该断点的源位置,并调用已注册的断点。
+
+### 这个简易的 Bdb 调试器效率如何呢?
+
+Rookout 的目标是在生产级性能的使用场景下提供接近普通调试器的使用体验。那么,让我们来看看先前构建出来的简易调试器表现的如何。
+
+为了衡量调试器的整体性能开销,我们使用如下两个简单的函数来进行测试,它们分别在不同的情景下执行了 1600 万次。请注意,在所有情景下断点都不会被执行。
+
+```
+def empty_method():
+ pass
+
+def simple_method():
+ a = 1
+ b = 2
+ c = 3
+ d = 4
+ e = 5
+ f = 6
+ g = 7
+ h = 8
+ i = 9
+ j = 10
+```
+
+在使用调试器的情况下需要大量的时间才能完成测试。糟糕的结果指明了,这个简陋 `Bdb` 调试器的性能还远不足以在生产环境中使用。
+
+![First Bdb debugger results][6]
+
+### 对调试器进行优化
+
+降低调试器的额外开销主要有三种方法:
+
+1. **尽可能的限制局部跟踪**:由于每一行代码都可能包含大量事件,局部跟踪比全局跟踪的开销要大得多。
+2. **优化 `call` 事件并尽快将控制权还给解释器**:在 `call` 事件发生时调试器的主要工作是判断是否需要对该事件进行跟踪。
+3. **优化 `line` 事件并尽快将控制权还给解释器**:在 `line` 事件发生时调试器的主要工作是判断我们在此处是否需要设置一个断点。
+
+于是我们复刻了 `Bdb` 项目,精简特征、简化代码,针对使用场景进行优化。这些工作虽然得到了一些效果,但仍无法满足我们的需求。因此我们又继续进行了其它的尝试,将代码优化并迁移至 `.pyx` 使用 [Cython][7] 进行编译,可惜结果(如下图所示)依旧不够理想。最终,我们在深入了解 CPython 源码之后意识到,让跟踪过程快到满足生产需求是不可能的。
+
+![Second Bdb debugger results][8]
+
+### 放弃 Bdb 转而尝试字节码操作
+
+熬过先前对标准调试方法进行的试验-失败-再试验循环所带来的失望,我们将目光转向另一种选择:字节码操作。
+
+Python 解释器的工作主要分为两个阶段:
+
+1. **将 Python 源码编译成 Python 字节码**:这种(对人类而言)不可读的格式专为执行的效率而优化,它们通常缓存在我们熟知的 `.pyc` 文件当中。
+2. **遍历 解释器循环中的字节码**: 在这一步中解释器会逐条的执行指令。
+
+我们选择的模式是:使用**字节码操作**来设置没有全局额外开销的**不中断断点**。这种方式的实现首先需要在内存中的字节码里找到我们感兴趣的部分,然后在该部分的相关机器指令前插入一个函数调用。如此一来,解释器无需任何额外的工作即可实现我们的不中断断点。
+
+这种方法并不依靠魔法来实现,让我们简要地举个例子。
+
+首先定义一个简单的函数:
+
+```
+def multiply(a, b):
+ result = a * b
+ return result
+```
+
+在 [inspect][9] 模块(其包含了许多实用的单元)的文档里,我们得知可以通过访问 `multiply.func_code.co_code` 来获取函数的字节码:
+
+```
+'|\x00\x00|\x01\x00\x14}\x02\x00|\x02\x00S'
+```
+
+使用 Python 标准库中的 [dis][10] 模块可以翻译这些不可读的字符串。调用 `dis.dis(multiply.func_code.co_code)` 之后,我们就可以得到:
+
+```
+ 4 0 LOAD_FAST 0 (a)
+ 3 LOAD_FAST 1 (b)
+ 6 BINARY_MULTIPLY
+ 7 STORE_FAST 2 (result)
+
+ 5 10 LOAD_FAST 2 (result)
+ 13 RETURN_VALUE
+```
+
+与直截了当的解决方案相比,这种方法让我们更靠近发生在调试器背后的事情。可惜 Python 并没有提供在解释器中修改函数字节码的方法。我们可以对函数对象进行重写,不过那样做的效率满足不了大多数实际的调试场景。最后我们不得不采用一种迂回的方式来使用原生拓展才能完成这一任务。
+
+### 总结
+
+在构建一个新工具时,总会学到许多事情的工作原理。这种刨根问底的过程能够使你的思路跳出桎梏,从而得到意料之外的解决方案。
+
+在 Rookout 团队中构建不中断断点的这段时间里,我学到了许多有关编译器、调试器、服务器框架、并发模型等等领域的知识。如果你希望更深入的了解字节码操作,谷歌的开源项目 [cloud-debug-python][11] 为编辑字节码提供了一些工具。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/8/debug-python
+
+作者:[Liran Haimovitch][a]
+选题:[lujun9972][b]
+译者:[caiichenr](https://github.com/caiichenr)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/liranhaimovitch
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/python_jungle_lead.jpeg?itok=pFKKEvT- (Real python in the graphic jungle)
+[2]: https://rookout.com/
+[3]: https://pybay.com/
+[4]: https://docs.python.org/3/library/sys.html#sys.settrace
+[5]: https://opensource.com/sites/default/files/uploads/python2docs.png (set_trace Python 2 docs page)
+[6]: https://opensource.com/sites/default/files/uploads/debuggerresults1.png (First Bdb debugger results)
+[7]: https://cython.org/
+[8]: https://opensource.com/sites/default/files/uploads/debuggerresults2.png (Second Bdb debugger results)
+[9]: https://docs.python.org/2/library/inspect.html
+[10]: https://docs.python.org/2/library/dis.html
+[11]: https://github.com/GoogleCloudPlatform/cloud-debug-python
+[12]: https://pybay.com/speaker/liran-haimovitch/
+[13]: https://ti.to/sf-python/pybay2019/discount/OpenSource35
diff --git a/published/20190925 Debugging in Emacs- The Grand Unified Debugger.md b/published/20190925 Debugging in Emacs- The Grand Unified Debugger.md
new file mode 100644
index 0000000000..ef4b71f194
--- /dev/null
+++ b/published/20190925 Debugging in Emacs- The Grand Unified Debugger.md
@@ -0,0 +1,104 @@
+[#]: collector: (lujun9972)
+[#]: translator: (cycoe)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11994-1.html)
+[#]: subject: (Debugging in Emacs: The Grand Unified Debugger)
+[#]: via: (https://opensourceforu.com/2019/09/debugging-in-emacs-the-grand-unified-debugger/)
+[#]: author: (Vineeth Kartha https://opensourceforu.com/author/vineeth-kartha/)
+
+Emacs 调试秘籍之 GUD 调试器
+======
+
+![][2]
+
+> 本文简短地对 Emacs 的调试工具 GUD 的特性进行了探索。
+
+如果你是一个 C 或 C++ 开发者,你很可能已经使用过 GDB(GNU 调试器),毫无疑问,它是现今最强大、最无可匹敌的调试器之一。它唯一的缺点就是它基于命令行,虽然仍能提供许多强大的功能,但有时也会具有一些局限性。这也就是为什么聪明的人们开始追求整合了编辑器和调试器的图形化集成开发环境。仍有些开发者坚信使用鼠标会降低工作效率,在 GUI 上用鼠标点~点~点~是来自恶魔的诱惑。
+
+因为 Emacs 是现今最酷的文本编辑器之一,我将为你展示如何在不碰鼠标且不离开 Emacs 的情况下,实现写代码、编译代码、调试代码的过程。
+
+GUD(LCTT 译注:全称大统一调试器,鉴于其缩写形式更为人熟知,以下全文将使用缩写替代此全称)是 Emacs 下的一个模式,用于在 Emacs 中运行 GDB。它向 GDB 提供了 Emacs 的所有特性,使用户无需离开编辑器就可以对代码进行调试。
+
+### 使用 GUD 的前期准备
+
+如果你正在使用一个 Linux 机器,很可能你已经安装了 GDB 和 gcc,接下来就是要确保已经安装了 Emacs。以下的内容我将假设读者熟悉 GDB 并且至少用它做过基本的调试。如果你未曾接触过 GDB,你可以做个快速入门,这些资料在网上随处可得。
+
+对于那些 Emacs 新手,我将向你介绍一些基本术语。纵览整篇文章,你将看到诸如 `C-c M-x` 等快捷键。此处 `C` 代表 `Ctrl` 键,`M` 代表 `Alt` 键。`C-c` 代表 `Ctrl` 键和 `c` 键被同时按下。如果你看到 `C-c c`,它代表同时按下 `Ctrl` 键和 `c` 键,释放后紧接着按下 `c` 键。在 Emacs 中,编辑文本的主要区域被称为主缓冲区,而在 Emacs 窗口下方用于输入命令的区域被称为迷你缓冲区。
+
+启动 Emacs,并按下 `C-x C-f` 来创建一个新文件。Emacs 将提示你输入一个文件名,此处让我们将文件命名为 `buggyFactorial.cpp`。一旦文件打开,输入如下代码:
+
+```
+#include
+#include
+
+int factorial(int num) {
+ int product = 1;
+ while(num--) {
+ product *= num;
+ }
+ return product;
+}
+int main() {
+ int result = factorial(5);
+ assert(result == 120);
+}
+```
+
+使用 `C-x C-s` 快捷键保存文件。文件保存完毕,是时候进行编译了。按下 `M-x`,在弹出的提示符后输入 `compile` 并点击回车。然后在提示符后,将内容替换为 `g++ -g buggyFactorial.cpp` 并再次点击回车。
+
+![图 1: Emacs 迷你缓冲区中编译命令][3]
+
+这将在 Emacs 中开启另一个缓冲区,显示编译的状态。如果你的代码输入没有错误,你将预期得到如图 2 所示的缓冲区。
+
+![图 2: 编译状态][4]
+
+要想隐藏编译缓冲区,首先确保你的光标在编译缓冲区中(你可以不使用鼠标,而是通过 `C-x o` 快捷键将光标从一个缓冲区移动到另一个),然后按下 `C-x 0`。下一步就是运行代码,并观察是否运行良好。按下 `M-!` 快捷键并在迷你缓冲区的提示符后面输入 `./a.out`。
+
+![图 3: 代码在迷你缓冲区中的输出][5]
+
+你可以看到迷你缓冲区中显示断言失败。很明显代码中有错误,因为 5 的阶乘是 120。那么让我们现在开始调试吧。
+
+### 使用 GUD 调式代码
+
+现在,我们的代码已经编译完成,是时候看看到底哪里出错了。按下 `M-x` 快捷键并在提示符后输入 `gdb`。在接下来的提示符后,输入 `gdb -i=mi a.out`。如果一切顺利,GDB 会在 Emacs 缓冲区中启动,你会看到如图 4 所示的窗口。
+
+![图 4: Emacs 中的 GDB 缓冲区][6]
+
+在 `gdb` 提示符后,输入 `break main` 来设置断点,并输入 `r` 来运行程序。程序会开始运行并停在 `main()` 函数处。
+
+一旦 GDB 到达了 `main` 处设置的断点,就会弹出一个新的缓冲区显示你正在调试的代码。注意左侧的红点,正是你设置断点的位置,同时会有一个小的标志提示你当前代码运行到了哪一行。当前,该标志就在断点处(如图 5)。
+
+![图 5: GDB 与代码显示在两个分离的窗口][7]
+
+为了调试 `factorial` 函数,我们需要单步运行。想要达到此目的,你可以在 GBD 提示符使用 GDB 命令 `step`,或者使用 Emacs 快捷键 `C-c C-s`。还有其它一些快捷键,但我更喜欢 GDB 命令。因此我将在本文的后续部分使用它们。
+
+单步运行时让我们注意一下局部变量中的阶乘值。参考图 6 来设置在 Emacs 帧中显示局部变量值。
+
+![图 6: 在 Emacs 中使用独立帧显示局部变量][8]
+
+在 GDB 提示符中进行单步运行并观察局部变量值的变化。在循环的第一次迭代中,我们发现了一个问题。此处乘法的结果应该是 5 而不是 4。
+
+本文到这里也差不多结束了,读者可以自行探索发现 GUD 模式这片新大陆。GDB 中的所有命令都可以在 GUD 模式中运行。我将此代码的修复留给读者作为一个练习。看看你在调试的过程中,可以做哪一些定制化,来使你的工作流更加简单和高效。
+
+--------------------------------------------------------------------------------
+
+via: https://opensourceforu.com/2019/09/debugging-in-emacs-the-grand-unified-debugger/
+
+作者:[Vineeth Kartha][a]
+选题:[lujun9972][b]
+译者:[cycoe](https://github.com/cycoe)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensourceforu.com/author/vineeth-kartha/
+[b]: https://github.com/lujun9972
+[1]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/09/Screenshot-from-2019-09-25-15-39-46.png?ssl=1
+[2]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/09/Screenshot-from-2019-09-25-15-39-46.png?ssl=1
+[3]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2019/09/Figure_1.png?ssl=1
+[4]: https://i2.wp.com/opensourceforu.com/wp-content/uploads/2019/09/Figure_2.png?ssl=1
+[5]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/09/Figure_3.png?ssl=1
+[6]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/09/Figure_4.png?ssl=1
+[7]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2019/09/Figure_5.png?ssl=1
+[8]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2019/09/Figure_6.png?ssl=1
diff --git a/published/20191126 Calculator N- is an open source scientific calculator for your smartphone.md b/published/20191126 Calculator N- is an open source scientific calculator for your smartphone.md
new file mode 100644
index 0000000000..3ba3711fe6
--- /dev/null
+++ b/published/20191126 Calculator N- is an open source scientific calculator for your smartphone.md
@@ -0,0 +1,60 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11981-1.html)
+[#]: subject: (Calculator N+ is an open source scientific calculator for your smartphone)
+[#]: via: (https://opensource.com/article/19/11/calculator-n-mobile)
+[#]: author: (Ricardo Berlasso https://opensource.com/users/rgb-es)
+
+Calculator N+:一款智能手机上的开源科学计算器
+======
+
+> 这个 Android 应用可在掌中计算许多高级数学函数。
+
+![](https://img.linux.net.cn/data/attachment/album/202003/10/113543hlb5xu7b5e17ba90.jpg)
+
+移动电话每天都在变得越来越强大,因此毫不奇怪它们可以击败不太久前的大多数计算机。这也意味着移动手机上的工具每天都在变得越来越强大。
+
+之前,我写过一篇 [两款 Linux 桌面端可用的科学计算器][2],我接着将介绍 [Calculator N+][3],这是一款很棒的适用于 Android 设备的计算机代数系统(CAS)应用,采用 GPL v3.0 许可证下。
+
+Calculator N+ 被认为是“适用于 Android 的强大计算器”,但这是一个谦虚的说法。它不仅可以以任意精度工作,还可以显示根数和分数等*很多*功能。
+
+寻找多项式根?可以。分解因数?可以。导数、积分和极限?可以。数论(模算术、组合学、素因数分解)?可以。
+
+你还可以求解方程系统、简化表达式(包括三角函数)、转换单位,只要你想到的,它都能做!
+
+![Calculator N+ graphical interface][4]
+
+其结果以 LaTeX 输出。左上方的菜单提供了许多强大的功能,只需触摸一下即可使用。同样在该菜单中,你将找到该应用所有功能的帮助文件。在屏幕的右上角,你可以在精确表示法和十进制表示法之间切换。最后,点击屏幕底部的蓝色栏,即可访问应用中的所有函数库。不过要小心!如果你不是数学家、物理学家或工程师,那么这么长的列表会看上去很吓人。
+
+所有这些功能都来自 [Symja 库][5],这是另一个出色的 GPL 3 项目。
+
+这两个项目都处于积极开发中,并且每个版本都在不断完善。特别是,Calculator N+ 的 v3.4.6 在用户界面(UI)品质方面取得了重大飞跃。虽然还是存在一些不够好的地方,但是要在智能手机的小巧的用户界面中发挥如此强大的功能是一项艰巨的任务,我认为应用开发人员正在很好地解决其剩余的问题。对他们表示敬意!
+
+如果你是老师、学生或在理工科领域工作,请试试 Calculator N+。它是免费、无广告、开源的,并可以满足你所有的数学需求。(当然,除了数学考试期间,为防止作弊绝对不允许使用智能手机。)
+
+可以在 [Google Play 商店][6]找到 Calculator N+,也可以使用 GitHub 页面上的说明[从源代码构建][7]。
+
+如果你知道用于科学或工程的其他有用的开源应用,请在评论中告知我们。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/11/calculator-n-mobile
+
+作者:[Ricardo Berlasso][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/rgb-es
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/calculator_money_currency_financial_tool.jpg?itok=2QMa1y8c (scientific calculator)
+[2]: https://linux.cn/article-9643-1.html
+[3]: https://github.com/tranleduy2000/ncalc
+[4]: https://opensource.com/sites/default/files/uploads/calculatornplus_sqrt-frac.png (Calculator N+ graphical interface)
+[5]: https://github.com/axkr/symja_android_library
+[6]: https://play.google.com/store/apps/details?id=com.duy.calculator.free
+[7]: https://github.com/tranleduy2000/ncalc/blob/master/README.md
diff --git a/published/20191223 10 articles to learn Linux your way.md b/published/20191223 10 articles to learn Linux your way.md
new file mode 100644
index 0000000000..a38a98dff2
--- /dev/null
+++ b/published/20191223 10 articles to learn Linux your way.md
@@ -0,0 +1,99 @@
+[#]: collector: "lujun9972"
+[#]: translator: "messon007"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-12035-1.html"
+[#]: subject: "10 articles to learn Linux your way"
+[#]: via: "https://opensource.com/article/19/12/learn-linux"
+[#]: author: "Seth Kenlon https://opensource.com/users/seth"
+
+10 篇关于 Linux 的好文章
+=======
+
+> 2019 年对于 Linux 来说是个好年份,让我们一起来回顾一下这十篇关于 Linux 的好文章。
+
+![](https://img.linux.net.cn/data/attachment/album/202003/25/115447rrjfuufccumf0oz6.jpg)
+
+2019 年对于 Linux 来说是个好年份,显然这里的 “Linux” 一词有更多含义: 内核? 桌面? 或是生态? 在此次回顾年度 Linux 好文中,我在选择十大好文时有意采取了更开放的视角。下面就是十大好文(无先后次序之分)。
+
+### 《Linux 权限入门指南》
+
+Bryant Son 的《[Linux 权限入门指南][2]》向新用户介绍了文件权限的概念,通过图形和图表的方式来说明每个要点。通常很难以视觉的方式来解释纯粹基于文本的概念,而本文则对可视方式学习的人非常友好。 Bryant 在讲述时也很专注主题。关于文件权限的任何阐述都可能引出几个相关主题(例如所有权和访问控制列表等),但是本文致力于解释一件事并很好地解释它。
+
+### 《为什么我从 Mac 换到了 Linux》
+
+Matthew Broberg 在《[为什么我从 Mac 换到了 Linux][3]》中清楚而客观的介绍了他从 MacOS 切换到 Linux 的经历。通常切换平台是很困难的,因此记录决定切换的背后考虑非常重要。我认为 Matt 的文章带有几个目的,但对我来说最重要的两个目的是:通过解答他的问题并提供潜在的解决方案,他请 Linux 社区的人们来支持他;这对于其他正在考虑采用 Linux 的人来说是一个很好的参考。
+
+### 《在 Linux 上定位 WiFi 速度慢的问题》
+
+《[在 Linux 上定位 WiFi 速度慢的问题][4]》这篇文章中,David Clinton 对每个人都可能遇到的问题进行了分析,并提供了怎么样一步步解决的思路。这是“偶然的 Linux”技巧的一个很好的例子,但它不仅可以帮助经常遇到问题的人,而且可以向非 Linux 用户展示如何在其他平台上进行问题定位。
+
+### 《一个非技术人员对 GNOME 项目使用 GitLab 的感受》
+
+Molly de Blanc 所写的《[一个非技术人员对 GNOME 项目使用 GitLab 的感受][5]》深层次地揭示了开源界的一个典范(GNOME 桌面)如何使用开源界的另一个典范(Git)进行开发。听到一个开放源代码项目对于任何需要做的事情默认为开放源代码解决方案,这总是让我感到振奋。无论如何,这种情况并不常见,然而对于 GNOME 来说,这是项目本身的重要且受欢迎的部分。
+
+### 《详解 Linux 中的虚拟文件系统》
+
+Alison Chaiken 在《[详解 Linux 中的虚拟文件系统][6]》中巧妙地解释了对许多用户来说都很难理解的东西。理解文件系统是什么、虚拟文件系统和真实的文件系统是一回事,但从定义上讲,*虚拟的*其实并不是真正的文件系统。Linux 以一种普通用户也能从中受益的方式提供了它们,Alison 的文章以一种易于理解的方式对其进行了阐述。另外,Alison 在文章的后半部分更深入地介绍了如何使用 `bcc` 脚本查看她刚刚讲的虚拟文件系统的相关内容。
+
+### 《理解文件路径并学会使用它们》
+
+我认为《[理解文件路径并学会使用它们][7]》很重要,因为这是大多数用户(在任何平台上)似乎都没有学过的概念。这是一个奇怪的现象,因为现在比以往任何时候,人们都越来越多地看到*文件路徑*:几乎所有的互联网网址都包含一个文件路径,该路径告诉你你在域中的确切位置。我常常在想为什么计算机教育不是从互联网开始的,互联网是目前最熟悉的应用程序,并且可以说是使用最频繁的超级计算机,完全可以用它来解释我们每天使用的设备。(我想如果这些设备运行 Linux 会有所帮助,但是我们正在努力。)
+
+### 《Linux 下的进程间通信:共享存储》
+
+Marty Kalin 的《[Linux 下的进程间通信:共享存储][8]》从 Linux 的开发者视角解释了 IPC 以及如何在代码中使用它。虽然我只是列入了这篇文章,不过它实际上是一个三篇文章的系列,而它是同类文章中阐述的最好的。很少有文档能够解释 Linux 怎样处理 IPC,更不用说 IPC 是什么,为什么它很重要,或者在编程时该如何使用它。通常这是你在大学读书时关注的话题。现在,你可以在这里阅读所有内容。
+
+### 《在 Linux 上用 strace 来理解系统调用》
+
+Gaurav Kamathe 的《[在 Linux 上用 strace 来理解系统调用][9]》具有很强的技术性,我希望我所见过的有关 `strace` 的每次会议演讲都是如此。这是对一个复杂但非常有用的命令的清晰演示。令我惊讶的是,我读了本文才发现自己一直使用的命令不是这个命令,而是 `ltrace`(可以用来查看命令调用了哪些函数)。本文包含了丰富的信息,是开发人员和测试人员的快捷参考手册。
+
+### 《Linux 桌面发展旅程》
+
+Jim Hall 的《[Linux 桌面发展旅程][10]》是对 Linux 桌面历史的一次视觉之旅。从 [TWM][11] 开始,经历了 [FVWM][12]、[GNOME][13]、[KDE][14] 等薪火相传。如果你是 Linux 的新手,那么这将是一个出自那个年代的人的有趣的历史课(有截图可以证明这一点)。如果你已经使用 Linux 多年,那么这肯定会唤醒你的记忆。最后,可以肯定的是:仍然可以找到 20 年前屏幕快照的人都是神一样的数据档案管理员。
+
+### 《用 Linux 创建你自己的视频流服务器》
+
+Aaron J. Prisk 的 《[用 Linux 创建你自己的视频流服务器][15]》消除了大多数人对我们视为理所当然的服务的误解。由于 YouTube 和 Twitch 之类服务的存在,许多人认为这是向世界广播视频的唯一方式。当然,人们过去常常以为 Windows 和 Mac 是计算机的唯一入口,值得庆幸的是,最终证明这是严重的误解。在本文中,Aaron 建立了一个视频流服务器,甚至还顺便讨论了一下 [OBS][16],以便你可以创建视频。这是一个有趣的周末项目还是新职业的开始?你自己决定。
+
+### 《塑造 Linux 历史的 10 个时刻》
+
+Alan Formy-Duval 撰写的《[塑造 Linux 历史的 10 个时刻][17]》试图完成一项艰巨的任务,即从 Linux 的历史中选出 10 件有代表性的事情。当然,这是很难的,因为有如此多重要的时刻,所以我想看看 Alan 是如何通过自己的经历来选择它。例如,什么时候开始意识到 Linux 必然可以发展下去?—— 当 Alan 意识到他维护的所有系统都在运行 Linux 时。用这种方式来解释历史是很美的,因为每个人的重要时刻都会有所不同。 关于 Linux 没有权威性列表,关于 Linux 的文章也没有,关于开源也没有。你可以创建你自己的列表,也可以使你自己成为列表的一部分。
+
+(LCTT 译注:这里推荐了 11 篇,我数了好几遍,没眼花……)
+
+### 你想从何学起?
+
+你还想知道 Linux 的什么内容?请在评论区告诉我们或来文讲述你的 Linux 经验。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/12/learn-linux
+
+作者:[Seth Kenlon][a]
+选题:[lujun9972][b]
+译者:[messon007](https://github.com/messon007)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/seth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/OSDC_Penguin_Image_520x292_12324207_0714_mm_v1a.png?itok=p7cWyQv9 "Penguins gathered together in the Artic"
+[2]: https://linux.cn/article-11056-1.html
+[3]: https://linux.cn/article-11586-1.html
+[4]: http://opensource.com/article/19/4/troubleshooting-wifi-linux
+[5]: https://linux.cn/article-11806-1.html
+[6]: https://linux.cn/article-10884-1.html
+[7]: https://opensource.com/article/19/8/understanding-file-paths-linux
+[8]: https://linux.cn/article-10826-1.html
+[9]: https://linux.cn/article-11545-1.html
+[10]: https://opensource.com/article/19/8/how-linux-desktop-grown
+[11]: https://github.com/freedesktop/twm
+[12]: http://www.fvwm.org/
+[13]: http://gnome.org
+[14]: http://kde.org
+[15]: https://opensource.com/article/19/1/basic-live-video-streaming-server
+[16]: https://opensource.com/life/15/12/real-time-linux-video-editing-with-obs-studio
+[17]: https://opensource.com/article/19/4/top-moments-linux-history
+[18]: https://opensource.com/how-submit-article
diff --git a/published/20191223 Prioritizing simplicity in your Python code.md b/published/20191223 Prioritizing simplicity in your Python code.md
new file mode 100644
index 0000000000..e0760548c7
--- /dev/null
+++ b/published/20191223 Prioritizing simplicity in your Python code.md
@@ -0,0 +1,63 @@
+[#]: collector: (lujun9972)
+[#]: translator: (caiichenr)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11999-1.html)
+[#]: subject: (Prioritizing simplicity in your Python code)
+[#]: via: (https://opensource.com/article/19/12/zen-python-simplicity-complexity)
+[#]: author: (Moshe Zadka https://opensource.com/users/moshez)
+
+简单是 Python 编程的第一要则
+======
+
+> 本文是 Python 之禅特别系列的第二篇,我们将要关注其中第三与第四条原则:简单与复杂。
+
+![](https://img.linux.net.cn/data/attachment/album/202003/15/124150t4wf3wwgdrijx6xx.jpg)
+
+> "Il semble que la perfection soit atteinte non quand il n'y a plus rien à ajouter, mais quand il n'y plus rien à retrancher."
+>
+> "It seems that perfection is finally attained not when there is no longer anything to add, but when there is no longer anything to take away."
+>
+> “完美并非无可增,而是不可减。”
+>
+> —Antoine de Saint-Exupéry, [Terre des Hommes][2], 1939
+
+编程时最常有的考量是与复杂性的斗争,只想写出让旁人无从下手的繁杂代码,对每个程序员来讲都算不上难事。倘若未能触及代码的简繁取舍,那么 《[Python 之禅][3]》 就有了一角残缺。
+
+### 简单胜过复杂
+
+尚有选择余地时,应该选简单的方案。Python 少有*不可为*之事,这意味着设计出巴洛克风格(LCTT 译注:即夸张和不理性)的程序只为解决浅显的问题不仅有可能,甚至很简单。
+
+正因如此,编程时应当谨记,代码的简单性是最易丢失,却最难复得的。
+
+这意味着,在可以选用函数来表达时不要去引入额外的类;避免使用强力的第三方库往往有助于你针对迫切的问题场景设计更妥当的简短函数。不过其根本的意图,旨在让你减少对将来的盘算,而去着重解决手头的问题。
+
+以简单和优美作为指导原则的代码相比那些想要囊括将来一切变数的,在日后要容易修改得多。
+
+### 复杂胜过错综复杂
+
+把握用词的精确含义对于理解这条令人费解的原则是至关重要的。形容某事复杂,是说它由许多部分组成,着重组成成分之多;而形容某事错综复杂,则是指其包含着差异巨大、难以预料的行为,强调的是各组成部分之间的杂乱联系。
+
+解决困难问题时,往往没有可行的简单方案。此时,最 Python 化的策略是“自底向上”地构建出简单的工具,之后将其组合用以解决该问题。
+
+这正是对象组合这类技术的闪耀之处,它避免了错综复杂的继承体系,转而由独立的对象把一些方法调用传递给别的独立对象。这些对象都能独立地测试与部署,最终却可以组成一体。
+
+“自底建造” 的另一例即是[单分派泛函数][4]的使用,抛弃了错综复杂的对象之后,我们得到是简单、几乎无行为的对象以及独立的行为。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/12/zen-python-simplicity-complexity
+
+作者:[Moshe Zadka][a]
+选题:[lujun9972][b]
+译者:[caiichenr](https://github.com/caiichenr)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/moshez
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/read_book_guide_tutorial_teacher_student_apaper.png?itok=_GOufk6N (Person reading a book and digital copy)
+[2]: https://en.wikipedia.org/wiki/Wind,_Sand_and_Stars
+[3]: https://www.python.org/dev/peps/pep-0020/
+[4]: https://opensource.com/article/19/5/python-singledispatch
diff --git a/published/20191226 10 Linux command tutorials for beginners and experts.md b/published/20191226 10 Linux command tutorials for beginners and experts.md
new file mode 100644
index 0000000000..b9d216695c
--- /dev/null
+++ b/published/20191226 10 Linux command tutorials for beginners and experts.md
@@ -0,0 +1,87 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-12011-1.html)
+[#]: subject: (10 Linux command tutorials for beginners and experts)
+[#]: via: (https://opensource.com/article/19/12/linux-commands)
+[#]: author: (Moshe Zadka https://opensource.com/users/moshez)
+
+10 篇对初学者和专家都有用的 Linux 命令教程
+======
+
+> 在这有关 Linux 命令的十大文章中,了解如何使 Linux 发挥所需的作用。
+
+![](https://img.linux.net.cn/data/attachment/album/202003/19/095932xc64xw7cwqlolale.jpg)
+
+**很好地**使用 Linux 意味着了解有哪些命令以及它们可以为你执行的功能。
+
+### 《在 Linux 命令行下使用“原力”》
+
+原力有光明的一面和黑暗的一面。正确理解这个对于真正掌握它至关重要。Alan Formy-Duval 在他的文章《[在 Linux 命令行下使用“原力”][2]》中,解释了一些流行的、有时是危险的命令的 `-f` 选项(也称为 `--force`)。
+
+### 《Linux useradd 命令介绍》
+
+共享帐户是一个坏主意。相反,请使用典型的 `useradd` 命令为不同的人(甚至是不同的角色)分配单独的帐户。作为其经典的 Linux 管理基础系列的一部分,Alan Formy-Duval 提供了《[Linux useradd 命令介绍][3]》,并且像往常一样,他用**朴实明白的语言**对其进行了解释,以便新老管理员都可以理解。
+
+### 《用 Linux 命令显示硬件信息》
+
+机器**里面**是什么?有时不使用螺丝刀检查硬件很有用。无论是你正在使用的计算机,还是在商店购买前进行测试的计算机、或者是正在尝试维修的计算机,在《[用 Linux 命令显示硬件信息][4]》中,Howard Fosdick 提供了或流行或晦涩难懂的命令,以帮助你深入了解计算机的硬件信息。
+
+### 《如何在 Linux 上使用 gocryptfs 加密文件》
+
+从社会保险号到个人信件再到亲人,我们的文件中包含了许多私人数据。在《[如何在 Linux 上使用 gocryptfs 加密文件][5]》中,Brian "Bex" Exelbierd 解释了如何保持**隐私*的私密性。此外,他展示了一种加密文件的方式,这种方式对你现有的工作流程几乎没有影响。这不是复杂的 PGP 风格的密钥管理和后台密钥代理的难题,这是快速、无缝和安全的文件加密。
+
+### 《如何使用 rsync 的高级用法进行大型备份》
+
+在新的一年中,许多人会下定决心要更加努力地进行备份。Alan Formy-Duval 早在几年前就已经做出了解决方案,因为在《[如何使用 rsync 的高级用法进行大型备份][6]》中,他表现出对文件同步命令的极其熟悉。你可能不会马上记住所有语法,但其思路是读取和处理选项、构造备份命令,然后使其自动化。这是使用 `rsync` 的明智方法,也是可靠地执行备份的**唯一**方法。
+
+### 《在 Linux 命令行使用 more 查看文本文件》
+
+在 Scott Nesbitt 的文章《[在 Linux 命令行使用 more 查看文本文件][7]》中,古老而良好的默认分页器 `more` 引起了人们的关注。许多人安装和使用 `less`,因为它比 `more` 更灵活。但是,随着越来越多的系统在新出现的容器中实现,有时甚至不存在像 `less` 或 `most` 之类的新颖的豪华工具。了解和使用`more` 很简单,这是常见的默认设置,并且是生产系统最后的调试工具。
+
+### 《关于 sudo 你可能不知道的》
+
+`sudo` 命令因其过失而闻名。人们知道 `sudo` 一词,我们大多数人认为我们知道它的作用。我们的观点是正确的,但是正如 Peter Czanik 在他的文章《[关于 sudo 你可能不知道的][8]》中所揭示的那样,该命令所包含的不仅仅是“西蒙说的”(LCTT 译注:国外的一个儿童游戏)。就像这个经典的童年游戏一样,`sudo` 命令功能强大,也容易犯愚蠢的错误 —— 有更多的可能产生可怕都后果,而这是你绝不想遇上的事情!
+
+### 《怎样用 Bash 编程:语法和工具》
+
+如果你是 Linux、BSD 或 Mac(以及近来的 Windows)用户,你也许使用过交互式 Bash shell。它是快速的、一次性命令的绝佳 shell,这就是为什么这么多 Linux 用户喜欢将其用作主要用户界面的原因。但是,Bash 不仅仅是个命令提示符。它也是一种编程语言,如果你已经在使用 Bash 命令,那么自动化的道路从未如此简单过。在 David Both 的出色作品《[怎样用 Bash 编程:语法和工具][9]》中对其进行全面了解。
+
+### 《精通 Linux 的 ls 命令》
+
+`ls` 命令是那些两个字母的命令之一。单字母命令是针对慢速终端的优化,因为慢速终端的输入的每个字母都会导致明显的延迟,而这对于懒惰的打字员来说也是不错的奖励。一如既往地,Seth Kenlon 清晰实用地解释了你可以怎样《[精通 Linux 的 ls 命令][10]》。最重要的是,在“一切都是文件”的系统中,列出文件至关重要。
+
+### 《Linux cat 命令入门》
+
+`cat` 命令(con*cat*enate 的缩写)看似简单。无论是使用它来快速查看文件的内容还是将内容通过管道传输到另一个命令,你都可能没有充分利用 `cat` 的功能。Alan Formy-Duval 的《[Linux cat 命令入门][11]》提供了一些新思路,可以使你没有打开文件的感觉就可以看到文件内容。另外,了解各种有关 `zcat` 的知识,这样你就可以无需解压缩就可以得到压缩文件的内容!这是一件小而简单的事情,但是**这**是使 Linux 很棒的原因。
+
+### 继续旅程
+
+不要让这些关于 Linux 命令的 10 篇最佳文章成为你的旅程终点。关于 Linux 及其多才多艺的提示符,还有更多值得去发现,因此,请继续关注以获取更多知识。而且,如果你想让我们介绍一个 Linux 命令,请在评论中告诉我们。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/12/linux-commands
+
+作者:[Moshe Zadka][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/moshez
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/car-penguin-drive-linux-yellow.png?itok=twWGlYAc (Penguin driving a car with a yellow background)
+[2]: https://linux.cn/article-10881-1.html
+[3]: https://linux.cn/article-11756-1.html
+[4]: https://linux.cn/article-11422-1.html
+[5]: https://opensource.com/article/19/8/how-encrypt-files-gocryptfs
+[6]: https://linux.cn/article-10865-1.html
+[7]: https://linux.cn/article-10531-1.html
+[8]: https://linux.cn/article-11595-1.html
+[9]: https://linux.cn/article-11552-1.html
+[10]: https://linux.cn/article-11159-1.html
+[11]: https://opensource.com/article/19/2/getting-started-cat-command
+[12]: https://opensource.com/how-submit-article
diff --git a/sources/tech/20200113 How to setup a DNS server with bind.md b/published/20200113 How to setup a DNS server with bind.md
similarity index 55%
rename from sources/tech/20200113 How to setup a DNS server with bind.md
rename to published/20200113 How to setup a DNS server with bind.md
index 74cc32e747..356ea4bf8c 100644
--- a/sources/tech/20200113 How to setup a DNS server with bind.md
+++ b/published/20200113 How to setup a DNS server with bind.md
@@ -1,103 +1,103 @@
[#]: collector: (lujun9972)
-[#]: translator: (lxbwolf)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11997-1.html)
[#]: subject: (How to setup a DNS server with bind)
[#]: via: (https://fedoramagazine.org/how-to-setup-a-dns-server-with-bind/)
[#]: author: (Curt Warfield https://fedoramagazine.org/author/rcurtiswarfield/)
-How to setup a DNS server with bind
+简明指南:使用 bind 设置 DNS 服务器
======
![][1]
-The Domain Name System, or DNS, as it’s more commonly known, translates or converts domain names into the IP addresses associated with that domain. DNS is the reason you are able to find your favorite website by name instead of typing an IP address into your browser. This guide shows you how to configure a Master DNS system and one client.
+域名系统,我们更通常称为 DNS 的系统,可以将域名翻译或转换为与该域关联的 IP 地址。DNS 是能够让你通过名称找到自己喜欢的网站而不是在浏览器中输入 IP 地址的原因。本指南将向你展示如何配置一个主 DNS 系统以及客户端。
-Here are system details for the example used in this article:
+以下是本文示例中使用的系统细节:
```
-dns01.fedora.local (192.168.1.160 ) - Master DNS server
-client.fedora.local (192.168.1.136 ) - Client
+dns01.fedora.local (192.168.1.160)- 主 DNS 服务器
+client.fedora.local (192.168.1.136)- 客户端
```
-### DNS server configuration
+### DNS 服务器配置
-Install the bind packages using sudo:
+使用 `sudo` 安装 bind 包:
```
$ sudo dnf install bind bind-utils -y
```
-The _/etc/named.conf_ configuration file is provided by the _bind_ package to allow you to configure the DNS server.
+bind 包提供了 `/etc/named.conf` 配置文件,来供你配置 DNS 服务器。
-Edit the _/etc/named.conf_ file:
+编辑 `/etc/named.conf` 文件:
```
sudo vi /etc/named.conf
```
-Look for the following line:
+查找以下行:
```
listen-on port 53 { 127.0.0.1; };
```
-Add the IP address of your Master DNS server as follows:
+添加主 DNS 服务器的 IP 地址,如下所示:
```
listen-on port 53 { 127.0.0.1; 192.168.1.160; };
```
-Look for the next line:
+查找以下行:
```
allow-query { localhost; };
```
-Add your local network range. The example system uses IP addresses in the 192.168.1.X range. This is specified as follows:
+添加本地网络范围。该示例系统使用的 IP 地址在 192.168.1.X 的范围内。指定如下:
```
allow-query { localhost; 192.168.1.0/24; };
```
-Specify a forward and reverse zone. Zone files are simply text files that have the DNS information, such as IP addresses and host-names, on your system. The forward zone file makes it possible for the translation of a host-name to its IP address. The reverse zone file does the opposite. It allows a remote system to translate an IP address to the host name.
+指定转发和反向区域。区域文件就是具有系统上 DNS 信息(例如 IP 地址和主机名)的文本文件。转发区域文件使得将主机名转换为 IP 地址成为可能。反向区域文件则相反。它允许远程系统将 IP 地址转换为主机名。
-Look for the following line at the bottom of the /etc/named.conf file:
+在 `/etc/named.conf` 文件的底部查找以下行:
```
include "/etc/named.rfc1912.zones";
```
-Here, you’ll specify the zone file information _**directly above that line**_ as follows:
+在此处,你将在**该行的正上方**指定区域文件信息,如下所示:
```
zone "dns01.fedora.local" IN {
-type master;
-file "forward.fedora.local";
-allow-update { none; };
+ type master;
+ file "forward.fedora.local";
+ allow-update { none; };
};
zone "1.168.192.in-addr.arpa" IN {
-type master;
-file "reverse.fedora.local";
-allow-update { none; };
+ type master;
+ file "reverse.fedora.local";
+ allow-update { none; };
};
```
-The _forward.fedora.local_ and the file _reverse.fedora.local_ are just the names of the zone files you will be creating. They can be called anything you like.
+`forward.fedora.local` 和 `reverse.fedora.local` 文件是要创建的区域文件的名称。它们可以是任意名字。
-Save and exit.
+保存并退出。
-#### Create the zone files
+#### 创建区域文件
-Create the forward and reverse zone files you specified in the /etc/named.conf file:
+创建你在 `/etc/named.conf` 文件中指定的转发和反向区域文件:
```
$ sudo vi /var/named/forward.fedora.local
```
-Add the following lines:
+添加以下行:
```
$TTL 86400
@@ -114,13 +114,13 @@ dns01 IN A 192.168.1.160
client IN A 192.168.1.136
```
-Everything in _**bold**_ is specific to your environment. Save the file and exit. Next, edit the _reverse.fedora.local_ file:
+所有**粗体**(LCTT 译注:本译文中无法呈现粗体)内容都特定于你的环境。保存文件并退出。接下来,编辑 `reverse.fedora.local` 文件:
```
$ sudo vi /var/named/reverse.fedora.local
```
-Add the following lines:
+添加以下行:
```
$TTL 86400
@@ -139,9 +139,9 @@ client IN A 192.168.1.136
136 IN PTR client.fedora.local.
```
-Everything in _**bold**_ is also specific to your environment. Save the file and exit.
+所有**粗体**(LCTT 译注:本译文中无法呈现粗体)内容都特定于你的环境。保存文件并退出。
-You’ll also need to configure SELinux and add the correct ownership for the configuration files.
+你还需要配置 SELinux 并为配置文件添加正确的所有权。
```
sudo chgrp named -R /var/named
@@ -150,22 +150,22 @@ sudo restorecon -rv /var/named
sudo restorecon /etc/named.conf
```
-Configure the firewall:
+配置防火墙:
```
sudo firewall-cmd --add-service=dns --perm
sudo firewall-cmd --reload
```
-#### Check the configuration for any syntax errors
+#### 检查配置是否存在语法错误
```
sudo named-checkconf /etc/named.conf
```
-Your configuration is valid if no output or errors are returned.
+如果没有输出或返回错误,那么你的配置有效。
-Check the forward and reverse zone files.
+检查转发和反向区域文件。
```
$ sudo named-checkzone forward.fedora.local /var/named/forward.fedora.local
@@ -173,7 +173,7 @@ $ sudo named-checkzone forward.fedora.local /var/named/forward.fedora.local
$ sudo named-checkzone reverse.fedora.local /var/named/reverse.fedora.local
```
-You should see a response of OK:
+你应该看到 “OK” 的响应:
```
zone forward.fedora.local/IN: loaded serial 2011071001
@@ -183,50 +183,50 @@ zone reverse.fedora.local/IN: loaded serial 2011071001
OK
```
-#### Enable and start the DNS service
+#### 启用并启动 DNS 服务
```
$ sudo systemctl enable named
$ sudo systemctl start named
```
-#### Configuring the resolv.conf file
+#### 配置 resolv.conf 文件
-Edit the _/etc/resolv.conf_ file:
+编辑 `/etc/resolv.conf` 文件:
```
$ sudo vi /etc/resolv.conf
```
-Look for your current name server line or lines. On the example system, a cable modem/router is serving as the name server and so it currently looks like this:
+查找你当前的 `nameserver` 行。在示例系统上,使用调制解调器/路由器充当名称服务器,因此当前看起来像这样:
```
nameserver 192.168.1.1
```
-This needs to be changed to the IP address of the Master DNS server:
+这需要更改为主 DNS 服务器的 IP 地址:
```
nameserver 192.168.1.160
```
-Save your changes and exit.
+保存更改并退出。
-Unfortunately there is one caveat to be aware of. NetworkManager overwrites the _/etc/resolv.conf_ file if the system is rebooted or networking gets restarted. This means you will lose all of the changes that you made.
+不幸的是需要注意一点。如果系统重启或网络重启,那么 NetworkManager 会覆盖 `/etc/resolv.conf` 文件。这意味着你将丢失所做的所有更改。
-To prevent this from happening, make _/etc/resolv.conf_ immutable:
+为了防止这种情况发生,请将 `/etc/resolv.conf` 设为不可变:
```
$ sudo chattr +i /etc/resolv.conf
```
-If you want to set it back and allow it to be overwritten again:
+如果要重新设置,就需要允许其再次被覆盖:
```
$ sudo chattr -i /etc/resolv.conf
```
-#### Testing the DNS server
+#### 测试 DNS 服务器
```
$ dig fedoramagazine.org
@@ -266,27 +266,27 @@ $ dig fedoramagazine.org
;; MSG SIZE rcvd: 266
```
-There are a few things to look at to verify that the DNS server is working correctly. Obviously getting the results back are important, but that by itself doesn’t mean the DNS server is actually doing the work.
+需要检查几件事以验证 DNS 服务器是否正常运行。显然,取得结果很重要,但这本身并不意味着 DNS 服务器实际上正常工作。
-The QUERY, ANSWER, and AUTHORITY fields at the top should show non-zero as it in does in our example:
+顶部的 `QUERY`、`ANSWER` 和 `AUTHORITY` 字段应显示为非零,如我们的示例所示:
```
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 6
```
-And the SERVER field should have the IP address of your DNS server:
+并且 `SERVER` 字段应有你的 DNS 服务器的 IP 地址:
```
;; SERVER: 192.168.1.160#53(192.168.1.160)
```
-In case this is the first time you’ve run the _dig_ command, notice how it took 830 milliseconds for the query to complete:
+如果这是你第一次运行 `dig` 命令,请注意完成查询要花费 830 毫秒的时间:
```
;; Query time: 830 msec
```
-If you run it again, the query will run much quicker:
+如果再次运行它,查询将会更快:
```
$ dig fedoramagazine.org
@@ -297,37 +297,37 @@ $ dig fedoramagazine.org
;; SERVER: 192.168.1.160#53(192.168.1.160)
```
-### Client configuration
+### 客户端配置
-The client configuration will be a lot simpler.
+客户端配置将简单得多。
-Install the bind utilities:
+安装 bind 程序:
```
$ sudo dnf install bind-utils -y
```
-Edit the /etc/resolv.conf file and configure the Master DNS as the only name server:
+编辑 `/etc/resolv.conf` 文件,并将主 DNS 配置为唯一的名称服务器:
```
$ sudo vi /etc/resolv.conf
```
-This is how it should look:
+它看起来像这样:
```
nameserver 192.168.1.160
```
-Save your changes and exit. Then, make the _/etc/resolv.conf_ file immutable to prevent it from be overwritten and going back to its default settings:
+保存更改并退出。然后,使 `/etc/resolv.conf` 文件不可变,防止其被覆盖并变回默认设置:
```
$ sudo chattr +i /etc/resolv.conf
```
-#### Testing the client
+#### 测试客户端
-You should get the same results as you did from the DNS server:
+你应该获得与 DNS 服务器相同的结果:
```
$ dig fedoramagazine.org
@@ -367,9 +367,9 @@ $ dig fedoramagazine.org
;; MSG SIZE rcvd: 266
```
-Make sure the SERVER output has the IP Address of your DNS server.
+确保 `SERVER` 输出的是你 DNS 服务器的 IP 地址。
-Your DNS server is now ready to use and all requests from the client should be going through your DNS server now!
+你的 DNS 服务器设置完成了,现在所有来自客户端的请求都会经过你的 DNS 服务器了!
--------------------------------------------------------------------------------
@@ -377,8 +377,8 @@ via: https://fedoramagazine.org/how-to-setup-a-dns-server-with-bind/
作者:[Curt Warfield][a]
选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/translated/tech/20200121 Syncthing- Open Source P2P File Syncing Tool.md b/published/20200121 Syncthing- Open Source P2P File Syncing Tool.md
similarity index 86%
rename from translated/tech/20200121 Syncthing- Open Source P2P File Syncing Tool.md
rename to published/20200121 Syncthing- Open Source P2P File Syncing Tool.md
index 013a3569a4..383fc2f351 100644
--- a/translated/tech/20200121 Syncthing- Open Source P2P File Syncing Tool.md
+++ b/published/20200121 Syncthing- Open Source P2P File Syncing Tool.md
@@ -1,8 +1,8 @@
[#]: collector: (lujun9972)
[#]: translator: (geekpi)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11960-1.html)
[#]: subject: (Syncthing: Open Source P2P File Syncing Tool)
[#]: via: (https://itsfoss.com/syncthing/)
[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
@@ -10,11 +10,11 @@
Syncthing:开源 P2P 文件同步工具
======
-_ **简介:Syncthing 是一个开源的 P2P 文件同步工具,可用于在多个设备(包括 Android 手机)之间同步文件。** _
+> Syncthing 是一个开源的 P2P 文件同步工具,可用于在多个设备(包括 Android 手机)之间同步文件。
-通常,我们有 [MEGA][1] 或 Dropbox 之类的云同步解决方案,以便在云上备份我们的文件,同时更易于共享。
+![](https://img.linux.net.cn/data/attachment/album/202003/05/094211oy2dosttvoaseovk.jpg)
-但是,如果要跨多个设备同步文件而不将其存储在云中怎么办?
+通常,我们有 [MEGA][1] 或 Dropbox 之类的云同步解决方案,以便在云上备份我们的文件,同时更易于共享。但是,如果要跨多个设备同步文件而不将其存储在云中怎么办?
这就是 [Syncthing][2] 派上用场的地方了。
@@ -22,7 +22,7 @@ _ **简介:Syncthing 是一个开源的 P2P 文件同步工具,可用于在
![][3]
-Syncthing 可让你跨多个设备同步文件(包括对 Android 智能手机的支持)。它主要通过 Linux上 的 Web UI 进行工作,但也提供了 GUI(需要单独安装)。
+Syncthing 可让你跨多个设备同步文件(包括对 Android 智能手机的支持)。它主要通过 Linux 上的 Web UI 进行工作,但也提供了 GUI(需要单独安装)。
然而,Syncthing 完全没有利用云,它是 [P2P][4] 文件同步工具。你的数据不会被发送到中央服务器。而是会在所有设备之间同步。因此,它并不能真正取代 [Linux 上的典型云存储服务][5]。
@@ -36,7 +36,7 @@ Syncthing 可让你跨多个设备同步文件(包括对 Android 智能手机
例如,你可能不想在云上存储一些敏感文件,因此你可以添加其他受信任的设备来同步并保留这些文件的副本。
-即使我简单描述了它,但它并不像看到的那么简单。如果你感兴趣的话,我建议你阅读[官方 FAQ][7] 来了解它如何工作的。
+即使我对它的描述很简单,但它并不像看到的那么简单。如果你感兴趣的话,我建议你阅读[官方 FAQ][7] 来了解它如何工作的。
### Syncthing 的特性
@@ -90,15 +90,15 @@ Syncthing 确实非常简单且易于理解。即使这样,如果你想使用
你可能无法在软件中心找到它(如果你找到了,那它可能不是最新版本)。
-**注意:**_如果你需要一个 GUI 而不是浏览器来管理它,它还有一个 [Syncthing-GTK][16]。_
+**注意:**如果你需要一个 GUI 应用而不是浏览器来管理它,它还有一个 [Syncthing-GTK][16]。
-[Syncthing][2]
+- [Syncthing][2]
-如果你有基于 Debian 的发行版,你也可以利用终端来安装它,这些说明位于[官方下载页面][17] 上。
+如果你有基于 Debian 的发行版,你也可以利用终端来安装它,这些说明位于[官方下载页面][17]上。
### 我在 Syncthing 方面的体验
-就个人而言,我把它安装在 Pop!\_OS 19.10 上,并在写这篇文章之前用了一会儿。
+就个人而言,我把它安装在 Pop!_OS 19.10 上,并在写这篇文章之前用了一会儿。
我尝试同步文件夹、删除它们、添加重复文件以查看文件版本控制是否工作,等等。它工作良好。
@@ -108,7 +108,7 @@ Syncthing 确实非常简单且易于理解。即使这样,如果你想使用
总体而言,它工作良好,但我必须说,你不应该依赖它作为唯一的数据备份方案。
-**总结**
+### 总结
你试过 Syncthing 了吗?如果有的话,你的体验如何?欢迎在下面的评论中分享。
@@ -121,7 +121,7 @@ via: https://itsfoss.com/syncthing/
作者:[Ankush Das][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/20200123 6 things you should be doing with Emacs.md b/published/20200123 6 things you should be doing with Emacs.md
new file mode 100644
index 0000000000..27dfd5bb49
--- /dev/null
+++ b/published/20200123 6 things you should be doing with Emacs.md
@@ -0,0 +1,142 @@
+[#]: collector: (lujun9972)
+[#]: translator: (lujun9972)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-12004-1.html)
+[#]: subject: (6 things you should be doing with Emacs)
+[#]: via: (https://opensource.com/article/20/1/emacs-cheat-sheet)
+[#]: author: (Seth Kenlon https://opensource.com/users/seth)
+
+6 件你应该用 Emacs 做的事
+======
+
+> 下面六件事情你可能都没有意识到可以在 Emacs 下完成。此外还有我们的新备忘单,拿去,充分利用 Emacs 的功能吧。
+
+![](https://img.linux.net.cn/data/attachment/album/202003/17/133738wjj66p2safcpc50z.jpg)
+
+想象一下使用 Python 的 IDLE 界面来编辑文本。你可以将文件加载到内存中,编辑它们,并保存更改。但是你执行的每个操作都由 Python 函数定义。例如,调用 `upper()` 来让一个单词全部大写,调用 `open` 打开文件,等等。文本文档中的所有内容都是 Python 对象,可以进行相应的操作。从用户的角度来看,这与其他文本编辑器的体验一致。对于 Python 开发人员来说,这是一个丰富的 Python 环境,只需在配置文件中添加几个自定义函数就可以对其进行更改和开发。
+
+这就是 [Emacs][2] 对 1958 年的编程语言 [Lisp][3] 所做的事情。在 Emacs 中,运行应用程序的 Lisp 引擎与输入文本之间无缝结合。对 Emacs 来说,一切都是 Lisp 数据,因此一切都可以通过编程进行分析和操作。
+
+这造就了一个强大的用户界面(UI)。但是,如果你是 Emacs 的普通用户,你可能对它的能力知之甚少。下面是你可能没有意识到 Emacs 可以做的六件事。
+
+### 使用 Tramp 模式进行云端编辑
+
+Emacs 早在网络流行化之前就实现了透明的网络编辑能力了,而且时至今日,它仍然提供了最流畅的远程编辑体验。Emacs 中的 [Tramp 模式][4](以前称为 RPC 模式)代表着 “透明的远程(文件)访问,多协议”,这准确说明了它提供的功能:通过最流行的网络协议轻松访问你希望编辑的远程文件。目前最流行、最安全的能用于远程编辑的协议是 [OpenSSH][5],因此 Tramp 使用它作为默认的协议。
+
+在 Emacs 22.1 或更高版本中已经包含了 Tramp,因此要使用 Tramp,只需使用 Tramp 语法打开一个文件。在 Emacs 的 “File” 菜单中,选择 “Open File”。当在 Emacs 窗口底部的小缓冲区中出现提示时,使用以下语法输入文件名:
+
+```
+/ssh:user@example.com:/path/to/file
+```
+
+如果需要交互式登录,Tramp 会提示你输入密码。但是,Tramp 直接使用 OpenSSH,所以为了避免交互提示,你可以将主机名、用户名和 SSH 密钥路径添加到你的 `~/.ssh/config` 文件。与 Git 一样,Emacs 首先使用你的 SSH 配置,只有在出现错误时才会停下来询问更多信息。
+
+Tramp 非常适合编辑并没有放在你的计算机上的文件,它的用户体验与编辑本地文件没有明显的区别。下次,当你 SSH 到服务器启动 Vim 或 Emacs 会话时,请尝试使用 Tramp。
+
+### 日历
+
+如果你喜欢文本多过图形界面,那么你一定会很高兴地知道,可以使用 Emacs 以纯文本的方式安排你的日程(或生活),而且你依然可以在移动设备上使用开源的 [Org 模式][6]查看器来获得华丽的通知。
+
+这个过程需要一些配置,以创建一个方便的方式来与移动设备同步你的日程(我使用 Git,但你可以调用蓝牙、KDE Connect、Nextcloud,或其他文件同步工具),此外你必须在移动设备上安装一个 Org 模式查看器(如 [Orgzly][7])以及 Git 客户程序。但是,一旦你搭建好了这些基础,该流程就会与你常用的(或正在完善的,如果你是新用户)Emacs 工作流完美地集成在一起。你可以在 Emacs 中方便地查阅日程、更新日程,并专注于任务上。议程上的变化将会反映在移动设备上,因此即使在 Emacs 不可用的时候,你也可以保持井然有序。
+
+![][8]
+
+感兴趣了?阅读我的关于[使用 Org mode 和 Git 进行日程安排][9]的逐步指南。
+
+### 访问终端
+
+有[许多终端模拟器][10]可用。尽管 Emacs 中的 Elisp 终端仿真器不是最强大的通用仿真器,但是它有两个显著的优点:
+
+1. **打开在 Emacs 缓冲区之中**:我使用 Emacs 的 Elisp shell,因为它在 Emacs 窗口中打开很方便,我经常全屏运行该窗口。这是一个小而重要的优势,只需要输入 `Ctrl+x+o`(或用 Emacs 符号来表示就是 `C-x o`)就能使用终端了,而且它还有一个特别好的地方在于当运行漫长的作业时能够一瞥它的状态报告。
+2. **在没有系统剪贴板的情况下复制和粘贴特别方便**:无论是因为懒惰不愿将手从键盘移动到鼠标,还是因为在远程控制台运行 Emacs 而无法使用鼠标,在 Emacs 中运行终端有时意味着可以从 Emacs 缓冲区中很快地传输数据到 Bash。
+
+要尝试 Emacs 终端,输入 `Alt+x`(用 Emacs 符号表示就是 `M-x`),然后输入 `shell`,然后按回车。
+
+### 使用 Racket 模式
+
+[Racket][11] 是一种激动人心的新兴 Lisp 方言,拥有动态编程环境、GUI 工具包和充满激情的社区。学习 Racket 的默认编辑器是 DrRacket,它的顶部是定义面板,底部是交互面板。使用该设置,用户可以编写影响 Racket 运行时环境的定义。就像旧的 [Logo Turtle][12] 程序,但是有一个终端而不是仅仅一个海龟。
+
+![Racket-mode][13]
+
+*由 PLT 提供的 LGPL 示例代码*
+
+基于 Lisp 的 Emacs 为资深 Racket 编程人员提供了一个很好的集成开发环境(IDE)。它尚未附带 [Racket 模式][14],但你可以使用 Emacs 包安装程序安装 Racket 模式和辅助扩展。要安装它,按下 `Alt+X`(用 Emacs 符号表示就是 `M-x`),键入 `package-install`,然后按回车。接着输入要安装的包 `racet-mode`,按回车。
+
+使用 `M-x racket-mode` 进入 Racket 模式。如果你是 Racket 新手,而对 Lisp 或 Emacs 比较熟悉,可以从这份优秀的[图解 Racket][15] 入手。
+
+## 脚本
+
+你可能知道,Bash 脚本在自动化和增强 Linux 或 Unix 体验方面很流行。你可能听说过 Python 在这方面也做得很好。但是你知道 Lisp 脚本可以用同样的方式运行吗?有时人们会对 Lisp 到底有多有用感到困惑,因为许多人是通过 Emacs 来了解 Lisp 的,因此有一种潜在的印象,即在 21 世纪运行 Lisp 的惟一方法是在 Emacs 中运行。幸运的是,事实并非如此,Emacs 是一个很好的 IDE,它支持将 Lisp 脚本作为一般的系统可执行文件来运行。
+
+除了 Elisp 之外,还有两种流行的现代 Lisp 可以很容易地用来作为独立脚本运行。
+
+1. **Racket**:你可以通过在系统上运行 Racket 来提供运行 Racket 脚本所需的运行时支持,或者你可以使用 `raco exe` 产生一个可执行文件。`raco exe` 命令将代码和运行时支持文件一起打包,以创建可执行文件。然后,`raco distribution` 命令将可执行文件打包成可以在其他机器上工作的发行版。Emacs 有许多 Racket 工具,因此在 Emacs 中创建 Racket 文件既简单又有效。
+2. **GNU Guile**:[GNU Guile][16](GNU 通用智能语言扩展 的缩写)是 [Scheme][17] 编程语言的一个实现,它可以用于为桌面、互联网、终端等创建应用程序和游戏。Emacs 中的 Scheme 扩展众多,使用任何一个扩展来编写 Scheme 都很容易。例如,这里有一个用 Guile 编写的 “Hello world” 脚本:
+
+```
+#!/usr/bin/guile -s
+!#
+
+(display "hello world")
+ (newline)
+```
+
+用 `guile` 编译并允许它:
+
+```
+$ guile ./hello.scheme
+;;; compiling /home/seth/./hello.scheme
+;;; compiled [...]/hello.scheme.go
+hello world
+$ guile ./hello.scheme
+hello world
+```
+
+### 无需 Emacs 允许 Elisp
+
+Emacs 可以作为 Elisp 的运行环境,但是你无需按照传统印象中的必须打开 Emacs 来运行 Elisp。`--script` 选项可以让你使用 Emacs 作为引擎来执行 Elisp 脚本,而无需运行 Emacs 图形界面(甚至也无需使用终端)。下面这个例子中,`-Q` 选项让 Emacs 忽略 `.emacs` 文件,从而避免由于执行 Elisp 脚本时产生延迟(若你的脚本依赖于 Emacs 配置中的内容,那么请忽略该选项)。
+
+```
+emacs -Q --script ~/path/to/script.el
+```
+
+### 下载 Emacs 备忘录
+
+Emacs 许多重要功能都不是只能通过 Emacs 来实现的;Org 模式是 Emacs 扩展也是一种格式标准,流行的 Lisp 方言大多不依赖于具体的应用,我们甚至可以在没有可见或可交互式 Emacs 实例的情况下编写和运行 Elisp。然后若你对为什么模糊代码和数据之间的界限能够引发创新和效率感到好奇的话,那么 Emacs 是一个很棒的工具。
+
+幸运的是,现在是 21 世纪,Emacs 有了带有传统菜单的图形界面以及大量的文档,因此学习曲线不再像以前那样。然而,要最大化 Emacs 对你的好处,你需要学习它的快捷键。由于 Emacs 支持的每个任务都是一个 Elisp 函数,Emacs 中的任何功能都可以对应一个快捷键,因此要描述所有这些快捷键是不可能完成的任务。你只要学习使用频率 10 倍于不常用功能的那些快捷键即可。
+
+我们汇聚了最常用的 Emacs 快捷键成为一份 Emacs 备忘录以便你查询。将它挂在屏幕附近或办公室墙上,把它作为鼠标垫也行。让它触手可及经常翻阅一下。每次翻两下可以让你获得十倍的学习效率。而且一旦开始编写自己的函数,你一定不会后悔获取了这个免费的备忘录副本的!
+
+- [这里下载 Emacs 备忘录(需注册)](https://opensource.com/downloads/emacs-cheat-sheet)
+
+--------------------------------------------------------------------------------
+via: https://opensource.com/article/20/1/emacs-cheat-sheet
+
+作者:[Seth Kenlon][a]
+选题:[lujun9972][b]
+译者:[lujun9972](https://github.com/lujun9972)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/seth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_blue_text_editor_web.png
+[2]: https://www.gnu.org/software/emacs/
+[3]: https://en.wikipedia.org/wiki/Lisp_(programming_language)
+[4]: https://www.gnu.org/software/tramp/
+[5]: https://www.openssh.com/
+[6]: https://orgmode.org/
+[7]: https://f-droid.org/en/packages/com.orgzly/
+[8]: https://opensource.com/sites/default/files/uploads/orgzly-agenda.jpg
+[9]: https://linux.cn/article-11320-1.html
+[10]: https://linux.cn/article-11814-1.html
+[11]: http://racket-lang.org/
+[12]: https://en.wikipedia.org/wiki/Logo_(programming_language)#Turtle_and_graphics
+[13]: https://opensource.com/sites/default/files/racket-mode.jpg
+[14]: https://www.racket-mode.com/
+[15]: https://docs.racket-lang.org/quick/index.html
+[16]: https://www.gnu.org/software/guile/
+[17]: https://en.wikipedia.org/wiki/Scheme_(programming_language)
diff --git a/sources/tech/20200127 Build your own cloud with Fedora 31 and Nextcloud Server.md b/published/20200127 Build your own cloud with Fedora 31 and Nextcloud Server.md
similarity index 62%
rename from sources/tech/20200127 Build your own cloud with Fedora 31 and Nextcloud Server.md
rename to published/20200127 Build your own cloud with Fedora 31 and Nextcloud Server.md
index 5aa4ee5023..295e111690 100644
--- a/sources/tech/20200127 Build your own cloud with Fedora 31 and Nextcloud Server.md
+++ b/published/20200127 Build your own cloud with Fedora 31 and Nextcloud Server.md
@@ -1,63 +1,63 @@
[#]: collector: (lujun9972)
[#]: translator: (geekpi)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11964-1.html)
[#]: subject: (Build your own cloud with Fedora 31 and Nextcloud Server)
[#]: via: (https://fedoramagazine.org/build-your-own-cloud-with-fedora-31-and-nextcloud-server/)
[#]: author: (storyteller https://fedoramagazine.org/author/storyteller/)
-Build your own cloud with Fedora 31 and Nextcloud Server
+使用 Fedora 31 和 Nextcloud 服务器构建自己的云
======
![][1]
-[Nextcloud][2] is a software suite for storing and syncing your data across multiple devices. You can learn more about Nextcloud Server’s features from [https://github.com/nextcloud/server][3].
+[Nextcloud][2] 是用于跨多个设备存储和同步数据的软件套件。你可以从 [https://github.com/nextcloud/server][3] 了解有关 Nextcloud 服务器的更多特性信息。
-This article demonstrates how to build a personal cloud using Fedora and Nextcloud in a few simple steps. For this tutorial you will need a dedicated computer or a virtual machine running Fedora 31 server edition and an internet connection.
+本文通过几个简单的步骤演示了如何使用 Fedora 和 Nextcloud 构建个人云。对于本教程,你将需要一台独立计算机或运行 Fedora 31 服务器版的虚拟机,还需要互联网连接。
-### Step 1: Install the prerequisites
+### 步骤 1:预先安装条件
-Before installing and configuring Nextcloud, a few prerequisites must be satisfied.
+在安装和配置 Nextcloud 之前,必须满足一些预先条件。
-First, install Apache web server:
+首先,安装 Apache Web 服务器:
```
# dnf install httpd
```
-Next, install PHP and some additional modules. Make sure that the PHP version being installed meets [Nextcloud’s requirements][4]:
+接下来,安装 PHP 和一些其他模块。确保所安装的 PHP 版本符合 [Nextcloud 的要求][4]:
```
# dnf install php php-gd php-mbstring php-intl php-pecl-apcu php-mysqlnd php-pecl-redis php-opcache php-imagick php-zip php-process
```
-After PHP is installed enable and start the Apache web server:
+安装 PHP 后,启用并启动 Apache Web 服务器:
```
# systemctl enable --now httpd
```
-Next, allow _HTTP_ traffic through the firewall:
+接下来,允许 HTTP 流量穿过防火墙:
```
# firewall-cmd --permanent --add-service=http
# firewall-cmd --reload
```
-Next, install the MariaDB server and client:
+接下来,安装 MariaDB 服务器和客户端:
```
# dnf install mariadb mariadb-server
```
-Then enable and start the MariaDB server:
+然后启用并启动 MariaDB 服务器
```
# systemctl enable --now mariadb
```
-Now that MariaDB is running on your server, you can run the _mysql_secure_installation_ command to secure it:
+现在,MariaDB 正在运行,你可以运行 `mysql_secure_installation` 命令来保护它:
```
# mysql_secure_installation
@@ -128,7 +128,7 @@ MariaDB installation should now be secure.
Thanks for using MariaDB!
```
-Next, create a dedicated user and database for your Nextcloud instance:
+接下来,为你的 Nextcloud 实例创建独立的用户和数据库:
```
# mysql -p
@@ -139,23 +139,23 @@ Next, create a dedicated user and database for your Nextcloud instance:
> exit;
```
-### Step 2: Install Nextcloud Server
+### 步骤 2:安装 Nextcloud 服务器
-Now that the prerequisites for your Nextcloud installation have been satisfied, download and unzip [the Nextcloud archive][5]:
+现在,你已满足 Nextcloud 安装的预先条件,请下载并解压 [Nextcloud 压缩包][5]:
```
# wget https://download.nextcloud.com/server/releases/nextcloud-17.0.2.zip
# unzip nextcloud-17.0.2.zip -d /var/www/html/
```
-Next, create a data folder and grant Apache read and write access to the _nextcloud_ directory tree:
+接下来,创建一个数据文件夹,并授予 Apache 对 `nextcloud` 目录树的读写访问权限:
```
# mkdir /var/www/html/nextcloud/data
# chown -R apache:apache /var/www/html/nextcloud
```
-SELinux must be configured to work with Nextcloud. The basic commands are those bellow, but a lot more, by features used on nexcloud installation, are posted here: [Nextcloud SELinux configuration][6]
+SELinux 必须配置为可与 Nextcloud 一起使用。基本命令如下所示,但在 nexcloud 安装中还有很多其他的命令,发布在这里:[Nextcloud SELinux 配置][6]。
```
# semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/nextcloud/config(/.*)?'
@@ -166,34 +166,32 @@ SELinux must be configured to work with Nextcloud. The basic commands are those
# restorecon -Rv '/var/www/html/nextcloud/'
```
-### Step 3: Configure N**extclou**d
+### 步骤 3:配置 Nextcloud
-Nextcloud can be configured using its web interface or from the command line.
+可以使用它的 Web 界面或在命令行配置 Nextcloud。
-#### Using the web interface
+#### 使用 Web 界面
-From your favorite browser, access __ and fill the fields:
+在你喜欢的浏览器中,访问 并输入字段:
![][7]
-#### Using the command line
+#### 使用命令行
-From the command line, just enter the following, substituting the values you used when you created a dedicated Nextcloud user in MariaDB earlier:
+在命令行中,只需输入以下内容,使用你之前在 MariaDB 中创建的独立 Nextcloud 用户替换相应的值:
```
# sudo -u apache php occ maintenance:install --data-dir /var/www/html/nextcloud/data/ --database "mysql" --database-name "nextcloud" --database-user "nc_admin" --database-pass "DB_SeCuRe_PaSsWoRd" --admin-user "admin" --admin-pass "Admin_SeCuRe_PaSsWoRd"
```
-### Final Notes
+### 最后几点
- * I used the _http_ protocol, but Nextcloud also works over _https_. I might write a follow-up about securing Nextcloud in a future article.
- * I disabled SELinux, but your server will be more secure if you configure it.
- * The recommend PHP memory limit for Nextcloud is 512M. To change it, edit the _memory_limit_ variable in the _/etc/php.ini_ configuration file and restart your _httpd_ service.
- * By default, the web interface can only be accessed using the __ URL. If you want to allow access using other domain names, [you can do so by editing the _/var/www/html/nextcloud/config/config.php_ file][8]. The * character can be used to bypass the domain name restriction and allow the use of any URL that resolves to one of your server’s IP addresses.
+* 我使用的是 http 协议,但是 Nextcloud 也可以在 https 上运行。我可能会在以后的文章中写一篇有关保护 Nextcloud 的文章。
+* 我禁用了 SELinux,但是如果配置它,你的服务器将更加安全。
+* Nextcloud 的建议 PHP 内存限制为 512M。要更改它,请编辑 `/etc/php.ini` 配置文件中的 `memory_limit` 变量,然后重新启动 httpd 服务。
+* 默认情况下,只能使用 URL 访问 Web 界面。如果要允许使用其他域名访问,[你可编辑 /var/www/html/nextcloud/config/config.php 来进行此操作][8]。`*` 字符可用于绕过域名限制,并允许任何解析为服务器 IP 的 URL 访问。
-
-
-```
+ ```
'trusted_domains' =>
array (
0 => 'localhost',
@@ -201,16 +199,14 @@ From the command line, just enter the following, substituting the values you use
),
```
-_— Updated on January 28th, 2020 to include SELinux configuration —_
-
--------------------------------------------------------------------------------
via: https://fedoramagazine.org/build-your-own-cloud-with-fedora-31-and-nextcloud-server/
作者:[storyteller][a]
选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/published/20200129 Use Emacs to get social and track your todo list.md b/published/20200129 Use Emacs to get social and track your todo list.md
new file mode 100644
index 0000000000..0d7bbc42c5
--- /dev/null
+++ b/published/20200129 Use Emacs to get social and track your todo list.md
@@ -0,0 +1,163 @@
+[#]: collector: (lujun9972)
+[#]: translator: (lujun9972)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11956-1.html)
+[#]: subject: (Use Emacs to get social and track your todo list)
+[#]: via: (https://opensource.com/article/20/1/emacs-social-track-todo-list)
+[#]: author: (Kevin Sonney https://opensource.com/users/ksonney)
+
+使用 Emacs 进行社交并跟踪你的待办事项列表
+======
+
+> 在 2020 年用开源实现更高生产力的二十种方式的第十九篇文章中,访问 Twitter、Reddit、 交谈、电子邮件 、RSS 和你的待办事项列表。
+
+![](https://img.linux.net.cn/data/attachment/album/202003/04/100911lg2vrv92692b422y.jpg)
+
+去年,我在 19 天里给你介绍了 19 个新(对你而言)的生产力工具。今年,我换了一种方式:使用你在使用或者还没使用的工具,构建一个使你可以在新一年更加高效的环境。
+
+### 使用 Emacs 做(几乎)所有的事情,第 2 部分
+
+[昨天][2],我谈到了如何在 Emacs 中读取电子邮件、访问电子邮件地址和显示日历。Emacs 功能繁多,你还可以将它用于 Twitter、交谈、待办事项列表等等!
+
+![在 Emacs 中处理所有事情][3]
+
+要完成所有这些,你需要安装一些 Emacs 包。和昨天一样,用 `Meta+x package-manager` 打开 Emacs 包管理器(Meta 键在大多数键盘上是 `Alt`,在 MacOS 上是 `Option`)。然后通过 `i` 选择以下带有的软件包,然后输入 `x` 进行安装:
+
+```
+nnreddit
+todotxt
+twittering-mode
+```
+
+安装之后,按下 `Ctrl+x ctrl+f` 打开 `~/.emacs.d/init.el`,并在 `(custom-set-variables` 行前加上:
+
+```
+;; Todo.txt
+(require 'todotxt)
+(setq todotxt-file (expand-file-name "~/.todo/todo.txt"))
+
+;; Twitter
+(require 'twittering-mode)
+(setq twittering-use-master-password t)
+(setq twittering-icon-mode t)
+
+;; Python3 for nnreddit
+(setq elpy-rpc-python-command "python3")
+```
+
+按下 `Ctrl+x Ctrl+s` 保存文件,使用 `Ctrl+x Ctrl+c` 退出 Emacs,然后重启 Emacs。
+
+#### 使用 twittering-mode 在 Emacs 中发推
+
+![Emacs 中的 Twitter][4]
+
+[Twittering-mode][5] 是 Twitter 最好的 Emacs 接口之一。它几乎支持 Twitter 的所有功能,并且键盘快捷键也易于使用。
+
+首先,输入 `Meta+x twit` 来启动 twittering-mode。它会提供一个 URL 并提示你启动浏览器来访问它,你登录该 URL 后就能获得授权令牌。将令牌复制并粘贴到 Emacs 中,你的 Twitter 时间线就会加载了。你可以使用箭头键滚动,使用 `Tab` 从一个项目移动到另一个项目,并按回车访问光标所在的 URL。如果光标在用户名上,按回车将在 web 浏览器中打开时间轴。如果你在一条推文的文本上,按回车将回复该推文。你可以用 `u` 创建一个新的推文,用 `Ctrl+c+Enter` 转发一些内容,然后用 `d` 发送一条即时消息——它打开的对话框中有关于如何发送、取消和缩短 URL 的说明。
+
+按 `V` 会打开一个提示让你跳转到其他时间线。输入 `:mentions` 打开你的提及。输入 `:home` 打开你的主时间线,输入用户名将进入该用户的时间线。最后,按 `q` 会退出 twittering-mode 并关闭窗口。
+
+twitter-mode 还有更多功能,我鼓励你阅读它 GitHub 页面上的[完整功能列表][6]。
+
+#### 在 Emacs 上使用 Todotxt.el 追踪你的待办事项
+
+![Emacs 中的 todo.txt][7]
+
+[Todotxt.el][8] 是一个很棒的 [todo.txt][9] 待办列表管理器接口。它的快捷键几乎无所不包。
+
+输入 `Meta+x todotxt` 启动它将加载 `todotxt-file` 变量中指定的 `todo.txt` 文件(本文的第一部分中设置了该文件)。在 `todo.txt` 的缓冲区(窗口),你可以按 `a` 添加新任务并和按 `c` 标记它已被完成。你还可以使用 `r` 设置优先级,并使用 `t` 添加项目和上下文。完成事项后只需要按下 `A` 即可将任务移如 `done.txt`。你可以使用 `/` 过滤列表,也可以使用 `l` 刷新完整列表。同样,你可以按 `q` 退出。
+
+#### 在 Emacs 中使用 ERC 进行交谈
+
+![使用 ERC 与人交谈 ][10]
+
+Vim 的缺点之一是很难用它与人交谈。另一方面,Emacs 则将 [ERC][11] 客户端内置到默认发行版中。使用 `Meta+x ERC` 启动 ERC,系统将提示你输入服务器、用户名和密码。你可以使用几天前介绍设置 [BitlBee][12] 时使用的相同信息:服务器为 `localhost`,端口为 `6667`,相同用户名,无需密码。
+
+ERC 使用起来与其他 IRC 客户端一样。每个频道单独一个缓冲区(窗口),你可以使用 `Ctrl+x ctrl+b` 进行频道间切换,这也可以在 Emacs 中的其他缓冲区之间进行切换。`/quit` 命令将退出 ERC。
+
+#### 使用 Gnus 阅读电子邮件,Reddit 和 RSS
+
+![Mail,Reddit,and RSS feeds with Gnus][13]
+
+我相信昨天在我提及在 Emacs 中阅读邮件时,许多 Emacs 的老用户会问,“怎么没有 [Gnus][14] 呢?”
+
+这个疑问很合理。Gnus 是一个内置在 Emacs 中的邮件和新闻阅读器,尽管它这个邮件阅读器不支持以 [Notmuch][15] 作为搜索引擎。但是,如果你将其配置来阅读 Reddit 和 RSS feed(稍后你将这样做),那么同时使用它来阅读邮件是个聪明的选择。
+
+Gnus 是为阅读 Usenet 新闻而创建的,并从此发展而来。因此,它的很多外观和感觉(以及术语)看起来很像 Usenet 的新闻阅读器。
+
+Gnus 以 `~/.gnus` 作为自己的配置文件。(该配置也可以包含在 `~/.emacs.d/init.el` 中)。使用 `Ctrl+x Ctrl+f` 打开 `~/.gnus`,并添加以下内容:
+
+
+```
+;; Required packages
+(require 'nnir)
+(require 'nnrss)
+
+;; Primary Mailbox
+(setq gnus-select-method
+ '(nnmaildir "Local"
+ (directory "~/Maildir")
+ (nnir-search-engine notmuch)
+ ))
+(add-to-list 'gnus-secondary-select-methods
+ '(nnreddit ""))
+```
+
+用 `Ctrl+x Ctrl+s` 保存文件。这分配置告诉 Gnus 从 `~/Maildir` 这个本地邮箱中读取邮件作为主源(参见 `gnus-select-method` 变量),并使用 [nnreddit][16] 插件添加辅源(`gnus-secondary-select-methods` 变量)。你还可以定义多个辅助源,包括 Usenet 新闻(nntp)、IMAP (nnimap)、mbox(nnmbox)和虚拟集合(nnvirtual)。你可以在 [Gnus 手册][17] 中了解更多有关所有选项的信息。
+
+保存文件后,使用 `Meta+x Gnus` 启动 Gnus。第一次运行将在 Python 虚拟环境中安装 [Reddit 终端查看器][18],Gnus 通过它获取 Reddit 上的文章。然后它会启动浏览器来登录 Reddit。之后,它会扫描并加载你订阅的 Reddit 群组。你会看到一个有新邮件的邮件夹列表和一个有新内容的看板列表。在任一列表上按回车将加载该组中的消息列表。你可以使用箭头键导航并按回车加载和读取消息。在查看消息列表时,按 `q` 将返回到前一个视图,从主窗口按 `q` 将退出 Gnus。在阅读 Reddit 群组时,`a` 会创建一条新消息;在邮件组中,`m` 创建一个新的电子邮件;并且在任何一个视图中按 `r` 回复邮件。
+
+你还可以向 Gnus 接口中添加 RSS 流,并像阅读邮件和新闻组一样阅读它们。要添加 RSS 流,输入 `G+R` 并填写 RSS 流的 URL。会有提示让你输入 RSS 的标题和描述,这些信息可以从流中提取出来并填充进去。现在输入 `g` 来检查新消息(这将检查所有组中的新消息)。阅读 RSS 流 就像阅读 Reddit 群组和邮件一样,它们使用相同的快捷键。
+
+Gnus 中有*很多*功能,还有大量的键组合。[Gnus 参考卡][19]为每个视图列出了所有这些键组合(以非常小的字体显示在 5 页纸上)。
+
+#### 使用 nyan-mode 查看位置
+
+最后,你可能会一些截屏底部注意到 [Nyan cat][20]。这是 [nyan-mode][21],它指示了你在缓冲区中的位置,因此当你接近文档或缓冲区的底部时,它会变长。你可以使用包管理器安装它,并在 `~/.emacs.d/init.el` 中使用以下代码进行设置:
+
+```
+;; Nyan Cat
+(setq nyan-wavy-trail t)
+(setq nyan-bar-length 20)
+(nyan-mode)
+```
+
+### Emacs 的基本功能
+
+这只是 Emacs 所有功能的皮毛。Emacs *非常*强大,是我用来提高工作效率的必要工具之一,无论我是在追踪待办事项、阅读和回复邮件、编辑文本,还是与朋友和同事交流我都用它。这需要一点时间来适应,但是一旦你习惯了,它就会成为你桌面上最有用的工具之一。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/1/emacs-social-track-todo-list
+
+作者:[Kevin Sonney][a]
+选题:[lujun9972][b]
+译者:[lujun9972](https://github.com/lujun9972)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/ksonney
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/talk_chat_team_mobile_desktop.png?itok=d7sRtKfQ (Team communication, chat)
+[2]: https://linux.cn/article-11932-1.html
+[3]: https://opensource.com/sites/default/files/uploads/productivity_19-1.png (All the things with Emacs)
+[4]: https://opensource.com/sites/default/files/uploads/productivity_19-2.png (Twitter in Emacs)
+[5]: https://github.com/hayamiz/twittering-mode
+[6]: https://github.com/hayamiz/twittering-mode#features
+[7]: https://opensource.com/sites/default/files/uploads/productivity_19-3.png (todo.txt in emacs)
+[8]: https://github.com/rpdillon/todotxt.el
+[9]: http://todotxt.org/
+[10]: https://opensource.com/sites/default/files/uploads/productivity_19-4.png (Chatting with erc)
+[11]: https://www.gnu.org/software/emacs/manual/html_mono/erc.html
+[12]: https://linux.cn/article-11856-1.html
+[13]: https://opensource.com/sites/default/files/uploads/productivity_19-5.png (Mail, Reddit, and RSS feeds with Gnus)
+[14]: https://www.gnus.org/
+[15]: https://linux.cn/article-11807-1.html
+[16]: https://github.com/dickmao/nnreddit
+[17]: https://www.gnus.org/manual/gnus.html
+[18]: https://pypi.org/project/rtv/
+[19]: https://www.gnu.org/software/emacs/refcards/pdf/gnus-refcard.pdf
+[20]: http://www.nyan.cat/
+[21]: https://github.com/TeMPOraL/nyan-mode
diff --git a/published/20200130 4 open source productivity tools on my wishlist.md b/published/20200130 4 open source productivity tools on my wishlist.md
new file mode 100644
index 0000000000..533247844b
--- /dev/null
+++ b/published/20200130 4 open source productivity tools on my wishlist.md
@@ -0,0 +1,99 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11961-1.html)
+[#]: subject: (4 open source productivity tools on my wishlist)
+[#]: via: (https://opensource.com/article/20/1/open-source-productivity-tools)
+[#]: author: (Kevin Sonney https://opensource.com/users/ksonney)
+
+我的愿望清单上的 4 种开源生产力工具
+======
+
+> 在 2020 年用开源实现更高生产力的二十种方式的最后一篇文章中,了解开源世界还需要什么。
+
+![](https://img.linux.net.cn/data/attachment/album/202003/05/100642k52u7oydcwnc1c2w.jpg)
+
+去年,我在 19 天里给你介绍了 19 个新(对你而言)的生产力工具。今年,我换了一种方式:使用你在使用或者还没使用的工具,构建一个使你可以在新一年更加高效的环境。
+
+### 然而…
+
+在搜索生产力应用程序时,我找不到想要的所有应用,而且几乎总是会丢失一些读者与我分享的精彩内容。 因此,当我结束本系列文章时,是时候[再次][2]谈论我在本年度系列文章中未能涵盖的一些主题。
+
+![Desktop with Joplin, Emacs, and Firefox][3]
+
+#### 在 Vim 中聊天
+
+我试过了。我真的非常、非常想能够在 Vim 中聊天,但我做不到。我找到的一个软件包 [VimIRC.vim][4] 一直就工作不起来,我试了几天也没用。我探索的另一个选项是 [Irc it][5],这需要我付出更多的[努力去设置][6],超过了我正常可以付出的耐心或时间。我尝试过了,也确实做到了,但对于同处于相同境地的 Vim 用户,对不起,我无法帮到你。
+
+#### Org 模式
+
+![Org Mode in Emacs][7]
+
+我喜欢 [Org 模式][8],并且每天都使用它。关于 Org 模式我可以滔滔不绝的说上几天。它提供了基本的[任务跟踪][9];谷歌[日历][10]同步和 [CalFW][11] 集成;富文本文档、网站和演示文稿;链接到任何事物;等等、等等……
+
+我希望你会在 2020 年从我这里收到更多有关 Org 模式的信息,因为它真的很酷。
+
+#### 图形用户界面程序
+
+在 2019 年的生产力系列中,我共享了很多图形用户界面程序,而今年几乎都是命令行应用程序。有一些很棒的图形程序可以帮助解决我今年谈论的一些问题,例如可以使用 Maildir 邮箱的[邮件][12]程序、用于读取本地日历文件的日历程序、[天气][13]应用程序等等。我甚至尝试了几项对我而言新奇的事物,看它们是否适合这个主题。除了 [twin][14] 之外,我没有感觉到有什么图形用户界面程序是新颖的(对我而言)或值得注意的(同样对我而言)是今年要写的。至于……
+
+#### 移动应用程序
+
+越来越多的人将平板电脑(有时与笔记本电脑结合使用)作为主要设备。我将手机用于大多数社交媒体和即时消息传递,并且经常使用平板电脑(好的,老实说,好几个平板电脑)来阅读或浏览网络。可以肯定的是,并不是没有开源移动应用程序,但是它们与我今年的主题不符。开源和移动应用程序正在发生很多变化,我正在仔细地寻找可以帮助我在手机和平板电脑上提高工作效率的事物。
+
+### 该你了
+
+非常感谢你阅读今年的系列文章。请你发表评论,告诉我错过的或需要在 2021 年看到的内容。正如我在 [Productivity Alchemy][15] 播客上所说:“哥们,记着:要保持生产力!”
+
+### 本系列汇总
+
+1. [使用 Syncthing 在多个设备间同步文件](https://linux.cn/article-11793-1.html)
+2. [使用 Stow 管理多台机器配置](https://linux.cn/article-11796-1.html)
+3. [使用 OfflineIMAP 同步邮件](https://linux.cn/article-11804-1.html)
+4. [使用 Notmuch 组织你的邮件](https://linux.cn/article-11807-1.html)
+5. [使用 khal 和 vdirsyncer 组织和同步你的日历](https://linux.cn/article-11812-1.html)
+6. [用于联系人管理的三个开源工具](https://linux.cn/article-11834-1.html)
+7. [开始使用开源待办事项清单管理器](https://linux.cn/article-11835-1.html)
+8. [使用这个 Python 程序记录你的活动](https://linux.cn/article-11846-1.html)
+9. [一个通过 IRC 管理所有聊天的开源聊天工具](https://linux.cn/article-11856-1.html)
+10. [使用这个 Twitter 客户端在 Linux 终端中发推特](https://linux.cn/article-11858-1.html)
+11. [在 Linux 终端中阅读 Reddit](https://linux.cn/article-11869-1.html)
+12. [使用此开源工具在一起收取你的 RSS 订阅源和播客](https://linux.cn/article-11876-1.html)
+13. [使用这个开源工具获取本地天气预报](https://linux.cn/article-11879-1.html)
+14. [使用此开源窗口环境一次运行多个控制台](https://linux.cn/article-11892-1.html)
+15. [使用 tmux 创建你的梦想主控台](https://linux.cn/article-11900-1.html)
+16. [使用 Vim 发送邮件和检查日历](https://linux.cn/article-11908-1.html)
+17. [使用 Vim 管理任务列表和访问 Reddit 和 Twitter](https://linux.cn/article-11912-1.html)
+18. [使用 Emacs 发送电子邮件和检查日历](https://linux.cn/article-11932-1.html)
+19. [使用 Emacs 进行社交并跟踪你的待办事项列表](https://linux.cn/article-11956-1.html)
+20. [我的愿望清单上的 4 种开源生产力工具](https://linux.cn/article-11961-1.html)
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/1/open-source-productivity-tools
+
+作者:[Kevin Sonney][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/ksonney
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/world_hands_diversity.png?itok=zm4EDxgE (Two diverse hands holding a globe)
+[2]: https://opensource.com/article/19/1/productivity-tool-wish-list
+[3]: https://opensource.com/sites/default/files/uploads/productivity_20-1.png (Desktop with Joplin, Emacs, and Firefox)
+[4]: https://github.com/vim-scripts/VimIRC.vim
+[5]: https://tools.suckless.org/ii/
+[6]: https://www.reddit.com/r/vim/comments/48t7ws/vim_ii_irc_client_xpost_runixporn/d0macnl/
+[7]: https://opensource.com/sites/default/files/uploads/productivity_20-2.png (Org Mode in Emacs)
+[8]: https://orgmode.org/
+[9]: https://opensource.com/article/20/1/open-source-to-do-list
+[10]: https://opensource.com/article/20/1/open-source-calendar
+[11]: https://github.com/kiwanami/emacs-calfw
+[12]: https://opensource.com/article/20/1/organize-email-notmuch
+[13]: https://opensource.com/article/20/1/open-source-weather-forecast
+[14]: https://github.com/cosmos72/twin
+[15]: https://productivityalchemy.com
diff --git a/published/20200204 DevOps vs Agile- What-s the difference.md b/published/20200204 DevOps vs Agile- What-s the difference.md
new file mode 100644
index 0000000000..e221cbc775
--- /dev/null
+++ b/published/20200204 DevOps vs Agile- What-s the difference.md
@@ -0,0 +1,160 @@
+[#]: collector: "lujun9972"
+[#]: translator: "messon007"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-12031-1.html"
+[#]: subject: "DevOps vs Agile: What's the difference?"
+[#]: via: "https://opensource.com/article/20/2/devops-vs-agile"
+[#]: author: "Taz Brown https://opensource.com/users/heronthecli"
+
+DevOps 和敏捷:究竟有什么区别?
+======
+
+> 两者之间的区别在于开发完毕之后发生的事情。
+
+![](https://img.linux.net.cn/data/attachment/album/202003/23/200609w2rlzrjjhpf2hzsq.jpg)
+
+早期,软件开发并没有特定的管理流程。随后出现了[瀑布开发流程][2],它提出软件开发活动可以用开发和构建应用所耗费的时间来定义。
+
+那时候,由于在开发流程中没有审查环节和权衡考虑,常常需要花费很长的时间来开发、测试和部署软件。交付的软件也是带有缺陷和 Bug 的质量较差的软件,而且交付时间也不满足要求。那时候软件项目管理的重点是长期而拖沓的计划。
+
+瀑布流程与[三重约束模型][3]相关,三重约束模型也称为项目管理三角形。三角形的每一个边代表项目管理三要素的一个要素: **范围、时间和成本**。正如 [Angelo Baretta 写到][4],三重约束模型“认为成本是时间和范围的函数,这三个约束以一种确定的、可预测的方式相互作用。……如果我们想缩短时间表(时间),就必须增加成本。如果我们想增加范围,就必须增加成本或时间。”
+
+### 从瀑布流程过渡到敏捷开发
+
+瀑布流程来源于生产和工程领域,这些领域适合线性化的流程:正如房屋封顶之前需要先盖好支撑墙。相似地,软件开发问题被认为可以通过提前做好计划来解决。从头到尾,开发流程均由路线图清晰地定义,沿着路线图就可以得到最终交付的产品。
+
+最终,瀑布模型被认为对软件开发是不利的而且违反人的直觉,因为通常直到开发流程的最后才能体现出项目的价值,这导致许多项目最终都以失败告终。而且,在项目结束前客户看不到任何可以工作的软件。
+
+敏捷采用了一种不同的方法,它抛弃了规划整个项目,承诺估计的时间点,简单的遵循计划。与瀑布流程相反,它假设和拥抱不确定性。它的理念是以响应变化代替讨论过去,它认为变更是客户需求的一部分。
+
+### 敏捷价值观
+
+敏捷由敏捷宣言代言,敏捷宣言定义了 [12 条原则][5](LCTT 译注:此处没有采用本文原本的简略句式,而是摘录了来自敏捷软件开发宣言官方的[中文译本][14]):
+
+1. 我们最重要的目标,是通过持续不断地及早交付有价值的软件使客户满意。
+2. 欣然面对需求变化,即使在开发后期也一样。
+3. 经常交付可工作的软件,相隔几星期或一两个月,倾向于采取较短的周期。
+4. 业务人员和开发人员必须相互合作,项目中的每一天都不例外。
+5. 激发个体的斗志,以他们为核心搭建项目。提供所需的环境和支援,辅以信任,从而达成目标。
+6. 面对面沟通是传递信息的最佳的也是效率最高的方法。
+7. 可工作的软件是进度的首要度量标准。
+8. 敏捷流程倡导可持续的开发,责任人、开发人员和用户要能够共同维持其步调稳定延续。
+9. 坚持不懈地追求技术卓越和良好设计,敏捷能力由此增强。
+10. 以简洁为本,它是极力减少不必要工作量的艺术。
+11. 最好的架构,需求和设计出自自组织团队
+12. 团队定期地反思如何能提高成效,并依此调整自身的举止表现。
+
+敏捷的四个[核心价值观][6]是(LCTT 译注:[此处译文][15]同样来自敏捷软件开发宣言官方):
+
+* **个体和互动** 高于流程和工具
+* **工作的软件** 高于详尽的文档
+* **客户合作** 高于合同谈判
+* **响应变化** 高于遵循计划
+
+这与瀑布流程死板的计划风格相反。在敏捷流程中,客户是开发团队的一员,而不仅仅是在项目开始时参与项目需求的定义,在项目结束时验收最终的产品。客户帮忙团队完成[验收标准][7],并在整个过程中保持投入。另外,敏捷需要整个组织的变化和持续的改进。开发团队和其他团队一起合作,包括项目管理团队和测试团队。做什么和计划什么时候做由指定的角色领导,并由整个团队同意。
+
+### 敏捷软件开发
+
+敏捷软件开发需要自适应的规划、演进式的开发和交付。许多软件开发方法、框架和实践遵从敏捷的理念,包括:
+
+* Scrum
+* 看板(可视化工作流)
+* 极限编程(XP)
+* 精益方法
+* DevOps
+* 特性驱动开发(FDD)
+* 测试驱动开发(TDD)
+* 水晶方法
+* 动态系统开发方法(DSDM)
+* 自适应软件开发(ASD)
+
+所有这些已经被单独用于或一起用于开发和部署软件。最常用的是 [Scrum][8]、看板(或 Scrumban)和 DevOps。
+
+[Scrum][9] 是一个框架,采用该框架的团队通常由一个 Scrum 教练、产品经理和开发人员组成,该团队以跨职能、自主的工作方式运作,能够加快软件交付速度从而给客户带来巨大的商业价值。其关注点是[较小增量][10]的快速迭代。
+
+[看板][11] 是一个敏捷框架,有时也叫工作流管理系统,它能帮助团队可视化他们的工作从而最大化效率(因而变得敏捷)。看板通常由数字或物理展示板来呈现。团队的工作在展示板上随着进度而移动,例如从未启动到进行中,一直到测试中、已完成。看板使得每个团队成员可以随时查看到所有工作的状态。
+
+### DevOps 价值观
+
+DevOps 是一种文化,是一种思维状态,是一种软件开发的方式或者基础设施的方式,也是一种构建和部署软件和应用的方式。它假设开发和运维之间没有隔阂,他们一起合作,没有矛盾。
+
+DevOps 基于其它两个领域的实践: 精益和敏捷。DevOps 不是一个公司内的岗位或角色;它是一个组织或团队对持续交付、持续部署和持续集成的坚持不懈的追求。[Gene Kim][12](Phoenix 项目和 Unicorn 项目的作者)认为,有三种方式定义 DevOps 的理念:
+
+* 第一种: 流程原则
+* 第二种: 反馈原则
+* 第三种: 持续学习原则
+
+### DevOps 软件开发
+
+DevOps 不会凭空产生;它是一种灵活的实践,它的本质是一种关于软件开发和 IT 或基础设施实施的共享文化和思维方式。
+
+当你想到自动化、云、微服务时,你会想到 DevOps。在一次[访谈][13]中,《加速构建和扩张高性能技术组织》的作者 Nicol Forsgren、Jez Humble 和 Gene Kim 这样解释到:
+
+> * 软件交付能力很重要,它极大地影响到组织的成果,例如利润、市场份额、质量、客户满意度以及组织战略目标的达成。
+> * 优秀的团队能达到很高的交付量、稳定性和质量;他们并没有为了获得这些属性而进行取舍。
+> * 你可以通过实施精益、敏捷和 DevOps 中的实践来提升能力。
+> * 实施这些实践和能力也会影响你的组织文化,并且会进一步对你的软件交付能力和组织能力产生有益的提升。
+> * 懂得怎样改进能力需要做很多工作。
+
+### DevOps 和敏捷的对比
+
+DevOps 和敏捷有相似性,但是它们不完全相同,一些人认为 DevOps 比敏捷更好。为了避免造成混淆,深入地了解它们是很重要的。
+
+#### 相似之处
+
+* 毫无疑问,两者都是软件开发技术。
+* 敏捷已经存在了 20 多年,DevOps 是最近才出现的。
+* 两者都追求软件的快速开发,它们的理念都基于怎样在不伤害客户或运维利益的情况下快速开发出软件。
+
+#### 不同之处
+
+* 两者的差异在于软件开发完成后发生的事情。
+ * 在 DevOps 和敏捷中,都有软件开发、测试和部署的阶段。然而,敏捷流程在这三个阶段之后会终止。相反,DevOps 包括后续持续的运维。因此,DevOps 会持续的监控软件运行情况和进行持续的开发。
+* 敏捷中,不同的人负责软件的开发、测试和部署。而 DevOps 工程角色负责所有活动,开发即运维,运维即开发。
+* DevOps 更关注于削减成本,而敏捷则是精益和减少浪费的代名词,侧重于像敏捷项目会计和最小可行产品的概念。
+* 敏捷专注于并体现了经验主义(适应、透明和检查),而不是预测性措施。
+
+敏捷 | DevOps
+--- | ---
+从客户得到反馈 | 从自己得到反馈
+较小的发布周期 | 较小的发布周期,立即反馈
+聚焦于速度 | 聚焦于速度和自动化
+对业务不是最好 | 对业务最好
+
+### 总结
+
+敏捷和 DevOps 是截然不同的,尽管它们的相似之处使人们认为它们是相同的。这对敏捷和 DevOps 都是一种伤害。
+
+根据我作为一名敏捷专家的经验,我发现对于组织和团队从高层次上了解敏捷和 DevOps 是什么,以及它们如何帮助团队更高效地工作,更快地交付高质量产品从而提高客户满意度非常有价值。
+
+敏捷和 DevOps 绝不是对抗性的(或至少没有这个意图)。在敏捷革命中,它们更像是盟友而不是敌人。敏捷和 DevOps 可以相互协作一致对外,因此可以在相同的场合共存。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/2/devops-vs-agile
+
+作者:[Taz Brown][a]
+选题:[lujun9972][b]
+译者:[messon007](https://github.com/messon007)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/heronthecli
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/collab-team-pair-programming-code-keyboard.png?itok=kBeRTFL1 "Pair programming"
+[2]: http://www.agilenutshell.com/agile_vs_waterfall
+[3]: https://en.wikipedia.org/wiki/Project_management_triangle
+[4]: https://www.pmi.org/learning/library/triple-constraint-erroneous-useless-value-8024
+[5]: http://agilemanifesto.org/principles.html
+[6]: https://agilemanifesto.org/
+[7]: https://www.productplan.com/glossary/acceptance-criteria/
+[8]: https://opensource.com/article/19/8/scrum-vs-kanban
+[9]: https://www.scrum.org/
+[10]: https://www.scrum.org/resources/what-is-an-increment
+[11]: https://www.atlassian.com/agile/kanban
+[12]: https://itrevolution.com/the-unicorn-project/
+[13]: https://www.infoq.com/articles/book-review-accelerate/
+[14]: http://agilemanifesto.org/iso/zhchs/principles.html
+[15]: http://agilemanifesto.org/iso/zhchs/manifesto.html
diff --git a/published/20200211 Basic kubectl and Helm commands for beginners.md b/published/20200211 Basic kubectl and Helm commands for beginners.md
new file mode 100644
index 0000000000..5cb41e2c38
--- /dev/null
+++ b/published/20200211 Basic kubectl and Helm commands for beginners.md
@@ -0,0 +1,198 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-12007-1.html)
+[#]: subject: (Basic kubectl and Helm commands for beginners)
+[#]: via: (https://opensource.com/article/20/2/kubectl-helm-commands)
+[#]: author: (Jessica Cherry https://opensource.com/users/jrepka)
+
+适用于初学者的基本 kubectl 和 Helm 命令
+======
+
+> 去杂货店“采购”这些命令,你需要用这些 Kubernetes 工具来入门。
+
+![](https://img.linux.net.cn/data/attachment/album/202003/18/113120adp34myy90eb944b.jpg)
+
+最近,我丈夫告诉我他即将要去参加一个工作面试,面试时他需要在计算机上运行一些基本命令。他对这场面试感到焦虑,但是对于他来说,学习和记住事情的最好方法是将不了解的事物比喻为非常熟悉的事物。因为我们的谈话是在我逛杂货店试图决定当晚要烹饪的食物之后进行的,所以这启发我用一次去杂货店的行程来介绍 `kubectl` 和 `helm` 命令。
+
+[Helm][2](“舵轮”)是在 Kubernetes(来自希腊语,意思是“舵手” 或 “领航员”)中管理应用程序的工具。你可以轻松地使用你的应用程序信息来部署“海图”,从而可以在你的 Kubernetes 环境中几分钟之内让它们就绪并预配置好。在学习新知识时,查看示例的“海图”以了解其用法总是很有帮助的,因此,如果有时间,请查看这些成型的“[海图][3]”。(LCTT 译注:Kubernetes 生态中大量使用了和航海有关的比喻,因此本文在翻译时也采用了这些比喻)
+
+[kubectl][4] 是与 Kubernetes 环境交互的命令行界面,允许你配置和管理集群。它需要一些配置才能在环境中工作,因此请仔细阅读其[文档][5]以了解你需要做什么。
+
+我会在示例中使用命名空间,你可以在我的文章《[Kubernetes 命名空间入门][6]》中了解它。
+
+现在我们已经准备好了,让我们开始 `kubectl`和 `helm` 基本命令的购物之旅!
+
+### 用 Helm 列出清单
+
+你去商店之前要做的第一件事是什么?好吧,如果你做事有条理,会创建一个“清单”。同样,这是我将解释的第一个基本的 Helm 命令。
+
+在一个用 Helm 部署的应用程序中,`list` 命令提供有关应用程序当前版本的详细信息。在此示例中,我有一个已部署的应用程序:Jenkins CI/CD 应用程序。运行基本的 `list` 命令总是会显示默认的命名空间。由于我没有在默认的命名空间中部署任何内容,因此不会显示任何内容:
+
+```
+$helm list
+NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
+```
+
+但是,如果运行带有额外标志的命令,则会显示我的应用程序和信息:
+
+```
+$helm list --all-namespaces
+NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
+jenkins jenkins 1 2020-01-18 16:18:07 EST deployed jenkins-1.9.4 lts
+```
+
+最后,我可以指示 `list` 命令只检查我想从中获取信息的命名空间:
+
+```
+$helm list --namespace jenkins
+NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
+jenkins jenkins 1 2020-01-18 16:18:07 EST deployed jenkins-1.9.4 lts
+```
+
+现在我有了一个清单,并且知道该清单上有什么,我可以使用 `get` 命令来“获取”我的物品!我会从 Kubernetes 集群开始,看看我能从中获取到什么?
+
+### 用 Kubectl 获取物品
+
+`kubectl get` 命令提供了有关 Kubernetes 中许多事物的信息,包括“吊舱”、节点和命名空间。同样,如果没有指定命名空间标志,就会使用默认的命名空间。首先,我获取集群中的命名空间以查看正在运行的命名空间:
+
+```
+$kubectl get namespaces
+NAME STATUS AGE
+default Active 53m
+jenkins Active 44m
+kube-node-lease Active 53m
+kube-public Active 53m
+kube-system Active 53m
+```
+
+现在我已经知道了在我的环境中运行的有哪些命名空间了,接下来获取节点并查看有多少个节点正在运行:
+
+```
+$kubectl get nodes
+NAME STATUS ROLES AGE VERSION
+minikube Ready master 55m v1.16.2
+```
+
+我有一个节点正在运行,这主要是因为我的 Minikube 运行在一台小型服务器上。要得到在我的这一个节点上运行的“吊舱”可以这样:
+
+```
+$kubectl get pods
+No resources found in default namespace.
+```
+
+啊哦,它是空的。我将通过以下方式获取 Jenkins 命名空间中的内容:
+
+```
+$kubectl get pods --namespace jenkins
+NAME READY STATUS RESTARTS AGE
+jenkins-7fc688c874-mh7gv 1/1 Running 0 40m
+```
+
+好消息!这里发现了一个“吊舱”,它还没有重新启动过,已运行了 40 分钟了。好的,如今我知道“吊舱”已经装好,所以我想看看用 Helm 命令可以得到什么。
+
+### 用 Helm 获取信息
+
+`helm get` 命令稍微复杂一点,因为这个“获取”命令所需要的不仅仅是一个应用程序名称,而且你可以从应用程序中请求多个内容。我会从获取用于制作该应用程序的值开始,然后展示“获取全部”的操作结果的片段,该操作将提供与该应用程序相关的所有数据。
+
+```
+$helm get values jenkins -n jenkins
+USER-SUPPLIED VALUES:
+null
+```
+
+由于我只安装了最小限度的稳定版,因此配置没有更改。如果我运行“获取全部”命令,我将得到所有的“海图”:
+
+```
+$helm get all jenkins -n jenkins
+```
+
+![output from helm get all command][7]
+
+这会产生大量数据,因此我始终建议保留一份 Helm “海图”的副本,以便你可以查看“海图”中的模板。我还创建自己的值来了解自己所拥有的。
+
+现在,我把所有的商品都放在购物车中了,我会检查一下“描述”它们包含什么的标签。这些示例仅与 `kubectl` 命令有关,它们描述了我通过 Helm 部署的内容。
+
+### 用 kubectl 查看描述
+
+正如我使用“获取”命令(该命令可以描述 Kubernetes 中的几乎所有内容)所做的那样,我将示例限定到命名空间、“吊舱”和节点上。由于我知道它们每一个是什么,因此这很容易。
+
+```
+$kubectl describe ns jenkins
+Name: jenkins
+Labels: <none>
+Annotations: <none>
+Status: Active
+No resource quota.
+No resource limits.
+```
+
+我可以看到我的命名空间的名称,并且它是活动的,没有资源或限额限制。
+
+`describe pods` 命令会产生大量信息,因此我这里提供的是一小段输出。如果你在不使用“吊舱”名称的情况下运行该命令,它将返回名称空间中所有“吊舱”的信息,这可能会很麻烦。因此,请确保在此命令中始终包含“吊舱”名称。例如:
+
+```
+$kubectl describe pods jenkins-7fc688c874-mh7gv --namespace jenkins
+```
+
+![output of kubectl-describe-pods][8]
+
+这会提供容器的状态、管理方式、标签以及“吊舱”中所使用的镜像(还有很多其它信息)。没有在这个简化过的输出中包括的数据有:在 Helm 配置值文件中应用的各种条件下的资源请求和限制、初始化容器和存储卷信息。如果你的应用程序由于资源不足而崩溃,或者是一个需要运行前置脚本进行配置的初始配置容器,或者生成不应该存储于纯文本 YAML 文件中的隐藏密码,则此数据很有用。
+
+最后,我将使用 `describe node` 命令,当然,它是用来描述节点的。由于本示例只有一个名为 Minikube 的示例,因此我将使用这个名字。如果你的环境中有多个节点,则必须包含你想查找的的节点名称。
+
+与“吊舱”一样,这个节点的命令会产生大量数据,因此我将仅包括输出片段。
+
+```
+$kubectl describe node minikube
+```
+
+![output of kubectl describe node][9]
+
+注意,`describe node` 是更重要的基本命令之一。如此图所示,该命令返回统计信息,该信息指示节点何时资源用尽,并且该数据非常适合在需要扩展时(如果你的环境中没有自动扩展)向你发出警报。此输出片段中未包含的其它内容包括:对所有资源和限制的请求所占的百分比,以及资源的使用期限和分配(例如,对于我的应用程序而言)。
+
+### 买单
+
+使用这些命令,我完成了“购物”并得到了我想要的一切。希望这些基本命令也能在你使用 Kubernetes 的日常工作中提供帮助。
+
+我鼓励你经常使用命令行并学习“帮助”部分中的速记标志,你可以通过运行以下命令来查看这些标志:
+
+```
+$helm --help
+```
+
+或
+
+```
+$kubectl -h
+```
+
+### 花生酱和果冻
+
+有些东西像花生酱和果冻一样混在一起。Helm 和 `kubectl` 就有点像那样交错在一起。
+
+我经常在自己的环境中使用这些工具。因为它们在很多地方都有很多相似之处,所以在使用其中一个之后,我通常需要跟进另一个。例如,我可以进行 Helm 部署,并使用 `kubectl` 观察它是否失败。一起试试它们,看看它们能为你做什么。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/2/kubectl-helm-commands
+
+作者:[Jessica Cherry][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/jrepka
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003784_02_os.comcareers_os_rh2x.png?itok=jbRfXinl (A person working.)
+[2]: https://helm.sh/
+[3]: https://github.com/helm/charts/tree/master/stable
+[4]: https://kubernetes.io/docs/reference/kubectl/kubectl/
+[5]: https://kubernetes.io/docs/reference/kubectl/overview/
+[6]: https://linux.cn/article-11749-1.html
+[7]: https://opensource.com/sites/default/files/uploads/helm-get-all.png (output from helm get all command)
+[8]: https://opensource.com/sites/default/files/uploads/kubectl-describe-pods.png (output of kubectl-describe-pods)
+[9]: https://opensource.com/sites/default/files/uploads/kubectl-describe-node.png (output of kubectl describe node)
diff --git a/published/20200212 Extend the life of your SSD drive with fstrim.md b/published/20200212 Extend the life of your SSD drive with fstrim.md
new file mode 100644
index 0000000000..dfb2969cf9
--- /dev/null
+++ b/published/20200212 Extend the life of your SSD drive with fstrim.md
@@ -0,0 +1,152 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11959-1.html)
+[#]: subject: (Extend the life of your SSD drive with fstrim)
+[#]: via: (https://opensource.com/article/20/2/trim-solid-state-storage-linux)
+[#]: author: (Alan Formy-Duval https://opensource.com/users/alanfdoss)
+
+在 Linux 下使用 fstrim 延长 SSD 驱动器的寿命
+======
+
+> 这个新的系统服务可以使你的生活更轻松。
+
+![](https://img.linux.net.cn/data/attachment/album/202003/04/121625sl380ga10g56d33h.jpg)
+
+在过去的十年中,固态驱动器(SSD)带来了一种管理存储的新方法。与上一代的转盘产品相比,SSD 具有无声、更冷却的操作和更快的接口规格等优点。当然,新技术带来了新的维护和管理方法。SSD 具有一种称为 TRIM 的功能。从本质上讲,这是一种用于回收设备上未使用的块的方法,该块可能先前已被写入,但不再包含有效数据,因此可以返回到通用存储池以供重用。Opensource.com 的 Don Watkins 首先在其 2017 年的文章《[Linux 固态驱动器:为 SSD 启用 TRIM][2]》中介绍过 TRIM 的内容。
+
+如果你一直在 Linux 系统上使用此功能,则你可能熟悉下面描述的两种方法。
+
+### 老的方式
+
+#### 丢弃选项
+
+我最初使用 `mount` 命令的 `discard` 选项启用了此功能。每个文件系统的配置都放在 `/etc/fstab` 文件中。
+
+```
+# cat /etc/fstab
+UUID=3453g54-6628-2346-8123435f /home xfs defaults,discard 0 0
+```
+
+丢弃选项可启用自动的在线 TRIM。由于可能会对性能造成负面影响,最近关于这是否是最佳方法一直存在争议。使用此选项会在每次将新数据写入驱动器时启动 TRIM。这可能会引入其他磁盘活动,从而影响存储性能。
+
+#### Cron 作业
+
+我从 `fstab` 文件中删除了丢弃选项。然后,我创建了一个 cron 作业来按计划调用该命令。
+
+```
+# crontab -l
+@midnight /usr/bin/trim
+```
+
+这是我最近在 Ubuntu Linux 系统上使用的方法,直到我了解到另一种方法。
+
+### 一个新的 TRIM 服务
+
+我最近发现有一个用于 TRIM 的 systemd 服务。Fedora 在版本 30 中将其[引入][3],尽管默认情况下在版本 30 和 31 中未启用它,但计划在版本 32 中使用它。如果你使用的是 Fedora 工作站 31,并且你想要开始使用此功能,可以非常轻松地启用它。我还将在下面向你展示如何对其进行测试。该服务并非 Fedora 独有的服务。它是否存在及其地位将因发行版而异。
+
+#### 测试
+
+我喜欢先进行测试,以更好地了解幕后情况。我通过打开终端并发出配置服务调用的命令来执行此操作。
+
+```
+/usr/sbin/fstrim --fstab --verbose --quiet
+```
+
+`fstrim` 的 `-help` 参数将描述这些信息和其他参数。
+
+```
+$ sudo /usr/sbin/fstrim --help
+
+Usage:
+ fstrim [options]
+
+Discard unused blocks on a mounted filesystem.
+
+Options:
+ -a, --all trim all supported mounted filesystems
+ -A, --fstab trim all supported mounted filesystems from /etc/fstab
+ -o, --offset the offset in bytes to start discarding from
+ -l, --length the number of bytes to discard
+ -m, --minimum the minimum extent length to discard
+ -v, --verbose print number of discarded bytes
+ --quiet suppress error messages
+ -n, --dry-run does everything, but trim
+
+ -h, --help display this help
+ -V, --version display version
+```
+
+因此,现在我可以看到这个 systemd 服务已配置为在我的 `/etc/fstab` 文件中的所有受支持的挂载文件系统上运行该修剪操作(`-fstab`),并打印出所丢弃的字节数(`-verbose`),但是抑制了任何可能会发生的错误消息(`–quiet`)。了解这些选项对测试很有帮助。例如,我可以从最安全的方法开始,即空运行。我还将去掉 `-quiet` 参数,以便确定驱动器设置是否发生任何错误。
+
+```
+$ sudo /usr/sbin/fstrim --fstab --verbose --dry-run
+```
+
+这就会显示 `fstrim` 命令根据在 `/etc/fstab` 文件中找到的文件系统要执行的操作。
+
+```
+$ sudo /usr/sbin/fstrim --fstab --verbose
+```
+
+现在,这会将 TRIM 操作发送到驱动器,并报告每个文件系统中丢弃的字节数。以下是我最近在新的 NVME SSD 上全新安装 Fedora 之后的示例。
+
+```
+/home: 291.5 GiB (313011310592 bytes) trimmed on /dev/mapper/wkst-home
+/boot/efi: 579.2 MiB (607301632 bytes) trimmed on /dev/nvme0n1p1
+/boot: 787.5 MiB (825778176 bytes) trimmed on /dev/nvme0n1p2
+/: 60.7 GiB (65154805760 bytes) trimmed on /dev/mapper/wkst-root
+```
+
+#### 启用
+
+Fedora Linux 实现了一个计划每周运行它的 systemd 计时器服务。要检查其是否存在及当前状态,请运行 `systemctl status`。
+
+```
+$ sudo systemctl status fstrim.timer
+```
+
+现在,启用该服务。
+
+```
+$ sudo systemctl enable fstrim.timer
+```
+
+#### 验证
+
+然后,你可以通过列出所有计时器来验证该计时器是否已启用。
+
+```
+$ sudo systemctl list-timers --all
+```
+
+会显示出下列行,表明 `fstrim.timer` 存在。注意,该计时器实际上激活了 `fstrim.service` 服务。这是实际调用 `fstrim` 的地方。与时间相关的字段显示为 `n/a`,因为该服务已启用且尚未运行。
+
+```
+NEXT LEFT LAST PASSED UNIT ACTIVATES
+n/a n/a n/a n/a fstrim.timer fstrim.service
+```
+
+### 结论
+
+该服务似乎是在驱动器上运行 TRIM 的最佳方法。这比必须创建自己的 crontab 条目来调用 `fstrim` 命令要简单得多。不必编辑 `fstab` 文件也更安全。观察固态存储技术的发展很有趣,并且我很高兴看到 Linux 似乎正在朝着标准且安全的方向实现它。
+
+在本文中,学习了固态驱动器与传统硬盘驱动器有何不同以及它的含义...
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/2/trim-solid-state-storage-linux
+
+作者:[Alan Formy-Duval][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/alanfdoss
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/linux_keyboard_desktop.png?itok=I2nGw78_ (Linux keys on the keyboard for a desktop computer)
+[2]: https://linux.cn/article-8177-1.html
+[3]: https://fedoraproject.org/wiki/Changes/EnableFSTrimTimer (Fedora Project WIKI: Changes/EnableFSTrimTimer)
diff --git a/published/20200214 How to set up your own fast, private open source mesh network.md b/published/20200214 How to set up your own fast, private open source mesh network.md
new file mode 100644
index 0000000000..dbf4bfc481
--- /dev/null
+++ b/published/20200214 How to set up your own fast, private open source mesh network.md
@@ -0,0 +1,112 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11968-1.html)
+[#]: subject: (How to set up your own fast, private open source mesh network)
+[#]: via: (https://opensource.com/article/20/2/mesh-network-freemesh)
+[#]: author: (Spencer Thomason https://opensource.com/users/spencerthomason)
+
+如何建立自己的快速、私有的开源网状网络(mesh)
+======
+
+> 只需要不到 10 分钟的安装时间,就可以用 FreeMesh 搭建一个经济实惠、性能卓越、尊重隐私的网格系统。
+
+![](https://img.linux.net.cn/data/attachment/album/202003/06/234848jaga52a0wx05w0f0.jpg)
+
+[FreeMesh][2] 系统有望为大众带来完全开源的网状网络(LCTT 译注:也称之为“多跳网络”)。我最近有机会对它进行了测试;它安装迅速,性能非常好 —— 特别是相对它的价格而言。
+
+### 为什么要网格化和开源?
+
+使用开源的原因很简单:隐私。有了 FreeMesh,你的数据就是你自己的。它不会跟踪或收集数据。不相信吗?毕竟,你可以轻松检查 —— 它是开源的!而其它大型高科技企业集团提供的一些流行的网状网络解决方案,你是否相信它们会保护你的数据?
+
+另一个重要因素:更新。FreeMesh 表示,它将致力于定期发布安全性和性能更新。从现在起到 10 年后呢?使用开源解决方案,你可以根据需要自由地更新产品。
+
+那么为什么要用网状网络呢?在网状网络中,多个无线路由器一起工作以广播单个超大型的无线网络。网状网络中的每个路由器都可与其他路由器智能地通信,以便为你的数据提供最佳的“路径”。FreeMesh 网站上的以下图片突出显示了使用单个无线路由器和网状网络之间的区别。红色网络表示单个无线路由器,绿色网络是网状网络。
+
+![单路由器网络] [3]
+
+![网状网络] [4]
+
+### 采购设备
+
+要开始使用 FreeMesh,请[订购套件][5]。它提供两种套件:标准套件和 4G LTE。
+
+顾名思义,4G LTE 套件支持蜂窝数据连接。此功能在消费级网络领域非常罕见,但对某些人来说非常有用。你可以在提供电源和电池的任何地方建立具有完整的快速故障转移功能的便携式网状网络。
+
+FreeMesh 套件带有一个主路由器和两个节点。路由器和节点使用 802.11ac、802.11r 和 802.11s 标准。随附的固件运行定制版本的 [OpenWrt] [6],这是嵌入式设备的 Linux 发行版。
+
+FreeMesh 路由器的一些规格非常好:
+
+* CPU:双核 880MHz MediaTek MT7621AT(双核/四线程!)
+* 内存:DDR3 512MB
+* 接口:1 个 GbE WAN、4 个 GbE LAN、1 个 USB 2.0 端口、1 个 microSD 卡插槽、1 个 SIM 插槽
+* 天线:2 个 5dBi 2.4GHz、2 个 5dBi 5GHz、2 个 3dBi 3G/4G(内置)
+* 4G LTE 调制解调器:LTE 4 类模块,下行 150Mbps/上行 50Mbps
+
+### 设置
+
+设置很容易,FreeMesh 的 [README][7] 提供了简单的说明和图表。首先首先设置主路由器。然后按照以下简单步骤操作:
+
+1、将第一个节点(蓝色 WAN 端口)连接到主路由器(黄色 LAN 端口)。
+
+![FreeMesh 设置步骤 1][8]
+
+2、等待约 30 至 60 秒。设置完成后,节点的 LED 将会闪烁。
+
+![FreeMesh 设置步骤 2][9]
+
+3、将节点移到另一个位置。
+
+仅此而已!节点不需要手动设置。你只需将它们插入主路由器,其余的工作就完成了。你可以以相同的方式添加更多节点;只需重复上述步骤即可。
+
+### 功能
+
+FreeMesh 是开箱即用的,它由 OpenWRT 和 LuCI 组合而成。它具有你期望路由器提供的所有功能。是否要安装新功能或软件包?SSH 连入并开始魔改!
+
+![FreeMesh 网络上的实时负载][10]
+
+![FreeMesh 网络概览][11]
+
+![OpenWrt 状态报告][12]
+
+### 性能如何
+
+设置完 FreeMesh 系统后,我将节点移动到了房屋周围的各个地方。我使用 [iPerf][13] 测试带宽,它达到了约 150Mbps。WiFi 可能会受到许多环境变量的影响,因此你的结果可能会有所不同。节点与主路由器之间的距离在带宽中也有很大的影响。
+
+但是,网状网络的真正优势不是高峰速度,而是整个空间的平均速度要好得多。即使在我家很远的地方,我仍然能够用流媒体播放视频并正常工作。我甚至可以在后院工作。在出门之前,我只是将一个节点重新放在窗口前面而已。
+
+### 结论
+
+FreeMesh 确实令人信服。它以简单、开源的形式为你提供高性价比和隐私。
+
+以我的经验,设置非常容易,而且足够快。覆盖范围非常好,远远超过了任何单路由器环境。你可以随意魔改和定制 FreeMesh 设置,但是我觉得没有必要。它提供了我需要的一切。
+
+如果你正在寻找价格可承受、性能良好且尊重隐私的网格系统,且该系统可以在不到 10 分钟的时间内安装完毕,你可以考虑一下 FreeMesh。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/2/mesh-network-freemesh
+
+作者:[Spencer Thomason][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/spencerthomason
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/bus-networking.png?itok=fHmulI9p (people on top of a connected globe)
+[2]: https://freemeshwireless.com/
+[3]: https://opensource.com/sites/default/files/uploads/singlerouternetwork.png (Single-router network)
+[4]: https://opensource.com/sites/default/files/uploads/meshnetwork.png (Mesh network)
+[5]: https://freemeshwireless.com/#pricing
+[6]: https://openwrt.org/
+[7]: https://gitlab.com/slthomason/freemesh/-/blob/master/README.md
+[8]: https://opensource.com/sites/default/files/uploads/connecttorouter.png (FreeMesh setup step 1)
+[9]: https://opensource.com/sites/default/files/uploads/setupcomplete.png (FreeMesh setup step 2)
+[10]: https://opensource.com/sites/default/files/uploads/freemeshrealtimeload.png (Real-time load on FreeMesh network)
+[11]: https://opensource.com/sites/default/files/uploads/freemeshwirelessoverview.png (Overview of FreeMesh network)
+[12]: https://opensource.com/sites/default/files/uploads/openwrt.png (OpenWrt status report)
+[13]: https://opensource.com/article/20/1/internet-speed-tests
diff --git a/published/20200214 Linux is our love language.md b/published/20200214 Linux is our love language.md
new file mode 100644
index 0000000000..293568e366
--- /dev/null
+++ b/published/20200214 Linux is our love language.md
@@ -0,0 +1,80 @@
+[#]: collector: (lujun9972)
+[#]: translator: (sndnvaps)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-12022-1.html)
+[#]: subject: (Linux is our love language)
+[#]: via: (https://opensource.com/article/20/2/linux-love-language)
+[#]: author: (Christopher Cherry https://opensource.com/users/chcherry)
+
+学习 Linux 是我们的爱情语言
+======
+
+> 当一个妻子教丈夫一些新技能的时候,他们都学到了比期待更多的东西。
+
+![](https://img.linux.net.cn/data/attachment/album/202003/22/163819clzuy77dc4d7q8zu.jpg)
+
+2019 年是我们 Cherry 家学习的一年。我是一个喜欢学习新技术的高级软件工程师,并把学到的内容一起教给了我的丈夫 Chris。通过教给他一些我学到的东西,并让他全程经历我的技术演练文章,我帮助 Chris 学习到了新技术,使他能够将自己的职业生涯更深入地转向技术领域。而我学习到了新的方法,使我的演练和培训材料更易于让读者理解。
+
+在这篇文章中,我们来讨论一下我们各自和彼此学习到了什么东西,然后探讨这对于我们的未来有何影响。
+
+### 向学生的提问
+
+**Jess:** Chris,是什么导致你想深入学习我的领域的技能呢?
+
+**Chris:** 主要目的是为了让我事业更进一步。作为一个网络工程师的经历告诉我,现在的网络专家已经不像以前一样有价值了,我必须掌握更多的知识。由于网络经常被认为是造成这些天程序中断或出错的原因,我想从开发人员的角度了解更多关于编写应用程序的知识,以便于了解它们如何依赖网络资源。
+
+**Jess:** 我首先教你什么内容?你从中学到什么?
+
+**Chris:** 首先是从学习除此安装 Linux 系统开始的,之后又安装了 [Ansible][2]。只要硬件兼容,我用过的每一个 Linux 发行版都很容易安装,但可能会出现个别不兼容的情况。这就意味着我有时候第一手学习到的是如何解决系统安装过程的最初 5 分钟出现的问题了(这个我最喜欢了)。Ansible 给了一个我学习使用软件管理器来安装程序的理由。当程序安装完成后,通过查看 yum 安装的程序,我快速了解了程序管理器是如何处理程序的依赖项的,因此,用 Python 编写的 Ansible 能够在我的系统运行。自此之后,我开始使用 Ansible 来安装各种各样的程序。
+
+**Jessica:** 你喜欢我这种教学方式不?
+
+**Chris:** 我们一开始有过争吵,直到我们弄清楚了我喜欢的学习方式,你也知道了应该怎样为我提供最好的学习方式。在一开始的时候,我很难跟上你讲的内容。例如,当你说“一个码头工人集装箱”的时候,我完全不知道你在讲什么。比较早的时候,我的回答就是“这是一个集装箱”,然而当时这对我来说,完全没有意义。当你对这些内容进行一些更深入的讲解后,才让学习更有趣。
+
+**Jess:** 老实说,这对我来说也是一个重要的教训。在你之前,我从来没有教过在这个技术领域知识比我少的人,所以你帮助我认识到我需要解释更多细节。我也得说声谢谢。
+
+当你通过这几个学习步骤的时候,你觉得我的这篇测试文章怎样呢?
+
+**Chris:** 就我个人而言,我认为这很容易,但我错了。在我主要学习的内容中,比如你[介绍的Vagrant][3],它在不同的 Linux 发行版间的变化比我想像的要多。操作系统的变化会影响设置的方式、运行都要求和特定的命令。这看起来比我用的网络设备变化更大。这让我花费更多的精力去查看这些说明是对应我的系统还是其它的系统(有时候很难知道)。在这学习路上,我似乎碰到很多问题。
+
+**Jess:** 我每天都会遇到各种各样的问题,所以对我来说日常就是用各种方法解决各种问题。
+
+### 向老师的提问
+
+**Chris:** Jess,你将来教我的方式会有所改变吗?
+
+**Jess:** 我想让你像我一样读多一些书。通过翻阅书籍来学习新技术。每天起床后一小时和睡觉前一小时我都会看书,花费一个星期左右我就能看一到两本书。我也会创建为期两周的任务计划来实践我从书本中学习到的技能。这是除了我一天中第一个小时在喝大量咖啡时读到的科技文章之外的。当我考虑到你的职业发展目标的时候,我认为除了我们谈到的优秀博客文章和文章之外,书籍是一个重要的元素。我觉得我的阅读量使我保持进步,如果你也这么做了,你也会很快赶上我的。
+
+**Chris:** 那么学生有没有教过老师呢?
+
+**Jess:** 我在你那里学习到耐心。举个例子,当你完成了安装 Ansible 的时候,我问你下一步要怎样操作的时候。你直接回复我,“不知道”,这不是我想让你学习到的内容。所以我改变了策略,现在在逐步安装任何组件之前,我们将详细讨论你想要实现的目标。当我们在写 Vagrant 文章的时候,我们一起进行相应的演示操作,我以创建它时就牢记目标,因此我们就有一些需要马上实现的目标。
+
+这实际上对我在工作中的培训方式产生了巨大的改变。现在我在大家学习的过程中会问更多问题,并更多地进行手把手讲解。我更愿意坐下来仔细检查,确保有人明白我在说什么和我们在做什么。这是我之前从来没有做过的。
+
+### 我们一起学到了什么
+
+做为一对夫妇,在这一年的技术合作中我们的技术都有所增长。
+
+**Chris:** 我对自己学到的东西感到震惊。通过一年课程学习,我认识了新操作系统、如何使用 API、使用 Ansible 部署 Web 应用和使用 Vagrant 启动虚拟机器。我还学习到了文档可以让生活变得更好,所以我也会尝试去写一写。然而,在这个工作领域,操作并不总是被记录在案,所以我学会了准备好处理棘手的问题,并记录如何解决它们。
+
+**Jess:** 除了我在教你中学到的知识外,我还专注于学习 Kubernetes 在云环境中的应用知识。这包括部署策略、Kubernetes API 的复杂度、创建我自己的容器,并对环境进行加密处理。我还节省了探索的时间:研究了 serverless 的代码、AI 模型、Python 和以图形方式显示热图。对于我来说,这一年也很充足。
+
+我们下一个目标是什么?现在还不知道,但我可以向你保证,我们将会继续进行分享它。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/2/linux-love-language
+
+作者:[Christopher Cherry][a]
+选题:[lujun9972][b]
+译者:[sndnvaps](https://github.com/sndnvaps)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/chcherry
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/red-love-heart-alone-stone-path.jpg?itok=O3q1nEVz (红心 "你不是孤单的")
+[2]: https://opensource.com/resources/what-ansible
+[3]: https://opensource.com/resources/vagrant
diff --git a/published/20200214 PHP Development on Fedora with Eclipse.md b/published/20200214 PHP Development on Fedora with Eclipse.md
new file mode 100644
index 0000000000..d373722c0e
--- /dev/null
+++ b/published/20200214 PHP Development on Fedora with Eclipse.md
@@ -0,0 +1,89 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11967-1.html)
+[#]: subject: (PHP Development on Fedora with Eclipse)
+[#]: via: (https://fedoramagazine.org/php-development-on-fedora-with-eclipse/)
+[#]: author: (Mehdi Haghgoo https://fedoramagazine.org/author/powergame/)
+
+使用 Eclipse 在 Fedora 上进行 PHP 开发
+======
+
+![][1]
+
+[Eclipse][2] 是由 Eclipse 基金会开发的功能全面的自由开源 IDE。它诞生于 2001 年。你可以在此 IDE 中编写各种程序,从 C/C++ 和 Java 到 PHP,乃至于 Python、HTML、JavaScript、Kotlin 等等。
+
+### 安装
+
+该软件可从 Fedora 的官方仓库中获得。要安装它,请用:
+
+```
+sudo dnf install eclipse
+```
+
+这将安装基本的 IDE 和 Eclipse 平台,能让你开发 Java 应用。为了将 PHP 开发支持添加到 IDE,请运行以下命令:
+
+```
+sudo dnf install eclipse-pdt
+```
+
+这将安装 PHP 开发工具,如 PHP 项目向导、PHP 服务器配置,composer 支持等。
+
+### 功能
+
+该 IDE 有许多使 PHP 开发更加容易的功能。例如,它有全面的项目向导(你可以在其中为新项目配置许多选项)。它还有如 composer 支持、调试支持、浏览器、终端等内置功能。
+
+### 示例项目
+
+现在已经安装了 IDE,让我们创建一个简单的 PHP 项目。进入 “File →New → Project”。在出现的对话框中,选择 “PHP project”。输入项目的名称。你可能还需要更改其他一些选项,例如更改项目的默认位置,启用 JavaScript 以及更改 PHP 版本。请看以下截图。
+
+![Create A New PHP Project in Eclipse][3]
+
+你可以单击 “Finish” 按钮创建项目,或按 “Next” 配置其他选项,例如添加包含和构建路径。在大多数情况下,你无需更改这些设置。
+
+创建项目后,右键单击项目文件夹,然后选择 “New→PHP File” 将新的 PHP 文件添加到项目。在本教程中,我将其命名为 `index.php`,这是每个 PHP 项目中公认的默认文件。
+
+![add a new PHP file][4]
+
+接着在新文件中添加代码。
+
+![Demo PHP code][5]
+
+在上面的例子中,我在同一页面上使用了 CSS、JavaScript 和 PHP 标记,主要是为了展示 IDE 能够支持所有这些标记。
+
+页面完成后,你可以将文件移至 Web 服务器文档根目录或在项目目录中创建一个 PHP 开发服务器来查看输出。
+
+借助 Eclipse 中的内置终端,我们可以直接在 IDE 中启动 PHP 开发服务器。只需单击工具栏上的终端图标(![Terminal Icon][6]),然后单击 “OK”。在新终端中,进入项目目录,然后运行以下命令:
+
+```
+php -S localhost:8080 -t . index.php
+```
+
+![Terminal output][7]
+
+现在,打开浏览器并进入 。如果按照说明正确完成了所有操作,并且代码没有错误,那么你将在浏览器中看到 PHP 脚本的输出。
+
+![PHP output in Fedora][8]
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/php-development-on-fedora-with-eclipse/
+
+作者:[Mehdi Haghgoo][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://fedoramagazine.org/author/powergame/
+[b]: https://github.com/lujun9972
+[1]: https://fedoramagazine.org/wp-content/uploads/2020/02/php-eclipse-816x346.png
+[2]: https://projects.eclipse.org/projects/eclipse
+[3]: https://fedoramagazine.org/wp-content/uploads/2020/02/Screenshot-from-2020-02-07-01-58-39.png
+[4]: https://fedoramagazine.org/wp-content/uploads/2020/02/Screenshot-from-2020-02-07-02-02-05-1024x576.png
+[5]: https://fedoramagazine.org/wp-content/uploads/2020/02/code-1024x916.png
+[6]: https://fedoramagazine.org/wp-content/uploads/2020/02/Screenshot-from-2020-02-07-03-50-05.png
+[7]: https://fedoramagazine.org/wp-content/uploads/2020/02/terminal-1024x239.png
+[8]: https://fedoramagazine.org/wp-content/uploads/2020/02/output.png
diff --git a/published/20200219 How to find what you-re looking for on Linux with find.md b/published/20200219 How to find what you-re looking for on Linux with find.md
new file mode 100644
index 0000000000..4b2ca325ef
--- /dev/null
+++ b/published/20200219 How to find what you-re looking for on Linux with find.md
@@ -0,0 +1,236 @@
+[#]: collector: (lujun9972)
+[#]: translator: (heguangzhi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11966-1.html)
+[#]: subject: (How to find what you’re looking for on Linux with find)
+[#]: via: (https://www.networkworld.com/article/3527420/how-to-find-what-you-re-looking-for-on-linux-with-find.html)
+[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
+
+通过 find 命令找到你要找的东西
+======
+
+> find 命令有巨多的选项可以帮助你准确定位你在 Linux 系统上需要寻找的文件。这篇文章讨论了一系列非常有用的选项。
+
+![](https://img.linux.net.cn/data/attachment/album/202003/06/113842txki5llopb5aagbt.jpg)
+
+在 Linux 系统上有许多用于查找文件的命令,而你在使用它们时也有巨多的选项可以使用。
+
+例如,你不仅可以通过文件的名称来查找文件,还可以通过文件的所有者或者组、它们的创建时间、大小、分配的权限、最后一次访问它们的时间、关联的信息节点,甚至是文件是否属于系统上不再存在的帐户或组等等来查找文件。
+
+你还可以指定搜索从哪里开始,搜索应该深入到文件系统的什么位置,以及搜索结果将告诉你它所找到的文件的数量。
+
+而所有这些要求都可以通过 `find` 命令来处理。
+
+下面提供了根据这些要求查找文件的示例。在某些命令中,错误(例如试图列出你没有读取权限的文件)输出将被发送到 `/dev/null`,以便我们不必查看它。或者,我们可以简单地以 root 身份运行以避免这个问题。
+
+请记住,还有更多的其他选项。这篇文章涵盖了很多内容,但并不是 `find` 命令帮助你定位查找文件的所有方式。
+
+### 选择起点
+
+使用 `find`,你可以选择一个起点或从你所在的位置开始。要选择的搜索的起点,请在单词 `find` 后输入它。例如,`find /usr` 或 `find ./bin` 将在 `/usr` 目录或当前位置下的 `bin` 目录开始搜索,而 `find ~` 将在你的主目录中开始搜索,即使你当前位于当前文件系统中的其他位置。
+
+### 选择你要找的
+
+最常用的搜索策略之一是按名称搜索文件。这需要使用 `-name` 选项。
+
+默认情况下,`find` 会显示找到的文件的完整路径。如果你在命令中添加 `-print`,你会看到同样的结果。如果你想查看与文件相关的详细信息—-例如:文件的长度、权限等,你需要在你的 `find` 命令的末尾添加 `-ls` 参数。
+
+```
+$ find ~/bin -name tryme
+/home/shs/bin/tryme
+$ find ~/bin -name tryme -print
+/home/shs/bin/tryme
+$ find ~/bin -name tryme -ls
+ 917528 4 -rwx------ 1 shs shs 139 Apr 8 2019 /home/shs/bin/tryme
+```
+
+你也可以使用子字符串来查找文件。例如,如果你将上面示例中的 `tryme` 替换为 `try*`,你将会找到所有名称以 `try` 开头的文件。(LCTT 译注:如果要使用通配符 `*` ,请将搜索字符串放到单引号或双引号内,以避免通配符被 shell 所解释)
+
+按名称查找文件可能是 `find` 命令最典型的用法,不过还有很多其他的方式来查找文件,并且有这样做的需要。下面的部分展示了如何使用其他可用的方式。
+
+此外,当按文件大小、组、索引节点等条件来搜索文件时,你需要确认找到的文件与你要查找的文件是否相匹配。使用 `-ls` 选项来显示细节是非常有用。
+
+### 通过大小查找文件
+
+按大小查找文件需要使用 `-size` 选项并且对相应规范使用一点技巧。例如,如果你指定 `-size 189b`,你将找到 189 个块大小的文件,而不是 189 个字节。(LCTT 译注:如果不跟上单位,默认单位是 `b`。一个块是 512 个字节大小,不足或正好 512 个字节将占据一个块。)对于字节,你需要使用 `--size 189c`(字符)。而且,如果你指定 `--size 200w` ,你将会找到 200 个“字”的文件——以“双字节增量”为单位的字,而不是“我们互相谈论的那些事情”中的单词。你还可以通过以千字节(`k`)、兆字节(`M`)和千兆字节(`G`)为单位提供大小来查找文件。(LCTT 译注:乃至还有 `T`、`P`)
+
+大多数情况下,Linux 用户会搜索比选定大小要大的文件。例如,要查找大于 1 千兆字节的文件,你可以使用这样的命令,其中 `+1G` 表示“大于 1 千兆字节”:
+
+```
+$ find -size +1G -ls 2>/dev/null
+ 787715 1053976 -rw-rw-r-- 1 shs shs 1079263432 Dec 21 2018 ./backup.zip
+ 801834 1052556 -rw-rw-r-- 1 shs shs 1077809525 Dec 21 2018 ./2019/hold.zip
+```
+
+### 通过索引节点号查找文件
+
+你可以通过用于维护文件元数据(即除文件内容和文件名之外的所有内容)的索引节点来查找文件。
+
+```
+$ find -inum 919674 -ls 2>/dev/null
+ 919674 4 -rw-rw-r-- 1 shs shs 512 Dec 27 15:25 ./bin/my.log
+```
+
+### 查找具有特定文件所有者或组的文件
+
+按所有者或组查找文件也非常简单。这里我们使用 `sudo` 来解决权限问题。
+
+```
+$ sudo find /home -user nemo -name "*.png" -ls
+ 1705219 4 drwxr-xr-x 2 nemo nemo 4096 Jan 28 08:50 /home/nemo/Pictures/me.png
+```
+
+在下面这个命令中,我们寻找一个被称为 `admins` 的多用户组拥有的文件。
+
+```
+# find /tmp -group admins -ls
+ 262199 4 -rwxr-x--- 1 dory admins 27 Feb 16 18:57 /tmp/testscript
+```
+
+### 查找没有所有者或组的文件
+
+你可以使用如下命令所示的 `-nouser` 选项来查找不属于当前系统上的任何用户的文件。
+
+```
+# find /tmp -nouser -ls
+262204 4 -rwx------ 1 1016 1016 17 Feb 17 16:42 /tmp/hello
+```
+
+请注意,该列表显示了旧用户的 UID 和 GID,这清楚地表明该用户未在系统上定义。这种命令将查找帐户已从系统中删除的用户创建在主目录之外的文件,或者在用户帐户被删除后而未被删除的主目录中创建的文件。类似地,`-nogroup` 选项也会找到这样的文件,尤其是当这些用户是相关组的唯一成员时。
+
+### 按上次更新时间查找文件
+
+在此命令中,我们在特定用户的主目录中查找过去 24 小时内更新过的文件。`sudo` 用于搜索另一个用户的主目录。
+
+```
+$ sudo find /home/nemo -mtime -1
+/home/nemo
+/home/nemo/snap/cheat
+/home/nemo/tryme
+```
+
+### 按上次更改权限的时间查找文件
+
+`-ctime` 选项可以帮助你查找在某个参考时间范围内状态(如权限)发生更改的文件。以下是查找在最后一天内权限发生更改的文件的示例:
+
+```
+$ find . -ctime -1 -ls
+ 787987 4 -rwxr-xr-x 1 shs shs 189 Feb 11 07:31 ./tryme
+```
+
+请记住,显示的日期和时间只反映了对文件内容进行的最后更新。你需要使用像 `stat` 这样的命令来查看与文件相关联的三个状态(文件创建、修改和状态更改)。
+
+### 按上次访问的时间查找文件
+
+在这个命令中,我们使用 `-atime` 选项查找在过去两天内访问过的本地 pdf 文件。
+
+```
+$ find -name "*.pdf" -atime -2
+./Wingding_Invites.pdf
+```
+
+### 根据文件相对于另一个文件的时间来查找文件
+
+你可以使用 `-newer` 选项来查找比其他文件更新的文件。
+
+```
+$ find . -newer dig1 -ls
+ 786434 68 drwxr-xr-x 67 shs shs 69632 Feb 16 19:05 .
+ 1064442 4 drwxr-xr-x 5 shs shs 4096 Feb 16 11:06 ./snap/cheat
+ 791846 4 -rw-rw-r-- 1 shs shs 649 Feb 13 14:26 ./dig
+```
+
+没有相应的 `-older` 选项,但是你可以用 `! -newer` (即更旧)得到类似的结果,它们基本上一样。
+
+### 按类型查找文件
+
+通过文件类型找到一个文件,你有很多选项——常规文件、目录、块和字符文件等等。以下是文件类型选项列表:
+
+```
+b 块特殊文件(缓冲的)
+c 字符特殊文件(无缓冲的)
+d 目录
+p 命名管道(FIFO)
+f 常规文件
+l 符号链接
+s 套接字
+```
+
+这里有一个寻找符号链接的例子:
+
+```
+$ find . -type l -ls
+ 805717 0 lrwxrwxrwx 1 shs shs 11 Apr 10 2019 ./volcano -> volcano.pdf
+ 918552 0 lrwxrwxrwx 1 shs shs 1 Jun 16 2018 ./letter -> pers/letter2mom
+```
+
+### 限制查找的深度
+
+`-mindepth` 和 `-maxdepth` 选项控制在文件系统中搜索的深度(从当前位置或起始点开始)。
+
+```
+$ find -maxdepth 3 -name "*loop"
+./bin/save/oldloop
+./bin/long-loop
+./private/loop
+```
+
+### 查找空文件
+
+在这个命令中,我们寻找空文件,但不进入目录及其子目录。
+
+```
+$ find . -maxdepth 2 -empty -type f -ls
+ 917517 0 -rw-rw-r-- 1 shs shs 0 Sep 23 11:00 ./complaints/newfile
+ 792050 0 -rw-rw-r-- 1 shs shs 0 Oct 4 19:02 ./junk
+```
+
+### 按权限查找文件
+
+你可以使用 `-perm` 选项查找具有特定权限集的文件。在下面的示例中,我们只查找常规文件(`-type f`),以避免看到符号链接,默认情况下符号链接被赋予了这种权限,即使它们所引用的文件是受限的。
+
+```
+$ find -perm 777 -type f -ls
+find: ‘./.dbus’: Permission denied
+ 798748 4 -rwxrwxrwx 1 shs shs 15 Mar 28 2019 ./runme
+```
+
+### 使用查找来帮助你删除文件
+
+如果使用如下命令,你可以使用 `find` 命令定位并删除文件:
+
+```
+$ find . -name runme -exec rm {} \;
+```
+
+`{}` 代表根据搜索条件找到的每个文件的名称。
+
+一个非常有用的选项是将 `-exec` 替换为 `-ok`。当你这样做时,`find` 会在删除任何文件之前要求确认。
+
+```
+$ find . -name runme -ok rm -rf {} \;
+< rm ... ./bin/runme > ?
+```
+
+删除文件并不是 `-ok` 和 `-exec` 能为你做的唯一事情。例如,你可以复制、重命名或移动文件。
+
+确实有很多选择可以有效地使用 `find` 命令,毫无疑问还有一些在本文中没有涉及到。我希望你已经找到一些新的,特别有帮助的。
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3527420/how-to-find-what-you-re-looking-for-on-linux-with-find.html
+
+作者:[Sandra Henry-Stocker][a]
+选题:[lujun9972][b]
+译者:[heguangzhi](https://github.com/heguangzhi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/
+[b]: https://github.com/lujun9972
+[1]: https://www.networkworld.com/newsletters/signup.html
+[2]: https://www.networkworld.com/article/3440100/take-the-intelligent-route-with-consumption-based-storage.html?utm_source=IDG&utm_medium=promotions&utm_campaign=HPE21620&utm_content=sidebar ( Take the Intelligent Route with Consumption-Based Storage)
+[3]: https://www.facebook.com/NetworkWorld/
+[4]: https://www.linkedin.com/company/network-world
diff --git a/published/20200219 Try this Bash script for-large filesystems.md b/published/20200219 Try this Bash script for-large filesystems.md
new file mode 100644
index 0000000000..8ebc16d6d3
--- /dev/null
+++ b/published/20200219 Try this Bash script for-large filesystems.md
@@ -0,0 +1,330 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-12025-1.html)
+[#]: subject: (Try this Bash script for large filesystems)
+[#]: via: (https://opensource.com/article/20/2/script-large-files)
+[#]: author: (Nick Clifton https://opensource.com/users/nickclifton)
+
+针对大型文件系统可以试试此 Bash 脚本
+======
+
+> 一个可以列出文件、目录、可执行文件和链接的简单脚本。
+
+![bash logo on green background][1]
+
+你是否曾经想列出目录中的所有文件,但仅列出文件,而不列出其它的。仅列出目录呢?如果有这种需求的话,那么下面的脚本可能正是你一直在寻找的,它在 GPLv3 下开源。
+
+当然,你可以使用 `find` 命令:
+
+```
+find . -maxdepth 1 -type f -print
+```
+
+但这键入起来很麻烦,输出也不友好,并且缺少 `ls` 命令拥有的一些改进。你还可以结合使用 `ls` 和 `grep` 来达到相同的结果:
+
+```
+ls -F . | grep -v /
+```
+
+但是,这又有点笨拙。下面这个脚本提供了一种简单的替代方法。
+
+### 用法
+
+该脚本提供了四个主要功能,具体取决于你调用它的名称:`lsf` 列出文件,`lsd` 列出目录,`lsx` 列出可执行文件以及 `lsl` 列出链接。
+
+通过符号链接无需安装该脚本的多个副本。这样可以节省空间并使脚本更新更容易。
+
+该脚本通过使用 `find` 命令进行搜索,然后在找到的每个项目上运行 `ls`。这样做的好处是,任何给脚本的参数都将传递给 `ls` 命令。因此,例如,这可以列出所有文件,甚至包括以点开头的文件:
+
+```
+lsf -a
+```
+
+要以长格式列出目录,请使用 `lsd` 命令:
+
+```
+lsd -l
+```
+
+你可以提供多个参数,以及文件和目录路径。
+
+下面提供了当前目录的父目录和 `/usr/bin` 目录中所有文件的长分类列表:
+
+```
+lsf -F -l .. /usr/bin
+```
+
+目前该脚本不处理递归,仅列出当前目录中的文件。
+
+```
+lsf -R
+```
+
+该脚本不会深入子目录,这个不足有一天可能会进行修复。
+
+### 内部
+
+该脚本采用自上而下的方式编写,其初始化功能位于脚本的开头,而工作主体则接近结尾。脚本中只有两个真正重要的功能。函数 `parse_args()` 会仔细分析命令行,将选项与路径名分开,并处理脚本中的 `ls` 命令行选项中的特定选项。
+
+`list_things_in_dir()` 函数以目录名作为参数并在其上运行 `find` 命令。找到的每个项目都传递给 `ls` 命令进行显示。
+
+### 总结
+
+这是一个可以完成简单功能的简单脚本。它节省了时间,并且在使用大型文件系统时可能会非常有用。
+
+### 脚本
+
+```
+#!/bin/bash
+
+# Script to list:
+# directories (if called "lsd")
+# files (if called "lsf")
+# links (if called "lsl")
+# or executables (if called "lsx")
+# but not any other type of filesystem object.
+# FIXME: add lsp (list pipes)
+#
+# Usage:
+# [switches valid for ls command] [dirname...]
+#
+# Works with names that includes spaces and that start with a hyphen.
+#
+# Created by Nick Clifton.
+# Version 1.4
+# Copyright (c) 2006, 2007 Red Hat.
+#
+# This is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published
+# by the Free Software Foundation; either version 3, or (at your
+# option) any later version.
+
+# It is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# ToDo:
+# Handle recursion, eg: lsl -R
+# Handle switches that take arguments, eg --block-size
+# Handle --almost-all, --ignore-backups, --format and --ignore
+
+main ()
+{
+ init
+
+ parse_args ${1+"$@"}
+
+ list_objects
+
+ exit 0
+}
+
+report ()
+{
+ echo $prog": " ${1+"$@"}
+}
+
+fail ()
+{
+ report " Internal error: " ${1+"$@"}
+ exit 1
+}
+
+# Initialise global variables.
+init ()
+{
+ # Default to listing things in the current directory.
+ dirs[0]=".";
+
+ # num_dirs is the number of directories to be listed minus one.
+ # This is because we are indexing the dirs[] array from zero.
+ num_dirs=0;
+
+ # Default to ignoring things that start with a period.
+ no_dots=1
+
+ # Note - the global variables 'type' and 'opts' are initialised in
+ # parse_args function.
+}
+
+# Parse our command line
+parse_args ()
+{
+ local no_more_args
+
+ no_more_args=0 ;
+
+ prog=`basename $0` ;
+
+ # Decide if we are listing files or directories.
+ case $prog in
+ lsf | lsf.sh)
+ type=f
+ opts="";
+ ;;
+ lsd | lsd.sh)
+ type=d
+ # The -d switch to "ls" is presumed when listing directories.
+ opts="-d";
+ ;;
+ lsl | lsl.sh)
+ type=l
+ # Use -d to prevent the listed links from being followed.
+ opts="-d";
+ ;;
+ lsx | lsx.sh)
+ type=f
+ find_extras="-perm /111"
+ ;;
+ *)
+ fail "Unrecognised program name: '$prog', expected either 'lsd', 'lsf', 'lsl' or 'lsx'"
+ ;;
+ esac
+
+ # Locate any additional command line switches for ls and accumulate them.
+ # Likewise accumulate non-switches to the directories list.
+ while [ $# -gt 0 ]
+ do
+ case "$1" in
+ # FIXME: Handle switches that take arguments, eg --block-size
+ # FIXME: Properly handle --almost-all, --ignore-backups, --format
+ # FIXME: and --ignore
+ # FIXME: Properly handle --recursive
+ -a | -A | --all | --almost-all)
+ no_dots=0;
+ ;;
+ --version)
+ report "version 1.2"
+ exit 0
+ ;;
+ --help)
+ case $type in
+ d) report "a version of 'ls' that lists only directories" ;;
+ l) report "a version of 'ls' that lists only links" ;;
+ f) if [ "x$find_extras" = "x" ] ; then
+ report "a version of 'ls' that lists only files" ;
+ else
+ report "a version of 'ls' that lists only executables";
+ fi ;;
+ esac
+ exit 0
+ ;;
+ --)
+ # A switch to say that all further items on the command line are
+ # arguments and not switches.
+ no_more_args=1 ;
+ ;;
+ -*)
+ if [ "x$no_more_args" = "x1" ] ;
+ then
+ dirs[$num_dirs]="$1";
+ let "num_dirs++"
+ else
+ # Check for a switch that just uses a single dash, not a double
+ # dash. This could actually be multiple switches combined into
+ # one word, eg "lsd -alF". In this case, scan for the -a switch.
+ # XXX: FIXME: The use of =~ requires bash v3.0+.
+ if [[ "x${1:1:1}" != "x-" && "x$1" =~ "x-.*a.*" ]] ;
+ then
+ no_dots=0;
+ fi
+ opts="$opts $1";
+ fi
+ ;;
+ *)
+ dirs[$num_dirs]="$1";
+ let "num_dirs++"
+ ;;
+ esac
+ shift
+ done
+
+ # Remember that we are counting from zero not one.
+ if [ $num_dirs -gt 0 ] ;
+ then
+ let "num_dirs--"
+ fi
+}
+
+list_things_in_dir ()
+{
+ local dir
+
+ # Paranoia checks - the user should never encounter these.
+ if test "x$1" = "x" ;
+ then
+ fail "list_things_in_dir called without an argument"
+ fi
+
+ if test "x$2" != "x" ;
+ then
+ fail "list_things_in_dir called with too many arguments"
+ fi
+
+ # Use quotes when accessing $dir in order to preserve
+ # any spaces that might be in the directory name.
+ dir="${dirs[$1]}";
+
+ # Catch directory names that start with a dash - they
+ # confuse pushd.
+ if test "x${dir:0:1}" = "x-" ;
+ then
+ dir="./$dir"
+ fi
+
+ if [ -d "$dir" ]
+ then
+ if [ $num_dirs -gt 0 ]
+ then
+ echo " $dir:"
+ fi
+
+ # Use pushd rather passing the directory name to find so that the
+ # names that find passes on to xargs do not have any paths prepended.
+ pushd "$dir" > /dev/null
+ if [ $no_dots -ne 0 ] ; then
+ find . -maxdepth 1 -type $type $find_extras -not -name ".*" -printf "%f\000" \
+ | xargs --null --no-run-if-empty ls $opts -- ;
+ else
+ find . -maxdepth 1 -type $type $find_extras -printf "%f\000" \
+ | xargs --null --no-run-if-empty ls $opts -- ;
+ fi
+ popd > /dev/null
+ else
+ report "directory '$dir' could not be found"
+ fi
+}
+
+list_objects ()
+{
+ local i
+
+ i=0;
+ while [ $i -le $num_dirs ]
+ do
+ list_things_in_dir i
+ let "i++"
+ done
+}
+
+# Invoke main
+main ${1+"$@"}
+```
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/2/script-large-files
+
+作者:[Nick Clifton][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/nickclifton
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/bash_command_line.png?itok=k4z94W2U (bash logo on green background)
diff --git a/published/20200219 Waterfox- Firefox Fork With Legacy Add-ons Options.md b/published/20200219 Waterfox- Firefox Fork With Legacy Add-ons Options.md
new file mode 100644
index 0000000000..959c2b5f9e
--- /dev/null
+++ b/published/20200219 Waterfox- Firefox Fork With Legacy Add-ons Options.md
@@ -0,0 +1,106 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-12033-1.html)
+[#]: subject: (Waterfox: Firefox Fork With Legacy Add-ons Options)
+[#]: via: (https://itsfoss.com/waterfox-browser/)
+[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
+
+水狐:一个支持旧版扩展的火狐复刻版
+======
+
+> 在本周的开源软件推荐中,我们将介绍一个基于 Firefox 的浏览器,该浏览器支持 Firefox 如今已不再支持的旧版扩展,同时尽可能地提供了快速的用户体验。
+
+在 Web 浏览器方面,虽然谷歌浏览器已经占据了最大的市场份额,但 [Mozilla Firefox 仍然是关切隐私的主流 Web 浏览器的一面大旗][1]。
+
+Firefox 最近有了很多改进,这些改进的副作用之一是它删除了旧版扩展附件的支持。如果你最喜欢的扩展附件在最近几个月/几年内消失了,那么你可以以 Witerfox 的形式再次拥有它们。
+
+> 注意!
+>
+> 我们注意到,Waterfox 已被 System1 收购。该公司还收购了注重隐私的搜索引擎 Startpage。尽管 System1 声称他们提供注重隐私的产品,因为“这是刚需”,但我们不能对此担保。换句话说,这要取决于你是否信任 System1 和 Waterfox。
+
+### Waterfox:一个基于 Firefox 的浏览器
+
+![Waterfox Classic][2]
+
+[Waterfox][3] 是基于 Firefox 构建的一个好用的开源浏览器,它注重隐私并支持旧版扩展。它没有将自己定位为偏执于隐私的浏览器,但确实尊重这个基本的认知。
+
+你可以得到两个单独的 Waterfox 浏览器版本。当前版旨在提供现代体验,而经典版则旨在支持 [NPAPI 插件][4] 和 [bootstrap 扩展][5]。
+
+![Waterfox Classic][6]
+
+如果你不需要使用 bootstrap 扩展程序,而是需要 [WebExtensions][7],则应该选择 Waterfox 当前版。
+
+而如果你需要设置一个需要大量 NPAPI 插件或 Bootstrap 扩展的浏览器,则 Waterfox 经典版将非常适合你。
+
+因此,如果你喜欢 Firefox,但想在同一阵营内尝试一些不同的体验,那么这个 Firefox 替代选择就是为此而生的。
+
+### Waterfox 的功能
+
+![Waterfox Current][8]
+
+当然,从技术上讲,你应该能够做 Mozilla Firefox 支持的许多操作。
+
+因此,我将在此处的列表中突出显示 Waterfox 的所有重要功能。
+
+* 支持 NPAPI 插件
+* 支持 Bootstrap 扩展
+* 分别提供了支持旧版本扩展和现代的 WebExtension 两个版本。
+* 跨平台支持(Windows、Linux 和 macOS)
+* 主题定制
+* 支持已经归档的扩展
+
+### 在 Ubuntu/Linux 上安装 Waterfox
+
+与其他流行的浏览器不同,它没有可以安装的软件包。因此,你将必须从其[官方下载页面][9]下载归档包。
+
+![][10]
+
+根据你想要的版本(当前版/经典版),只需下载该文件,它是以 .tar.bz2 为扩展名的文件。
+
+下载后,只需解压缩文件即可。
+
+接下来,转到解压缩的文件夹并查找 `Waterfox` 文件。你只需双击它即可运行以启动浏览器。
+
+如果这不起作用,则可以使用终端并导航到提取的 `Waterfox` 文件夹。到达那里后,你只需使用一个命令即可运行它。看起来如下:
+
+```
+cd waterfox-classic
+./waterfox
+```
+
+无论是哪种情况,你都可以访问其 [GitHub 页面][11]以了解将其安装在系统上的更多方式。
+
+- [下载 Waterfox][3]
+
+### 总结
+
+我在我的 Pop!_OS 19.10 系统中启动了它,在我这里工作的很好。尽管我不准备从 Firefox 切换到 Waterfox,因为我没有使用任何旧版扩展附件。但对于某些用户来说,它可能是一个重要选择。
+
+你可以尝试一下,在下面的评论中让我知道你的想法。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/waterfox-browser/
+
+作者:[Ankush Das][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/ankush/
+[b]: https://github.com/lujun9972
+[1]: https://itsfoss.com/why-firefox/
+[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/02/waterfox-classic.png?fit=800%2C423&ssl=1
+[3]: https://www.waterfox.net/
+[4]: https://en.wikipedia.org/wiki/NPAPI
+[5]: https://wiki.mozilla.org/Extension_Manager:Bootstrapped_Extensions
+[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/02/waterfox-classic-screenshot.jpg?ssl=1
+[7]: https://wiki.mozilla.org/WebExtensions
+[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/02/waterfox-screenshot.jpg?ssl=1
+[9]: https://www.waterfox.net/download/
+[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/02/waterfox-download-page.jpg?ssl=1
+[11]: https://github.com/MrAlex94/Waterfox
diff --git a/translated/tech/20200224 Using C and C-- for data science.md b/published/20200224 Using C and C-- for data science.md
similarity index 82%
rename from translated/tech/20200224 Using C and C-- for data science.md
rename to published/20200224 Using C and C-- for data science.md
index c2b3ca0a87..f1dfdce174 100644
--- a/translated/tech/20200224 Using C and C-- for data science.md
+++ b/published/20200224 Using C and C-- for data science.md
@@ -1,8 +1,8 @@
[#]: collector: (lujun9972)
[#]: translator: (wxy)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11950-1.html)
[#]: subject: (Using C and C++ for data science)
[#]: via: (https://opensource.com/article/20/2/c-data-science)
[#]: author: (Cristiano L. Fontana https://opensource.com/users/cristianofontana)
@@ -10,30 +10,29 @@
在数据科学中使用 C 和 C++
======
-> 让我们使用 C99 和 C++ 11 完成常见的数据科学任务。
+> 让我们使用 C99 和 C++11 完成常见的数据科学任务。
![metrics and data shown on a computer screen][1]
虽然 [Python][2] 和 [R][3] 之类的语言在数据科学中越来越受欢迎,但是 C 和 C++ 对于高效的数据科学来说是一个不错的选择。在本文中,我们将使用 [C99][4] 和 [C++11][5] 编写一个程序,该程序使用 [Anscombe 的四重奏][6]数据集,下面将对其进行解释。
-我在一篇涉及 [Python 和 GNU Octave][7] 的文章中写了我不断学习语言的动机,值得大家回顾。所有程序都应在[命令行][8]上运行,而不是在[图形用户界面(GUI)][9]上运行。完整的示例可在 [polyglot_fit 存储库][10]中找到。
+我在一篇涉及 [Python 和 GNU Octave][7] 的文章中写了我不断学习编程语言的动机,值得大家回顾。这里所有的程序都需要在[命令行][8]上运行,而不是在[图形用户界面(GUI)][9]上运行。完整的示例可在 [polyglot_fit 存储库][10]中找到。
### 编程任务
你将在本系列中编写的程序:
-* 从 [CSV 文件] [11]中读取数据
+* 从 [CSV 文件][11]中读取数据
* 用直线插值数据(即 `f(x)=m ⋅ x + q`)
* 将结果绘制到图像文件
-这是许多数据科学家遇到的普遍情况。示例数据是 [Anscombe 的四重奏] [6]的第一组,如下表所示。这是一组人工构建的数据,当拟合直线时可以提供相同的结果,但是它们的曲线非常不同。数据文件是一个文本文件,其中的制表符用作列分隔符,几行作为标题。该任务将仅使用第一组(即前两列)。
-
-[Anscombe 的四重奏][6]
+这是许多数据科学家遇到的普遍情况。示例数据是 [Anscombe 的四重奏][6]的第一组,如下表所示。这是一组人工构建的数据,当拟合直线时可以提供相同的结果,但是它们的曲线非常不同。数据文件是一个文本文件,其中的制表符用作列分隔符,前几行作为标题。该任务将仅使用第一组(即前两列)。
+![](https://img.linux.net.cn/data/attachment/album/202002/29/122805h3yrs1dkrgysssxk.png)
### C 语言的方式
-[C][12] 语言是通用编程语言,是当今使用最广泛的语言之一(依据 [TIOBE 榜单][13]、[RedMonk 编程语言排名][14]、[编程语言流行度榜单][15]和 [GitHub Octoverse 状态][16])。这是一种相当古老的语言(大约诞生在 1973 年),并且用它编写了许多成功的程序(例如 Linux 内核和 Git 仅是其中两个例子)。它也是最接近计算机内部运行的语言之一,因为它直接用于操作内存。它是一种[编译语言] [17];因此,源代码必须由[编译器][18]转换为[机器代码][19]。它的[标准库][20]很小,功能也不多,因此开发了其他库来提供缺少的功能。
+[C][12] 语言是通用编程语言,是当今使用最广泛的语言之一(依据 [TIOBE 指数][13]、[RedMonk 编程语言排名][14]、[编程语言流行度指数][15]和 [GitHub Octoverse 状态][16] 得来)。这是一种相当古老的语言(大约诞生在 1973 年),并且用它编写了许多成功的程序(例如 Linux 内核和 Git 仅是其中的两个例子)。它也是最接近计算机内部运行机制的语言之一,因为它直接用于操作内存。它是一种[编译语言][17];因此,源代码必须由[编译器][18]转换为[机器代码][19]。它的[标准库][20]很小,功能也不多,因此人们开发了其它库来提供缺少的功能。
我最常在[数字运算][21]中使用该语言,主要是因为其性能。我觉得使用起来很繁琐,因为它需要很多[样板代码][22],但是它在各种环境中都得到了很好的支持。C99 标准是最新版本,增加了一些漂亮的功能,并且得到了编译器的良好支持。
@@ -41,7 +40,7 @@
#### 安装
-要使用 C99 进行开发,你需要一个编译器。我通常使用 [Clang][23],不过 [GCC][24] 是另一个有效的开源编译器。对于线性拟合,我选择使用 [GNU 科学库] [25]。对于绘图,我找不到任何明智的库,因此该程序依赖于外部程序:[Gnuplot] [26]。该示例还使用动态数据结构来存储数据,该结构在[伯克利软件分发版(BSD)][27]中定义。
+要使用 C99 进行开发,你需要一个编译器。我通常使用 [Clang][23],不过 [GCC][24] 是另一个有效的开源编译器。对于线性拟合,我选择使用 [GNU 科学库][25]。对于绘图,我找不到任何明智的库,因此该程序依赖于外部程序:[Gnuplot][26]。该示例还使用动态数据结构来存储数据,该结构在[伯克利软件分发版(BSD)][27]中定义。
在 [Fedora][28] 中安装很容易:
@@ -49,7 +48,7 @@
sudo dnf install clang gnuplot gsl gsl-devel
```
-#### 注释代码
+#### 代码注释
在 C99 中,[注释][29]的格式是在行的开头放置 `//`,行的其它部分将被解释器丢弃。另外,`/*` 和 `*/` 之间的任何内容也将被丢弃。
@@ -65,7 +64,7 @@ sudo dnf install clang gnuplot gsl gsl-devel
* [头文件][30],其中包含函数说明
* 包含函数定义的源文件
-头文件包含在源文件中,而库文件的源文件则与可执行文件[链接][31]。因此,此示例所需的头文件是:
+头文件包含在源文件中,而库文件的源文件则[链接][31]到可执行文件。因此,此示例所需的头文件是:
```
// 输入/输出功能
@@ -83,7 +82,7 @@ sudo dnf install clang gnuplot gsl gsl-devel
#### 主函数
-在 C 语言中,程序必须位于称为主函数 [main()][32]:的特殊函数内:
+在 C 语言中,程序必须位于称为主函数 [main()][32] 的特殊函数内:
```
int main(void) {
@@ -95,7 +94,7 @@ int main(void) {
#### 定义变量
-在 C 语言中,变量必须在使用前声明,并且必须与类型关联。每当你要使用变量时,都必须决定要在其中存储哪种数据。你也可以指定是否打算将变量用作常量值,这不是必需的,但是编译器可以从此信息中受益。 来自存储库中的 [fitting_C99.c 程序] [33]:
+在 C 语言中,变量必须在使用前声明,并且必须与类型关联。每当你要使用变量时,都必须决定要在其中存储哪种数据。你也可以指定是否打算将变量用作常量值,这不是必需的,但是编译器可以从此信息中受益。 以下来自存储库中的 [fitting_C99.c 程序][33]:
```
const char *input_file_name = "anscombe.csv";
@@ -113,7 +112,7 @@ C 语言中的数组不是动态的,从某种意义上说,数组的长度必
int data_array[1024];
```
-由于你通常不知道文件中有多少个数据点,因此请使用[单链接列表][34]。这是一个动态数据结构,可以无限增长。幸运的是,BSD [提供了链表][35]。这是一个示例定义:
+由于你通常不知道文件中有多少个数据点,因此请使用[单链列表][34]。这是一个动态数据结构,可以无限增长。幸运的是,BSD [提供了链表][35]。这是一个示例定义:
```
struct data_point {
@@ -145,7 +144,7 @@ printf("Slope: %f\n", slope);
#### 读取数据
-现在来到了困难的部分……有一些用 C 语言解析 CSV 文件的库,但是似乎没有一个库足够稳定或流行到可以放入到 Fedora 软件包存储库中。我没有为本教程添加依赖项,而是决定自己编写此部分。同样,讨论这些细节太啰嗦了,所以我只会解释大致的思路。为了简洁起见,将忽略源代码中的某些行,但是你可以在存储库中找到完整的示例。
+现在来到了困难的部分……有一些用 C 语言解析 CSV 文件的库,但是似乎没有一个库足够稳定或流行到可以放入到 Fedora 软件包存储库中。我没有为本教程添加依赖项,而是决定自己编写此部分。同样,讨论这些细节太啰嗦了,所以我只会解释大致的思路。为了简洁起见,将忽略源代码中的某些行,但是你可以在存储库中找到完整的示例代码。
首先,打开输入文件:
@@ -210,7 +209,7 @@ double *x = malloc(sizeof(double) * entries_number);
double *y = malloc(sizeof(double) * entries_number);
```
-然后,遍历链接列表以将相关数据保存到数组:
+然后,遍历链表以将相关数据保存到数组:
```
SLIST_FOREACH(datum, &head, entries) {
@@ -224,7 +223,7 @@ SLIST_FOREACH(datum, &head, entries) {
}
```
-现在你已经完成了链接列表,请清理它。要**总是**释放已手动分配的内存,以防止[内存泄漏][48]。内存泄漏是糟糕的、糟糕的、糟糕的(重要的话说三遍)。每次内存没有释放时,花园侏儒都会找不到自己的头:
+现在你已经处理完了链表,请清理它。要**总是**释放已手动分配的内存,以防止[内存泄漏][48]。内存泄漏是糟糕的、糟糕的、糟糕的(重要的话说三遍)。每次内存没有释放时,花园侏儒都会找不到自己的头:
```
while (!SLIST_EMPTY(&head)) {
@@ -278,7 +277,7 @@ plot 'fit_C99.csv' using 1:2 with lines title 'Fit', 'anscombe.csv' using 1:2 wi
clang -std=c99 -I/usr/include/ fitting_C99.c -L/usr/lib/ -L/usr/lib64/ -lgsl -lgslcblas -o fitting_C99
```
-这个命令告诉编译器使用 C99 标准,读取 `fitting_C99.c` 文件,加载 `gsl` 和 `gslcblas` 库,并将结果保存到 `fitting_C99`。命令行上的结果输出为:
+这个命令告诉编译器使用 C99 标准、读取 `fitting_C99.c` 文件、加载 `gsl` 和 `gslcblas` 库、并将结果保存到 `fitting_C99`。命令行上的结果输出为:
```
#### Anscombe's first set with C99 ####
@@ -287,13 +286,13 @@ Intercept: 3.000091
Correlation coefficient: 0.816421
```
-这是用 Gnuplot 生成的结果图像。
+这是用 Gnuplot 生成的结果图像:
![Plot and fit of the dataset obtained with C99][52]
### C++11 方式
-[C++][53] 语言是一种通用编程语言,也是当今使用的最受欢迎的语言之一。它是作为 [C 的继承人][54]创建的(诞生于 1983 年),重点是[面向对象程序设计(OOP)][55]。C++ 通常被视为 C 的超集,因此 C 程序应该能够使用 C++ 编译器进行编译。这并非完全正确,因为在某些极端情况下它们的行为有所不同。 根据我的经验,C++ 比 C 需要更少的样板代码,但是如果要进行对象开发,语法会更困难。C++11 标准是最新版本,增加了一些漂亮的功能,并且或多或少得到了编译器的支持。
+[C++][53] 语言是一种通用编程语言,也是当今使用的最受欢迎的语言之一。它是作为 [C 的继承人][54]创建的(诞生于 1983 年),重点是[面向对象程序设计(OOP)][55]。C++ 通常被视为 C 的超集,因此 C 程序应该能够使用 C++ 编译器进行编译。这并非完全正确,因为在某些极端情况下它们的行为有所不同。 根据我的经验,C++ 与 C 相比需要更少的样板代码,但是如果要进行面向对象开发,语法会更困难。C++11 标准是最新版本,增加了一些漂亮的功能,并且基本上得到了编译器的支持。
由于 C++ 在很大程度上与 C 兼容,因此我将仅强调两者之间的区别。我在本部分中没有涵盖的任何部分,则意味着它与 C 中的相同。
@@ -309,7 +308,6 @@ sudo dnf install clang gnuplot gsl gsl-devel
库的工作方式与 C 语言相同,但是 `include` 指令略有不同:
-
```
#include
#include
@@ -325,7 +323,7 @@ extern "C" {
}
```
-由于 GSL 库是用 C 编写的,因此你必须将这种特殊性告知编译器。
+由于 GSL 库是用 C 编写的,因此你必须将这个特殊情况告知编译器。
#### 定义变量
@@ -429,17 +427,17 @@ Intercept: 3.00009
Correlation coefficient: 0.816421
```
-这就是用 Gnuplot 生成的结果图像。
+这就是用 Gnuplot 生成的结果图像:
![Plot and fit of the dataset obtained with C++11][58]
### 结论
-本文提供了用 C99 和 C++11 编写的数据拟合和绘图任务的示例。由于 C++ 在很大程度上与 C 兼容,因此本文利用了它们的相似性来编写了第二个示例。在某些方面,C++ 更易于使用,因为它部分减轻了显式管理内存的负担。但是其语法更加复杂,因为它引入了为 OOP 编写类的可能性。但是,仍然可以用 C 使用 OOP 方法编写软件。由于 OOP 是一种编程风格,因此可以以任何语言使用。在 C 中有一些很好的 OOP 示例,例如 [GObject][59] 和 [Jansson][60]库。
+本文提供了用 C99 和 C++11 编写的数据拟合和绘图任务的示例。由于 C++ 在很大程度上与 C 兼容,因此本文利用了它们的相似性来编写了第二个示例。在某些方面,C++ 更易于使用,因为它部分减轻了显式管理内存的负担。但是其语法更加复杂,因为它引入了为 OOP 编写类的可能性。但是,仍然可以用 C 使用 OOP 方法编写软件。由于 OOP 是一种编程风格,因此可以在任何语言中使用。在 C 中有一些很好的 OOP 示例,例如 [GObject][59] 和 [Jansson][60]库。
对于数字运算,我更喜欢在 C99 中进行,因为它的语法更简单并且得到了广泛的支持。直到最近,C++11 还没有得到广泛的支持,我倾向于避免使用先前版本中的粗糙不足之处。对于更复杂的软件,C++ 可能是一个不错的选择。
-你是否也将 C 或 C++ 用于数据科学? 在评论中分享你的经验。
+你是否也将 C 或 C++ 用于数据科学?在评论中分享你的经验。
--------------------------------------------------------------------------------
@@ -448,7 +446,7 @@ via: https://opensource.com/article/20/2/c-data-science
作者:[Cristiano L. Fontana][a]
选题:[lujun9972][b]
译者:[wxy](https://github.com/wxy)
-校对:[校对者ID](https://github.com/校对者ID)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
@@ -460,7 +458,7 @@ via: https://opensource.com/article/20/2/c-data-science
[4]: https://en.wikipedia.org/wiki/C99
[5]: https://en.wikipedia.org/wiki/C%2B%2B11
[6]: https://en.wikipedia.org/wiki/Anscombe%27s_quartet
-[7]: https://opensource.com/article/20/2/python-gnu-octave-data-science
+[7]: https://linux.cn/article-11943-1.html
[8]: https://en.wikipedia.org/wiki/Command-line_interface
[9]: https://en.wikipedia.org/wiki/Graphical_user_interface
[10]: https://gitlab.com/cristiano.fontana/polyglot_fit
diff --git a/translated/tech/20200224 What developers need to know about domain-specific languages.md b/published/20200224 What developers need to know about domain-specific languages.md
similarity index 53%
rename from translated/tech/20200224 What developers need to know about domain-specific languages.md
rename to published/20200224 What developers need to know about domain-specific languages.md
index 299ed726fc..c0e01b7923 100644
--- a/translated/tech/20200224 What developers need to know about domain-specific languages.md
+++ b/published/20200224 What developers need to know about domain-specific languages.md
@@ -1,36 +1,36 @@
[#]: collector: (lujun9972)
[#]: translator: (HankChow)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11957-1.html)
[#]: subject: (What developers need to know about domain-specific languages)
[#]: via: (https://opensource.com/article/20/2/domain-specific-languages)
[#]: author: (Girish Managoli https://opensource.com/users/gammay)
-开发者需要了解的领域特定语言
+开发者需要了解的领域特定语言(DSL)
======
+
> 领域特定语言是在特定领域下用于特定上下文的语言。作为开发者,很有必要了解领域特定语言的含义,以及为什么要使用特定领域语言。
-![Various programming languages in use][1]
+![](https://img.linux.net.cn/data/attachment/album/202003/04/112240b0os2988kolritlo.jpg)
-领域特定语言(DSL)是在特定领域下用于特定上下文的语言。这里的领域是指某种商业上的(例如银行业、保险业等)上下文,也可以指某种应用程序的(例如 Web 应用、数据库等)上下文。与之相比的另一个概念是通用语言(GPL),通用语言则可以广泛应用于各种商业或应用问题当中。
+领域特定语言(DSL)是一种旨在特定领域下的上下文的语言。这里的领域是指某种商业上的(例如银行业、保险业等)上下文,也可以指某种应用程序的(例如 Web 应用、数据库等)上下文。与之相比的另一个概念是通用语言(GPL,LCTT 译注:注意不要和 GPL 许可证混淆),通用语言则可以广泛应用于各种商业或应用问题当中。
DSL 并不具备很强的普适性,它是仅为某个适用的领域而设计的,但它也足以用于表示这个领域中的问题以及构建对应的解决方案。HTML 是 DSL 的一个典型,它是在 Web 应用上使用的语言,尽管 HTML 无法进行数字运算,但也不影响它在这方面的广泛应用。
-而 GPL 则没有特定针对的领域,GPL 的设计者不可能知道这种语言会在什么领域被使用,更不清楚用户打算解决的问题是什么,因此 GPL 会被设计成可用于解决任何一种问题、适合任何一种业务、满足任何一种需求。例如 Java 就属于 GPL,它可以在 PC 或移动设备上运行,嵌入到银行、金融、保险、制造业等各种行业的应用中去。
+而 GPL 则没有特定针对的领域,这种语言的设计者不可能知道这种语言会在什么领域被使用,更不清楚用户打算解决的问题是什么,因此 GPL 会被设计成可用于解决任何一种问题、适合任何一种业务、满足任何一种需求。例如 Java 就属于 GPL,它可以在 PC 或移动设备上运行,嵌入到银行、金融、保险、制造业等各种行业的应用中去。
### DSL 的类别
从使用方式的角度,语言可以划分出以下两类:
- * DSL:使用 DSL 形式编写或表示的语言
- * 宿主语言:用于执行或处理 DSL 的语言
+* DSL:使用 DSL 形式编写或表示的语言
+* 宿主语言:用于执行或处理 DSL 的语言
-当 DSL 以独有的形式表达,并由另一种宿主语言来处理时,这种 DSL 称为外部 DSL。
-
-以下就是可以在宿主语言中处理的 SQL:
+由不同的语言编写并由另一种宿主语言处理的 DSL 被称为外部 DSL。
+以下就是可以在宿主语言中处理的 SQL 形式的 DSL:
```
SELECT account
@@ -40,22 +40,27 @@ WHERE account = '123' AND branch = 'abc' AND amount >= 1000
因此,只要在规定了词汇和语法的情况下,DSL 也可以直接使用英语来编写,并使用诸如 ANTLR 这样的解析器生成器以另一种宿主语言来处理 DSL:
-
```
-`if smokes then increase premium by 10%`
+if smokes then increase premium by 10%
```
-如果 DSL 和宿主语言是同一种语言,这种 DSL 称为内部 DSL,其中 DSL 由以同一种语义的宿主语言编写和处理,因此又称为嵌入式 DSL。以下是两个例子:
+如果 DSL 和宿主语言是同一种语言,这种 DSL 称为内部DSL,其中 DSL 由以同一种语义的宿主语言编写和处理,因此又称为嵌入式 DSL。以下是两个例子:
- * Bash 形式的 DSL 可以由 Bash 解释器执行:`if today_is_christmas; then apply_christmas_discount; fi` 同时这也是一段看起来符合英语语法的 Bash。
- * 使用类似 Java 语法编写的 DSL:
+* Bash 形式的 DSL 可以由 Bash 解释器执行:
+
+ ```
+if today_is_christmas; then apply_christmas_discount; fi
```
+ 同时这也是一段看起来符合英语语法的 Bash。
+* 使用类似 Java 语法编写的 DSL:
+
+ ```
orderValue = orderValue
.applyFestivalDiscount()
.applyCustomerLoyalityDiscount()
.applyCustomerAgeDiscount();
```
-这一段的可读性也相当强。
+ 这一段的可读性也相当强。
实际上,DSL 和 GPL 之间并没有非常明确的界限。
@@ -63,18 +68,16 @@ orderValue = orderValue
以下这些语言都可以作为 DSL 使用:
- * Web 应用:HTML
- * Shell:用于类 Unix 系统的 sh、Bash、CSH 等;用于 Windows 系统的 MS-DOS、Windows Terminal、PowerShell 等
- * 标记语言:XML
- * 建模:UML
- * 数据处理:SQL 及其变体
- * 业务规则管理:Drools
- * 硬件:Verilog、VHD
- * 构建工具:Maven、Gradle
- * 数值计算和模拟:MATLAB(商业)、GNU Octave、Scilab
- * 解析器和生成器:Lex、YACC、GNU Bison、ANTLR
-
-
+* Web 应用:HTML
+* Shell:用于类 Unix 系统的 sh、Bash、CSH 等;用于 Windows 系统的 MS-DOS、Windows Terminal、PowerShell 等
+* 标记语言:XML
+* 建模:UML
+* 数据处理:SQL 及其变体
+* 业务规则管理:Drools
+* 硬件:Verilog、VHD
+* 构建工具:Maven、Gradle
+* 数值计算和模拟:MATLAB(商业)、GNU Octave、Scilab
+* 解析器和生成器:Lex、YACC、GNU Bison、ANTLR
### 为什么要使用 DSL?
@@ -92,25 +95,22 @@ DSL 的优点是,它对于领域的特征捕捉得非常好,同时它不像
开源的 DSL 软件包括:
- * Xtext:Xtext 可以与 Eclipse 集成,并支持 DSL 开发。它能够实现代码生成,因此一些开源和商业产品都用它来提供特定的功能。用于农业活动建模分析的多用途农业数据系统(MADS)就是基于 Xtext 实现的一个项目,可惜的是这个项目现在已经不太活跃了。
- * JetBrains MPS:JetBrains MPS 是一个可供开发 DSL 的集成开发环境,它将文档在底层存储为一个抽象树结构(Microsoft Word 也使用了这一概念),因此它也自称为一个投影编辑器。JetBrains MPS 支持 Java、C、JavaScript 和 XML 的代码生成。
+* Xtext:Xtext 可以与 Eclipse 集成,并支持 DSL 开发。它能够实现代码生成,因此一些开源和商业产品都用它来提供特定的功能。用于农业活动建模分析的多用途农业数据系统(MADS)就是基于 Xtext 实现的一个项目,可惜的是这个项目现在已经不太活跃了。
+* JetBrains MPS:JetBrains MPS 是一个可供开发 DSL 的集成开发环境,它将文档在底层存储为一个抽象树结构(Microsoft Word 也使用了这一概念),因此它也自称为一个投影编辑器。JetBrains MPS 支持 Java、C、JavaScript 和 XML 的代码生成。
### DSL 的最佳实践
如果你想使用 DSL,记住以下几点:
- * DSL 不同于 GPL,DSL 只能用于解决特定领域中有限范围内的问题。
- * 不必动辄建立自己的 DSL,可以首先尝试寻找已有的 DSL。例如 [DSLFIN][4] 这个网站就提供了很多金融方面的 DSL。在实在找不到合适的 DSL 的情况下,才需要建立自己的 DSL。
- * DSL 最好像平常的语言一样具有可读性。
- * 尽管代码生成不是一项必需的工作,但它确实会大大提高工作效率。
- * 虽然 DSL 被称为语言,但 DSL 不需要像 GPL 一样可以被执行,可执行性并不是 DSL 需要达到的目的。
- * DSL 可以使用文本编辑器编写,但专门的 DSL 编辑器可以更轻松地完成 DSL 的语法和语义检查。
-
-
+* DSL 不同于 GPL,DSL 只能用于解决特定领域中有限范围内的问题。
+* 不必动辄建立自己的 DSL,可以首先尝试寻找已有的 DSL。例如 [DSLFIN][4] 这个网站就提供了很多金融方面的 DSL。在实在找不到合适的 DSL 的情况下,才需要建立自己的 DSL。
+* DSL 最好像平常的语言一样具有可读性。
+* 尽管代码生成不是一项必需的工作,但它确实会大大提高工作效率。
+* 虽然 DSL 被称为语言,但 DSL 不需要像 GPL 一样可以被执行,可执行性并不是 DSL 需要达到的目的。
+* DSL 可以使用文本编辑器编写,但专门的 DSL 编辑器可以更轻松地完成 DSL 的语法和语义检查。
如果你正在使用或将要使用 DSL,欢迎在评论区留言。
-
--------------------------------------------------------------------------------
via: https://opensource.com/article/20/2/domain-specific-languages
@@ -118,7 +118,7 @@ via: https://opensource.com/article/20/2/domain-specific-languages
作者:[Girish Managoli][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/20200225 3 eBook readers for the Linux desktop.md b/published/20200225 3 eBook readers for the Linux desktop.md
new file mode 100644
index 0000000000..07fbb8f09a
--- /dev/null
+++ b/published/20200225 3 eBook readers for the Linux desktop.md
@@ -0,0 +1,113 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wenwensnow)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11990-1.html)
+[#]: subject: (3 eBook readers for the Linux desktop)
+[#]: via: (https://opensource.com/article/20/2/linux-ebook-readers)
+[#]: author: (Scott Nesbitt https://opensource.com/users/scottnesbitt)
+
+可在 Linux 桌面使用的 3 个电子书阅读器应用
+======
+
+> 任意一个开源电子书应用都能使你在大屏设备上的阅读体验得到提升。
+
+![电脑浏览器阅读书籍界面][1]
+
+我通常使用手机或 Kobo 阅读器阅读电子书,总是没有在大屏设备上阅读书籍那么爽。很多人经常在自己的笔记本或桌面电脑上阅读电子书,如果你有这种需求(或者你认为以后会遇到这种情况),我想向你介绍三种 Linux 桌面下的电子书阅读器。
+
+### Bookworm(书虫)
+
+[Bookworm][2] 意在成为一个“简洁、专注的电子书阅读器”。事实证明它也确实做到了。Bookworm 内置一系列基础功能,有人抱怨它太过*简单*,缺少*功能性*(虽然这词显然有点指意不明)。Bookworm 起到了应有的作用而没有无关的花哨功能。
+
+该应用的界面整洁干净。
+
+![Bookworm 电子书应用][3]
+
+你可通过以下方式查看书籍:
+
+* 空格键前往下一页
+* 上下方向键按行移动
+* 左右方向键跳转至前后章节
+
+你也可以通过添加注释或书签跳转至特定页面。
+
+![Bookworm 注释][4]
+
+Bookworm 没有太多设置选项。你能调整书籍字体大小及间距,开启双页模式或夜间模式。在应用中添加新文件夹后,Bookworm 会自动扫描文件夹中的电子书。
+
+![Bookworm 参数设置][5]
+
+Bookworm 支持常用的电子书格式:EPUB、PDF、MOBI、[FB2][6],你还能用它阅读 [CBR][7] 和 CBZ 格式的数字版漫画。我只在 Bookworm 上测试了前三种格式,PDF 倒是能打开,但加载速度很慢,格式也很难看。
+
+### Foliate
+
+单从功能上来说,[Foliate][8] 确实比 Bookworm 强上一些。Foliate 不仅功能更强,它还有更多设置选项。这个功能多样、简单干净的应用满足了所有要求。
+
+![Foliate 电子书应用][9]
+
+在 Foliate 中可以通过空格、方向键、向上或向下翻页键浏览电子书,这里没什么特别的。
+
+你还可以在书籍中添加注释、查找以及翻译字句、查询字词含义。如果你电脑上安装了智能语音应用, Foliate 还能将文本朗读出来。
+
+![在 Foliate 中的注释文本][10]
+
+Foliate 与 Bookworm 相比有更多自定义选项。你能在应用中修改字体类型及大小、行间距、电子书页边距,也可以调高或降低屏幕亮度,从应用内置的四个主题中选择一个等。
+
+![Foliate 设置][11]
+
+你可以在 Foliate 上阅读 EPUB、MOBI、AZW、AZW3 格式的电子书。如果你不了解,我可以提前告诉你,后三种格式是亚马逊 Kindle 阅读器上架的书籍的闭源格式。
+
+### Calibre 电子书阅读器
+
+这个[电子书阅读器][12]是 [Calibre][13] 电子书管理工具的一个组件,就像它的前代一样,电子书阅读器这部分并不是软件整体最棒的部分。
+
+![电子书阅读器应用][14]
+
+不过别被上面的话吓到,它也的确是个桌面电子书阅读器。
+
+在 Calibre 电子书阅读器中,你可以通过方向键、向上/向下翻页键以及空格浏览书籍,还能在在线字典中查找词语含义,添加书签。这一阅读器没有注释功能,但内置的搜索引擎却很好用,你还能将书籍保存为 PDF 格式(虽然我不太明白你为什么要这么做)。
+
+不过参数设置这里确是它出彩的地方,它的可选设置比 Bookworm 和 Foliate 加起来都多,从字体到文本布局,页面分割方式你都能改。除此之外,你还能自定义应用按键设置,将你喜欢的词典网站添加进来,方便阅读查找。
+
+![电子书参数设置][15]
+
+Calibre 电子书阅读器一个很有用的功能,就是把自行设置的 CSS 配置文件效果应用到电子书上。赘言一句,CSS 是一种调整网页格式的方法(这类文件就是许多电子书的一个组成部分)。如果你是使用 CSS 的高手,你可以将自己的 CSS 文件复制粘贴到配置窗口的 “User stylesheet” 部分,这就是个性化的究极办法。
+
+据开发者描述,这一电子书阅读器“能支持所有主流电子书格式”。如果你想知道具体支持格式是什么,[这是列表链接][16]。我测试了列表中的一小部分格式,没有发现问题。
+
+### 留在最后的话
+
+不管你只是单纯想找个电子书阅读器,还是有个更多复杂功能的应用,上文提到的三个选择都很不错,而且它们都能提升你在大屏设备上的阅读体验。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/2/linux-ebook-readers
+
+作者:[Scott Nesbitt][a]
+选题:[lujun9972][b]
+译者:[wenwensnow](https://github.com/wenwensnow)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/scottnesbitt
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/computer_browser_program_books_read.jpg?itok=iNMWe8Bu (Computer browser with books on the screen)
+[2]: https://babluboy.github.io/bookworm/
+[3]: https://opensource.com/sites/default/files/uploads/bookworm-reading.png (Bookworm e-book application)
+[4]: https://opensource.com/sites/default/files/uploads/bookworm-annotations.png (Annotations in Bookworm)
+[5]: https://opensource.com/sites/default/files/uploads/bookworm-preferences.png (Bookworm preferences)
+[6]: https://en.wikipedia.org/wiki/FictionBook
+[7]: https://en.wikipedia.org/wiki/Comic_book_archive
+[8]: https://johnfactotum.github.io/foliate/
+[9]: https://opensource.com/sites/default/files/uploads/foliate-reading.png (Foliate e-book application)
+[10]: https://opensource.com/sites/default/files/uploads/foliate-annotation_0.png
+[11]: https://opensource.com/sites/default/files/uploads/foliate-settings.png (Foliate settings)
+[12]: https://calibre-ebook.com/about
+[13]: https://opensourcemusings.com/managing-your-ebooks-with-calibre
+[14]: https://opensource.com/sites/default/files/uploads/e-book_viewer-reading.png (E-book Viewer application)
+[15]: https://opensource.com/sites/default/files/uploads/ebook-viewer-preferences.png (E-book Viewer preferences)
+[16]: https://manual.calibre-ebook.com/faq.html#what-formats-does-calibre-support-conversion-to-from
+[17]: https://opensourcemusings.com/three-ebook-readers-for-the-linux-desktop
+[18]: https://creativecommons.org/licenses/by-sa/4.0/
diff --git a/published/20200225 7 tips for writing an effective technical resume.md b/published/20200225 7 tips for writing an effective technical resume.md
new file mode 100644
index 0000000000..5748eea651
--- /dev/null
+++ b/published/20200225 7 tips for writing an effective technical resume.md
@@ -0,0 +1,73 @@
+[#]: collector: (lujun9972)
+[#]: translator: (Morisun029)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-12020-1.html)
+[#]: subject: (7 tips for writing an effective technical resume)
+[#]: via: (https://opensource.com/article/20/2/technical-resume-writing)
+[#]: author: (Emily Brand https://opensource.com/users/emily-brand)
+
+撰写有效的技术简历的 7 个技巧
+======
+
+> 遵循以下这些要点,把自己最好的一面呈现给潜在雇主。
+
+![](https://img.linux.net.cn/data/attachment/album/202003/21/092248u2w2gz2aezre2ba2.jpg)
+
+如果你是一名软件工程师或技术领域的经理,那么创建或更新简历可能是一项艰巨的任务。要考虑的重点是什么?应该怎么把控格式、内容以及求职目标或摘要?哪些工作经验相关?如何确保自动化招聘工具不会过滤掉你的简历?
+
+在过去的七年中,作为一名招聘经理,我看到了各种各样的简历;尽管有些令人印象深刻,但还有很多人写的很糟糕。
+
+在编写或更新简历时,请遵循以下七个简单原则。
+
+### 1、概述
+
+简历顶部的简短段落应简洁明了、目的明确,避免过度使用形容词和副词。诸如“令人印象深刻”、“广泛”和“卓越”之类的词,这些词不会增加你的招聘机会;相反,它们看起来和感觉上像是过度使用的填充词。 关于你的求职目标,问自己一个重要的问题:**它是否告诉招聘经理我正在寻找什么样的工作以及如何为他们提供价值?** 如果不是,请加强并简化它以回答该问题,或者将其完全排除在外。
+
+### 2、工作经验
+
+数字、数字、数字——重要的事情说三遍。用确凿的事实传达观点远比一般的陈述,例如“帮助构建、管理、交付许多对客户利润有贡献的项目”更能对你有帮助。你的表达中应包括统计数据,例如“直接影响了 5 个顶级银行的项目,这些项目将其上市时间缩短了 40%”,你提交了多少行代码或管理了几个团队。数据比修饰语更能有效地展示你的能力和价值。
+
+如果你经验不足,没有什么工作经验可展示,那些无关的经验,如暑期兼职工作,就不要写了。相反,将相关经验的细节以及你所学到的知识的详细信息写进简历,这些可以使你成为一个更好的候选人。
+
+### 3、搜索术语和行话
+
+随着技术在招聘过程中发挥如此巨大的作用,确保简历被标记为正确的职位非常重要,但不要在简历上过分吹嘘自己。如果你提到敏捷技能但不知道看板是什么,请三思。如果你提到自己精通 Java,但是已经有五年都没有使用过 Java 了,请小心。如果存在你熟悉但不一定是当前在用的语言和框架,请创建其他类别或将你的经验分为“精通”和“熟悉”。
+
+### 4、教育
+
+如果你不是应届大学毕业生,那就没必要再写你的 GPA 或你参加过的俱乐部或兄弟会,除非你计划将它们用作谈话要点以在面试中赢得信任。确保将你发表的或获取过专利的东西包括在内,即使它与该工作无关。如果你没有大学学位,请添加一个证书部分代替教育背景部分。如果你是军人,请包括现役和预备役时间。
+
+### 5、资质证书
+
+除非你想重新进入之前离开的领域,否则不要写过期的证书,例如,如果你曾经是一名人事经理,而现在正寻求动手编程的工作。如果你拥有与该领域不再相关的认证,就不要写这些认证,因为这些可能会分散招聘者的注意力,使你的简历失去吸引力。利用你的 LinkedIn 个人资料为简历添加更多色彩,因为大多数人在面试之前都会阅读你的简历和 LinkedIn 个人资料。
+
+### 6、拼写和语法
+
+让其他人帮忙对你的简历校对一下。很多时候,我在简历中看到过拼写错误的单词,或者错误用词,如“他们的”、“他们是”、“那些”。这些可以避免和修复的错误会产生负面影响。理想情况下,你的简历应用主动语态,但是如果这样会使你感到不舒服,那么就用过去时书写 —— 最重要的是要始终保持一致。不正确的拼写和语法会传递你要么不是很在乎所申请的工作,要么没有足够注意细节。
+
+### 7、格式
+
+确保你的简历是最新的并且富有吸引力,这是留下良好第一印象的简便方法。确保格式一致,例如相同的页边距,相同的间距、大写字母和颜色(将调色板保持在最低限度,不要花花绿绿)是简历写作中最基本的部分,但有必要表明你对工作感到自豪,并重视自己的价值和未来的雇主。在适当的地方使用表格,以视觉吸引人的方式分配信息。如果支持的话,以 .pdf 和 .docx 格式上传简历,然后用 Google Docs 导出为 .odt 格式,这样可以在 LibreOffice 中轻松打开。这里有一个我推荐的简单的 Google 文档[简历模板][2]。 你还可以支付少量费用(不到 10 美元)从一些设计公司购买模板。
+
+### 定期更新
+
+如果你需要(或希望)申请一份工作,定期更新简历可以最大程度地减少压力,也可以帮助你创建和维护更准确的简历版本。撰写简历时,要有远见,确保至少让另外三个人对你的简历内容、拼写和语法进行检查。即使你是由公司招募或其他人推荐给公司的,面试官也可能只能通过简历来认识你,因此请确保它为你带来良好的第一印象。
+
+你还有其他提示要添加吗?
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/2/technical-resume-writing
+
+作者:[Emily Brand][a]
+选题:[lujun9972][b]
+译者:[Morisun029](https://github.com/Morisun029)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/emily-brand
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/resume_career_document_general.png?itok=JEaFL2XI (Two hands holding a resume with computer, clock, and desk chair )
+[2]: https://docs.google.com/document/d/1ARVyybC5qQEiCzUOLElwAdPpKOK0Qf88srr682eHdCQ/edit
diff --git a/published/20200226 Use logzero for simple logging in Python.md b/published/20200226 Use logzero for simple logging in Python.md
new file mode 100644
index 0000000000..e6bcd095c4
--- /dev/null
+++ b/published/20200226 Use logzero for simple logging in Python.md
@@ -0,0 +1,140 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11970-1.html)
+[#]: subject: (Use logzero for simple logging in Python)
+[#]: via: (https://opensource.com/article/20/2/logzero-python)
+[#]: author: (Ben Nuttall https://opensource.com/users/bennuttall)
+
+使用 logzero 在 Python 中进行简单日志记录
+======
+
+> 快速了解一个方便的日志库,来帮助你掌握这个重要的编程概念。
+
+![](https://img.linux.net.cn/data/attachment/album/202003/07/122445v743hy7ajdyrrda1.jpg)
+
+logzero 库使日志记录就像打印语句一样容易,是简单性的杰出代表。我不确定 logzero 的名称是否要与 pygame-zero、GPIO Zero 和 guizero 这样的 “zero 样板库”契合,但是肯定属于该类别。它是一个 Python 库,可以使日志记录变得简单明了。
+
+你可以使用它基本的记录到标准输出的日志记录,就像你可以使用 print 来获得信息和调试一样,学习它的更高级日志记录(例如记录到文件)的学习曲线也很平滑。
+
+首先,使用 pip 安装 logzero:
+
+```
+$ sudo pip3 install logzero
+```
+
+在 Python 文件中,导入 logger 并尝试以下一个或所有日志实例:
+
+```
+from logzero import logger
+
+logger.debug("hello")
+logger.info("info")
+logger.warning("warning")
+logger.error("error")
+```
+
+输出以易于阅读的方式自动着色:
+
+![Python, Raspberry Pi: import logger][2]
+
+因此现在不要再使用 `print` 来了解发生了什么,而应使用有相关日志级别的日志器。
+
+### 在 Python 中将日志写入文件
+
+如果你阅读至此,并会在你写代码时做一点改变,这对我就足够了。如果你要了解更多,请继续阅读!
+
+写到标准输出对于测试新程序不错,但是仅当你登录到运行脚本的计算机时才有用。在很多时候,你需要远程执行代码并在事后查看错误。这种情况下,记录到文件很有帮助。让我们尝试一下:
+
+```
+from logzero import logger, logfile
+
+logfile('/home/pi/test.log')
+```
+
+现在,你的日志条目将记录到文件 `test.log` 中。记住确保[脚本有权限][3]写入该文件及其目录结构。
+
+你也可以指定更多选项:
+
+```
+logfile('/home/pi/test.log', maxBytes=1e6, backupCount=3)
+```
+
+现在,当提供给 `test.log` 文件的数据达到 1MB(10^6 字节)时,它将通过 `test.log.1`、`test.log.2` 等文件轮替写入。这种行为可以避免系统打开和关闭大量 I/O 密集的日志文件,以至于系统无法打开和关闭。更专业一点,你或许还要记录到 `/var/log`。假设你使用的是 Linux,那么创建一个目录并将用户设为所有者,以便可以写入该目录:
+
+```
+$ sudo mkdir /var/log/test
+$ sudo chown pi /var/log/test
+```
+
+然后在你的 Python 代码中,更改 `logfile` 路径:
+
+```
+logfile('/var/log/test/test.log', maxBytes=1e6, backupCount=3)
+```
+
+当要在 `logfile` 中捕获异常时,可以使用 `logging.exception`:
+
+```
+try:
+ c = a / b
+except Exception as e:
+ logger.exception(e)
+```
+
+这将输出(在 `b` 为零的情况下):
+
+```
+[E 190422 23:41:59 test:9] division by zero
+ Traceback (most recent call last):
+ File "test.py", line 7, in
+ c = a / b
+ ZeroDivisionError: division by zero
+```
+
+你会得到日志,还有完整回溯。另外,你可以使用 `logging.error` 并隐藏回溯:
+
+```
+try:
+ c = a / b
+except Exception as e:
+ logger.error(f"{e.__class__.__name__}: {e}")
+```
+
+现在,将产生更简洁的结果:
+
+```
+[E 190423 00:04:16 test:9] ZeroDivisionError: division by zero
+```
+
+![Logging output][4]
+
+你可以在 [logzero.readthedocs.io] [5] 中阅读更多选项。
+
+### logzero 为教育而生
+
+对于新手程序员来说,日志记录可能是一个具有挑战性的概念。大多数框架依赖于流控制和大量变量操作来生成有意义的日志,但是 logzero 不同。由于它的语法类似于 `print` 语句,因此它在教育上很成功,因为它无需解释其他概念。在你的下个项目中试试它。
+
+
+此文章最初发布在[我的博客][6]上,经许可重新发布。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/2/logzero-python
+
+作者:[Ben Nuttall][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/bennuttall
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/getting_started_with_python.png?itok=MFEKm3gl (Snake charmer cartoon with a yellow snake and a blue snake)
+[2]: https://opensource.com/sites/default/files/uploads/rpi_ben_1.png (Python, Raspberry Pi: import logger)
+[3]: https://opensource.com/article/19/6/understanding-linux-permissions
+[4]: https://opensource.com/sites/default/files/uploads/rpi_ben_2.png (Logging output)
+[5]: https://logzero.readthedocs.io/en/latest/
+[6]: https://tooling.bennuttall.com/logzero/
diff --git a/published/20200228 Converting between uppercase and lowercase on the Linux command line.md b/published/20200228 Converting between uppercase and lowercase on the Linux command line.md
new file mode 100644
index 0000000000..a90b4d411c
--- /dev/null
+++ b/published/20200228 Converting between uppercase and lowercase on the Linux command line.md
@@ -0,0 +1,157 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11983-1.html)
+[#]: subject: (Converting between uppercase and lowercase on the Linux command line)
+[#]: via: (https://www.networkworld.com/article/3529409/converting-between-uppercase-and-lowercase-on-the-linux-command-line.html)
+[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
+
+在 Linux 命令行中转换大小写
+======
+
+> 转换文本的大小写可能非常繁琐,尤其是当你要避免无意间的拼写错误时。幸运的是,Linux 提供了一些命令,可以使工作变得非常容易。
+
+![](https://img.linux.net.cn/data/attachment/album/202003/11/095821df7u8nlyfyyydqvf.jpg)
+
+有很多方法可以在 Linux 命令行中将文本从小写更改为大写,反之亦然。实际上,有一组这样的命令可以选择。这篇文章检验了一些最佳的命令来完成这项工作,以及你该如何让它们正常工作。
+
+### 使用 tr
+
+`tr`(translate)命令是在命令行或脚本中最容易使用的命令之一。如果你要确定要一串大写字符串,你只需将它传给 `tr`,如下所示:
+
+```
+$ echo Hello There | tr [:lower:] [:upper:]
+HELLO THERE
+```
+
+下面是一个在脚本中使用这个命令的例子,当你要确保添加到文件中的所有文本都使用大写形式以保持一致性时(LCTT 译注:这里输入部门名称作为示例):
+
+```
+#!/bin/bash
+
+echo -n "Enter department name: "
+read dept
+echo $dept | tr [:lower:] [:upper:] >> depts
+```
+
+将顺序切换为 `[:upper:] [:lower:]` 会产生相反的效果,将所有大写的部门名称都转换为小写:
+
+```
+echo $dept | tr [:upper:] [:lower:] >> depts
+```
+
+同样,你可以使用 `sed` 命令的 `A-Z` 和 `a-z` 字符串完成相同的操作:
+
+```
+echo $dept | tr a-z A-Z >> depts
+```
+
+毫无疑问,反转 `a-z` 和 `A-Z` 字符串的顺序将产生相反的效果,将文本全部变为小写。
+
+### 使用 awk
+
+`awk` 命令可让你使用它的 `toupper` 和 `tolower` 选项执行相同的操作。上例脚本中的命令可以用这种方式代替:
+
+```
+echo $dept | awk '{print toupper($0)}' >> depts
+```
+
+相反操作(切换为小写)如下所示:
+
+```
+echo $dept | awk '{print tolower($0)}' >> depts
+```
+
+### 使用 sed
+
+`sed`(stream editor)命令也可用于切换大小写。它与上面显示的两个命令中的第一个具有相同的效果。
+
+```
+echo $dept | sed 's/[a-z]/\U&/g' >> depts
+```
+
+从大写字母切换到小写字母只需将行尾附近的 `U` 替换为 `L`。
+
+```
+echo $dept | sed 's/[A-Z]/\L&/g' >> depts
+```
+
+### 操作文件中的文本
+
+`awk` 和 `sed` 都能更改整个文件的文本大小写。因此,你发现你的老板需要所有部门名称的小写么?没问题。只需带上文件名运行以下命令:
+
+```
+$ awk '{print tolower($0)}' depts
+finance
+billing
+bookkeeping
+```
+
+如果要覆盖 `depts` 文件,而不仅仅是以小写形式显示,则需要执行以下操作:
+
+```
+$ awk '{print tolower($0)}' depts > depts-
+$ mv depts- depts
+```
+
+但是,使用 `sed` 进行更改,你可以避免最后一步,因为 `sed` 可以“原地”编辑文件,如下所示,文件完整,但文本全部小写:
+
+```
+$ sed 's/[A-Z]/\L&/g' depts
+```
+
+### 仅将首字母转换为大写
+
+要仅将字符串中单词的首字母转换为大写,那么可以执行以下操作:
+
+```
+$ echo design \& engineering| sed -e "s/\b\(.\)/\u\1/g"
+Design & Engineering
+```
+
+该命令将确保首字母大写,但不会更改其余字母。
+
+### 确保只有首字母大写
+
+当要更改文本以使只有首字母大写时,这更具挑战性。假设你正在处理一个工作人员姓名列表,并且希望以正常的“名 姓”方式对其格式化。
+
+#### 使用 sed
+
+你可以使用更复杂的 `sed` 命令来确保以下结果:
+
+```
+$ echo design \& ENGINEERING | sed 's/\b\([[:alpha:]]\)\([[:alpha:]]*\)\b/\u\1\L\2/g'
+Design & Engineering
+```
+
+#### 使用 Python
+
+如果你已安装 Python,你可以运行这样的命令,它还可以设置文本格式,以便每个单词只有首字母大写,并且它可能比上面显示的 `sed` 命令更易于解析:
+
+```
+$ echo -n "design & engineering" | python3 -c "import sys; print(sys.stdin.read().title())"
+Design & Engineering
+```
+
+有多种方法可以在大小写之间更改文本格式。哪种方法效果最好取决于你要处理的是单个字符串还是整个文件,以及想要的最终结果。
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3529409/converting-between-uppercase-and-lowercase-on-the-linux-command-line.html
+
+作者:[Sandra Henry-Stocker][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/
+[b]: https://github.com/lujun9972
+[1]:https://images.idgesg.net/images/article/2019/04/alphabetic_letters_characters_language_by_andybrandon50_cc_by-sa_2-0_1500x1000-100794409-large.jpg
+[2]: https://creativecommons.org/licenses/by-sa/2.0/legalcode
+[3]: https://www.networkworld.com/newsletters/signup.html
+[4]: https://www.networkworld.com/article/3440100/take-the-intelligent-route-with-consumption-based-storage.html?utm_source=IDG&utm_medium=promotions&utm_campaign=HPE21620&utm_content=sidebar ( Take the Intelligent Route with Consumption-Based Storage)
+[5]: https://www.facebook.com/NetworkWorld/
+[6]: https://www.linkedin.com/company/network-world
diff --git a/published/20200302 How to Add New Brushes in GIMP -Quick Tip.md b/published/20200302 How to Add New Brushes in GIMP -Quick Tip.md
new file mode 100644
index 0000000000..4608cec762
--- /dev/null
+++ b/published/20200302 How to Add New Brushes in GIMP -Quick Tip.md
@@ -0,0 +1,104 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11975-1.html)
+[#]: subject: (How to Add New Brushes in GIMP [Quick Tip])
+[#]: via: (https://itsfoss.com/add-brushes-gimp/)
+[#]: author: (Community https://itsfoss.com/author/itsfoss/)
+
+快速技巧:如何在 GIMP 中添加新画笔
+======
+
+[GIMP][1] 是最流行的自由开源的图像编辑器,它也许是 Linux 上最好的 [Adobe Photoshop 替代品][2]。
+
+当你[在 Ubuntu 或其他任何操作系统上安装了 GIMP 后][3],你会发现已经安装了一些用于基本图像编辑的画笔。如果你需要更具体的画笔,你可以随时在 GIMP 中添加新画笔。
+
+怎么样?让我在这个快速教程中向你展示。
+
+### 如何在 GIMP 中添加画笔
+
+![][4]
+
+在 GIMP 中安装新画笔需要三个步骤:
+
+* 获取新画笔
+* 将其放入指定的文件夹中
+* 刷新 GIMP 中的画笔
+
+#### 步骤 1:下载新的 GIMP 画笔
+
+第一步是获取新的 GIMP 画笔。你从哪里获取?当然是从互联网上。
+
+你可以在 Google 或[如 Duck Duck Go 这种隐私搜索引擎][5]来搜索 “GIMP brushes”,并从网站下载一个你喜欢的。
+
+GIMP 画笔通常以 .gbr 和 .gih 文件格式提供。.gbr 文件用于常规画笔,而 .gih 用于动画画笔。
+
+> 你知道吗?
+>
+> 从 2.4 版本起,GIMP 使安装和使用 Photoshop 画笔(.abr 文件)非常简单。你只需将 Photoshop 画笔文件放在正确的文件夹中。
+>
+> 请记住,最新的 Photoshop 画笔可能无法完美地在 GIMP 中使用。
+
+#### 步骤 2:将新画笔复制到它的位置
+
+获取画笔文件后,下一步是复制该文件并将其粘贴到 GIMP 配置目录中所在的文件夹。
+
+> 在微软 Windows 上,你必须进入类似 `C:\Documents and Settings\myusername.gimp-2.10\brushes` 这样的文件夹。
+
+我将展示 Linux 上的详细步骤,因为我们是一个专注于 Linux 的网站。
+
+选择画笔文件后,在家目录中按下 `Ctrl+h` [查看 Linux 中的隐藏文件][6]。
+
+![Press Ctrl+H to see hidden files in the home directory][7]
+
+你应该进入 `.config/GIMP/2.10/brushes` 文件夹(如果你使用的是 GIMP 2.10)。如果使用其他版本,那么应在 `.config/GIMP` 下看到相应文件夹。
+
+![Adding New Brushes in GIMP][8]
+
+将画笔文件粘贴到此文件夹中。可选地,你可以通过再次按 `Ctrl+h` 来隐藏隐藏的文件。
+
+#### 步骤 3:刷新画笔(避免重启 GIMP)
+
+GIMP 将在启动时自动加载画笔。如果已在运行,并且不想关闭它,你可以刷新画笔。
+
+在 GIMP 的主菜单中找到 “Windows->Dockable Dialogues->Brushes”。
+
+![Refresh GIMP Brushes by going go to Windows->Dockable Dialogues-> Brushes][9]
+
+在右侧栏的 Brushes 对话框中找到“refresh”图标。
+
+![Refresh GIMP Brushes][10]
+
+如果你的画笔没有出现,那么你可以试试重启 GIMP。
+
+> 额外的技巧!
+>
+> 在 [GIMP 中添加新画笔还能让你轻松给图片添加水印][11]。只需将 logo 用作画笔,并点击一下就可添加到图片中。
+
+我希望你喜欢这个快速 GIMP 技巧。敬请期待更多。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/add-brushes-gimp/
+
+作者:[Community][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/itsfoss/
+[b]: https://github.com/lujun9972
+[1]: https://www.gimp.org/
+[2]: https://itsfoss.com/open-source-photoshop-alternatives/
+[3]: https://itsfoss.com/gimp-2-10-release/
+[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/Install-New-Brushes-in-GIMP.jpg?ssl=1
+[5]: https://itsfoss.com/privacy-search-engines/
+[6]: https://itsfoss.com/hide-folders-and-show-hidden-files-in-ubuntu-beginner-trick/
+[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/adding-brushes-GIMP-1.jpg?ssl=1
+[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/adding-brushes-GIMP.png?ssl=1
+[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/Refresh-GIMP-Brushes.jpg?ssl=1
+[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/Refresh-GIMP-Brushes-2.jpg?ssl=1
+[11]: https://itsfoss.com/add-watermark-gimp-linux/
diff --git a/published/20200302 Install GNU Emacs on Windows.md b/published/20200302 Install GNU Emacs on Windows.md
new file mode 100644
index 0000000000..7432b0e600
--- /dev/null
+++ b/published/20200302 Install GNU Emacs on Windows.md
@@ -0,0 +1,99 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11971-1.html)
+[#]: subject: (Install GNU Emacs on Windows)
+[#]: via: (https://opensource.com/article/20/3/emacs-windows)
+[#]: author: (Seth Kenlon https://opensource.com/users/seth)
+
+如何在 Windows 上安装 GNU Emacs
+======
+
+> 即使你的操作系统是闭源的,你仍然可以使用这个流行的开源文本编辑器。
+
+![](https://img.linux.net.cn/data/attachment/album/202003/08/094942ihwcnsqojnup46wo.jpg)
+
+GNU Emacs 是一个专为各种程序员设计的流行的文本编辑器。因为它是在 Unix 上开发的,并在 Linux(macOS 中也有)上得到了广泛使用,所以人们有时没有意识到它也可用于微软 Windows 上。你也无需成为有经验的或专职的程序员即可使用 Emacs。只需单击几下就可以下载并安装 Emacs,本文向你展示了如何进行。
+
+你可以手动安装 Windows,也可以使用包管理器安装,例如 [Chocolatey][2]。
+
+### 7-zip
+
+如果还没在 Windows 中安装 7-zip,那么就先安装它。[7-zip][3] 是一个开源的归档程序,能够创建和解压 ZIP、7z、TAR、XZ、BZIP2 和 GZIP(以及更多)文件。对于 Windows 用户来说,这是一个宝贵的工具。
+
+安装 7-zip 后,在 Windows 资源管理器中浏览文件时,右键单击菜单中就有新的 7-zip 归档选项。
+
+### Powershell 和 Chocolatey
+
+要在 Windows 上使用 Chocolatey 安装 GNU Emacs :
+
+```
+PS> choco install emacs-full
+```
+
+安装后,在 Powershell 中启动 Emacs:
+
+```
+PS> emacs
+```
+
+![Emacs running on Windows][4]
+
+### 下载适用于 Windows 的 GNU Emacs
+
+要在 Windows 上手动安装 GNU Emacs,你必须[下载 Emacs][5]。
+
+![GNU Windows downloader][6]
+
+它会打开连接到离你最近的服务器,并展示所有可用的 Emacs 版本。找到发行版本号最高的目录,然后单击进入。Windows 有许多不同的 Emacs 构建,但是最通用的版本只是被命名为 `emacs-VERSION-ARCHITECTURE.zip`。`VERSION` 取决于你要下载的版本,而 `ARCHITECTURE` 取决于你使用的是 32 位还是 64 位计算机。大多数现代计算机都是 64 位的,但是如果你有疑问,可以下载 32 位版本,它可在两者上运行。
+
+如果要下载 64 位计算机的 Emacs v26,你应该点击 `emacs-26.2-x86_64.zip` 的链接。有较小的下载包(例如 “no-deps” 等),但是你必须熟悉如何从源码构建 Emacs,知道它需要哪些库以及你的计算机上已经拥有哪些库。通常,获取较大版本的 Emacs 最容易,因为它包含了在计算机上运行所需的一切。
+
+### 解压 Emacs
+
+接下来,解压下载的 ZIP 文件。要解压缩,请右键单击 Emacs ZIP 文件,然后从 7-zip 子菜单中选择 “Extract to Emacs-VERSION”。这是一个很大的压缩包,因此解压可能需要一段时间,但是完成后,你将拥有一个新目录,其中包含与 Emacs 一起分发的所有文件。例如,在此例中,下载了 `emacs-26.2-x86_64.zip`,因此解压后的目录为 `emacs-26.2-x86_64`。
+
+### 启动 Emacs
+
+在 Emacs 目录中,找到 `bin` 目录。此文件夹存储随 Emacs 一起分发的所有二进制可执行文件(EXE 文件)。双击 `emacs.exe` 文件启动应用。
+
+![Emacs running on Windows][7]
+
+你可以在桌面上创建 `emacs.exe` 的快捷方式,以便于访问。
+
+### 学习 Emacs
+
+Emacs 并不像传闻那样难用。它具有自己的传统和惯例,但是当你其中输入文本时,你可以像在记事本或者网站的文本框中那样使用它。
+
+重要的区别是在你*编辑*输入的文本时。
+
+但是,学习的唯一方法是开始使用它,因此,使 Emacs 成为完成简单任务的首选文本编辑器。当你通常打开记事本、Word 或 Evernote 或其他工具来做快速笔记或临时记录时,请启动 Emacs。
+
+Emacs 以基于终端的应用而闻名,但它显然有 GUI,因此请像使用其他程序一样经常使用它的 GUI。从菜单而不是使用键盘复制、剪切和粘贴(paste)(或用 Emacs 的术语 “yank”),然后从菜单或工具栏打开和保存文件。从头开始,并根据应用本身来学习它,而不是根据你以往对其他编辑器的经验就认为它应该是怎样。
+
+- 下载[速查表][8]!
+
+感谢 Matthias Pfuetzner 和 Stephen Smoogen。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/emacs-windows
+
+作者:[Seth Kenlon][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/seth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/windows_building_sky_scale.jpg?itok=mH6CAX29 (Tall building with windows)
+[2]: https://github.com/chocolatey/choco
+[3]: https://www.7-zip.org/
+[4]: https://opensource.com/sites/default/files/uploads/windows-ps-choco-emacs.jpg (Emacs running on Windows)
+[5]: https://www.gnu.org/software/emacs/download.html
+[6]: https://opensource.com/sites/default/files/uploads/windows-emacs-download.jpg (GNU Windows downloader)
+[7]: https://opensource.com/sites/default/files/uploads/windows-emacs.jpg (Emacs running on Windows)
+[8]: https://opensource.com/downloads/emacs-cheat-sheet
diff --git a/published/20200303 Getting started with the Rust package manager, Cargo.md b/published/20200303 Getting started with the Rust package manager, Cargo.md
new file mode 100644
index 0000000000..55f3f7491d
--- /dev/null
+++ b/published/20200303 Getting started with the Rust package manager, Cargo.md
@@ -0,0 +1,561 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11977-1.html)
+[#]: subject: (Getting started with the Rust package manager, Cargo)
+[#]: via: (https://opensource.com/article/20/3/rust-cargo)
+[#]: author: (Gaurav Kamathe https://opensource.com/users/gkamathe)
+
+Rust 包管理器 Cargo 入门
+======
+
+> 了解 Rust 的软件包管理器和构建工具。
+
+![](https://img.linux.net.cn/data/attachment/album/202003/09/104906tdl21k977t8999qt.jpg)
+
+[Rust][2] 是一种现代编程语言,可提供高性能、可靠性和生产力。几年来,它一直被 StackOverflow 调查评为[最受欢迎的语言][3]。
+
+除了是一种出色的编程语言之外,Rust 还具有一个称为 Cargo 的构建系统和软件包管理器。Cargo 处理许多任务,例如构建代码、下载库或依赖项等等。这两者捆绑在一起,因此在安装 Rust 时会得到 Cargo。
+
+### 安装 Rust 和 Cargo
+
+在开始之前,你需要安装 Rust 和 Cargo。Rust 项目提供了一个可下载的脚本来处理安装。要获取该脚本,请打开浏览器以访问 [https://sh.rustup.rs][4] 并保存该文件。阅读该脚本以确保你对它的具体行为有所了解,然后再运行它:
+
+```
+$ sh ./rustup.rs
+```
+
+你也可以参考这个[安装 Rust][5] 的网页以获取更多信息。
+
+安装 Rust 和 Cargo 之后,你必须获取 `env` 文件中的配置:
+
+```
+$ source $HOME/.cargo/env
+```
+
+更好的办法是,将所需目录添加到 `PATH` 环境变量中:
+
+```
+export PATH=$PATH:~/.cargo/bin
+```
+
+如果你更喜欢使用软件包管理器(例如 Linux 上的 DNF 或 Apt),请在发行版本的存储库中查找 Rust 和 Cargo 软件包,并进行相应的安装。 例如:
+
+```
+$ dnf install rust cargo
+```
+
+安装并设置它们后,请验证你拥有的 Rust 和 Cargo 版本:
+
+```
+$ rustc --version
+rustc 1.41.0 (5e1a79984 2020-01-27)
+$ cargo --version
+cargo 1.41.0 (626f0f40e 2019-12-03)
+```
+
+### 手动构建和运行 Rust
+
+从在屏幕上打印“Hello, world!”的简单程序开始。打开你喜欢的文本编辑器,然后键入以下程序:
+
+```
+$ cat hello.rs
+fn main() {
+ println!("Hello, world!");
+}
+```
+
+以扩展名 `.rs` 保存文件,以将其标识为 Rust 源代码文件。
+
+使用 Rust 编译器 `rustc` 编译程序:
+
+```
+$ rustc hello.rs
+```
+
+编译后,你将拥有一个与源程序同名的二进制文件:
+
+```
+$ ls -l
+total 2592
+-rwxr-xr-x. 1 user group 2647944 Feb 13 14:14 hello
+-rw-r--r--. 1 user group 45 Feb 13 14:14 hello.rs
+$
+```
+
+执行程序以验证其是否按预期运行:
+
+```
+$ ./hello
+Hello, world!
+```
+
+这些步骤对于较小的程序或任何你想快速测试的东西就足够了。但是,在进行涉及到多人的大型程序时,Cargo 是前进的最佳之路。
+
+### 使用 Cargo 创建新包
+
+Cargo 是 Rust 的构建系统和包管理器。它可以帮助开发人员下载和管理依赖项,并帮助创建 Rust 包。在 Rust 社区中,Rust 中的“包”通常被称为“crate”(板条箱),但是在本文中,这两个词是可以互换的。请参阅 Rust 社区提供的 Cargo [FAQ][6] 来区分。
+
+如果你需要有关 Cargo 命令行实用程序的任何帮助,请使用 `--help` 或 `-h` 命令行参数:
+
+```
+$ cargo –help
+```
+
+要创建一个新的包,请使用关键字 `new`,跟上包名称。在这个例子中,使用 `hello_opensource` 作为新的包名称。运行该命令后,你将看到一条消息,确认 Cargo 已创建具有给定名称的二进制包:
+
+```
+$ cargo new hello_opensource
+ Created binary (application) `hello_opensource` package
+```
+
+运行 `tree` 命令以查看目录结构,它会报告已创建了一些文件和目录。首先,它创建一个带有包名称的目录,并且在该目录内有一个存放你的源代码文件的 `src` 目录:
+
+```
+$ tree .
+.
+└── hello_opensource
+ ├── Cargo.toml
+ └── src
+ └── main.rs
+
+2 directories, 2 files
+```
+
+Cargo 不仅可以创建包,它也创建了一个简单的 “Hello, world” 程序。打开 `main.rs` 文件看看:
+
+```
+$ cat hello_opensource/src/main.rs
+fn main() {
+ println!("Hello, world!");
+}
+```
+
+下一个要处理的文件是 `Cargo.toml`,这是你的包的配置文件。它包含有关包的信息,例如其名称、版本、作者信息和 Rust 版本信息。
+
+程序通常依赖于外部库或依赖项来运行,这使你可以编写应用程序来执行不知道如何编码或不想花时间编码的任务。你所有的依赖项都将在此文件中列出。此时,你的新程序还没有任何依赖关系。打开 `Cargo.toml` 文件并查看其内容:
+
+```
+$ cat hello_opensource/Cargo.toml
+[package]
+name = "hello_opensource"
+version = "0.1.0"
+authors = ["user "]
+edition = "2018"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+```
+
+### 使用 Cargo 构建程序
+
+到目前为止,一切都很顺利。现在你已经有了一个包,可构建一个二进制文件(也称为可执行文件)。在此之前,进入包目录:
+
+```
+$ cd hello_opensource/
+```
+
+你可以使用 Cargo 的 `build` 命令来构建包。注意消息说它正在“编译”你的程序:
+
+```
+$ cargo build
+ Compiling hello_opensource v0.1.0 (/opensource/hello_opensource)
+ Finished dev [unoptimized + debuginfo] target(s) in 0.38s
+```
+
+运行 `build` 命令后,检查项目目录发生了什么:
+
+```
+$ tree .
+.
+├── Cargo.lock
+├── Cargo.toml
+├── src
+│ └── main.rs
+└── target
+ └── debug
+ ├── build
+ ├── deps
+ │ ├── hello_opensource-147b8a0f466515dd
+ │ └── hello_opensource-147b8a0f466515dd.d
+ ├── examples
+ ├── hello_opensource
+ ├── hello_opensource.d
+ └── incremental
+ └── hello_opensource-3pouh4i8ttpvz
+ ├── s-fkmhjmt8tj-x962ep-1hivstog8wvf
+ │ ├── 1r37g6m45p8rx66m.o
+ │ ├── 2469ykny0eqo592v.o
+ │ ├── 2g5i2x8ie8zed30i.o
+ │ ├── 2yrvd7azhgjog6zy.o
+ │ ├── 3g9rrdr4hyk76jtd.o
+ │ ├── dep-graph.bin
+ │ ├── query-cache.bin
+ │ ├── work-products.bin
+ │ └── wqif2s56aj0qtct.o
+ └── s-fkmhjmt8tj-x962ep.lock
+
+9 directories, 17 files
+```
+
+哇!编译过程产生了许多中间文件。另外,你的二进制文件将以与软件包相同的名称保存在 `./target/debug` 目录中。
+
+### 使用 Cargo 运行你的应用程序
+
+现在你的二进制文件已经构建好了,使用 Cargo 的 `run` 命令运行它。如预期的那样,它将在屏幕上打印 `Hello, world!`。
+
+```
+$ cargo run
+ Finished dev [unoptimized + debuginfo] target(s) in 0.01s
+ Running `target/debug/hello_opensource`
+Hello, world!
+```
+
+或者,你可以直接运行二进制文件,该文件位于:
+
+```
+$ ls -l ./target/debug/hello_opensource
+-rwxr-xr-x. 2 root root 2655552 Feb 13 14:19 ./target/debug/hello_opensource
+```
+
+如预期的那样,它产生相同的结果:
+
+```
+$ ./target/debug/hello_opensource
+Hello, world!
+```
+
+假设你需要重建包,并丢弃早期编译过程创建的所有二进制文件和中间文件。Cargo 提供了一个方便的`clean` 选项来删除所有中间文件,但源代码和其他必需文件除外:
+
+```
+$ cargo clean
+$ tree .
+.
+├── Cargo.lock
+├── Cargo.toml
+└── src
+ └── main.rs
+
+1 directory, 3 files
+```
+
+对程序进行一些更改,然后再次运行以查看其工作方式。例如,下面这个较小的更改将 `Opensource` 添加到 `Hello, world!` 字符串中:
+
+```
+$ cat src/main.rs
+fn main() {
+ println!("Hello, Opensource world!");
+}
+```
+
+现在,构建该程序并再次运行它。这次,你会在屏幕上看到 `Hello, Opensource world!`:
+
+```
+$ cargo build
+ Compiling hello_opensource v0.1.0 (/opensource/hello_opensource)
+ Finished dev [unoptimized + debuginfo] target(s) in 0.39s
+
+$ cargo run
+ Finished dev [unoptimized + debuginfo] target(s) in 0.01s
+ Running `target/debug/hello_opensource`
+Hello, Opensource world!
+```
+
+### 使用 Cargo 添加依赖项
+
+Cargo 允许你添加程序需要运行的依赖项。使用 Cargo 添加依赖项非常容易。每个 Rust 包都包含一个 `Cargo.toml` 文件,其中包含一个依赖关系列表(默认为空)。用你喜欢的文本编辑器打开该文件,找到 `[dependencies]` 部分,然后添加要包含在包中的库。例如,将 `rand` 库添加为依赖项:
+
+```
+$ cat Cargo.toml
+[package]
+name = "hello_opensource"
+version = "0.1.0"
+authors = ["test user "]
+edition = "2018"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+rand = "0.3.14"
+```
+
+试试构建你的包,看看会发生什么。
+
+```
+$ cargo build
+ Updating crates.io index
+ Compiling libc v0.2.66
+ Compiling rand v0.4.6
+ Compiling rand v0.3.23
+ Compiling hello_opensource v0.1.0 (/opensource/hello_opensource)
+ Finished dev [unoptimized + debuginfo] target(s) in 4.48s
+```
+
+现在,Cargo 会联系 [Crates.io][9](这是 Rust 用于存储 crate(或包)的中央仓库),并下载和编译 `rand`。但是,等等 —— `libc` 包是怎么回事?你没有要安装 libc 啊。是的,`rand` 包依赖于 `libc` 包;因此,Cargo 也会下载并编译 `libc`。
+
+库的新版本会不断涌现,而 Cargo 提供了一种使用 `update` 命令更新其所有依赖关系的简便方法:
+
+```
+cargo update
+```
+
+你还可以选择使用 `-p` 标志跟上包名称来更新特定的库:
+
+```
+cargo update -p rand
+```
+
+### 使用单个命令进行编译和运行
+
+到目前为止,每当对程序进行更改时,都先使用了 `build` 之后是 `run`。有一个更简单的方法:你可以直接使用 `run` 命令,该命令会在内部进行编译并运行该程序。要查看其工作原理,请首先清理你的软件包目录:
+
+```
+$ cargo clean
+$ tree .
+.
+├── Cargo.lock
+├── Cargo.toml
+└── src
+ └── main.rs
+
+1 directory, 3 files
+```
+
+现在执行 `run`。输出信息表明它已进行编译,然后运行了该程序,这意味着你不需要每次都显式地运行 `build`:
+
+```
+$ cargo run
+ Compiling hello_opensource v0.1.0 (/opensource/hello_opensource)
+ Finished dev [unoptimized + debuginfo] target(s) in 0.41s
+ Running `target/debug/hello_opensource`
+Hello, world!
+```
+
+### 在开发过程中检查代码
+
+在开发程序时,你经常会经历多次迭代。你需要确保你的程序没有编码错误并且可以正常编译。你不需要负担在每次编译时生成二进制文件的开销。Cargo 为你提供了一个 `check` 选项,该选项可以编译代码,但跳过了生成可执行文件的最后一步。首先在包目录中运行 `cargo clean`:
+
+```
+$ tree .
+.
+├── Cargo.lock
+├── Cargo.toml
+└── src
+ └── main.rs
+
+1 directory, 3 files
+```
+
+现在运行 `check` 命令,查看对目录进行了哪些更改:
+
+```
+$ cargo check
+ Checking hello_opensource v0.1.0 (/opensource/hello_opensource)
+ Finished dev [unoptimized + debuginfo] target(s) in 0.18s
+```
+
+该输出显示,即使在编译过程中创建了中间文件,但没有创建最终的二进制文件或可执行文件。这样可以节省一些时间,如果该包包含了数千行代码,这非常重要:
+
+```
+$ tree .
+.
+├── Cargo.lock
+├── Cargo.toml
+├── src
+│ └── main.rs
+└── target
+ └── debug
+ ├── build
+ ├── deps
+ │ ├── hello_opensource-842d9a06b2b6a19b.d
+ │ └── libhello_opensource-842d9a06b2b6a19b.rmeta
+ ├── examples
+ └── incremental
+ └── hello_opensource-1m3f8arxhgo1u
+ ├── s-fkmhw18fjk-542o8d-18nukzzq7hpxe
+ │ ├── dep-graph.bin
+ │ ├── query-cache.bin
+ │ └── work-products.bin
+ └── s-fkmhw18fjk-542o8d.lock
+
+9 directories, 9 files
+```
+
+要查看你是否真的节省了时间,请对 `build` 和 `check` 命令进行计时并进行比较。首先,计时 `build` 命令:
+
+```
+$ time cargo build
+ Compiling hello_opensource v0.1.0 (/opensource/hello_opensource)
+ Finished dev [unoptimized + debuginfo] target(s) in 0.40s
+
+real 0m0.416s
+user 0m0.251s
+sys 0m0.199s
+```
+
+在运行 `check` 命令之前清理目录:
+
+```
+$ cargo clean
+```
+
+计时 `check` 命令:
+
+```
+$ time cargo check
+ Checking hello_opensource v0.1.0 (/opensource/hello_opensource)
+ Finished dev [unoptimized + debuginfo] target(s) in 0.15s
+
+real 0m0.166s
+user 0m0.086s
+sys 0m0.081s
+```
+
+显然,`check` 命令要快得多。
+
+### 建立外部 Rust 包
+
+到目前为止,你所做的这些都可以应用于你从互联网上获得的任何 Rust crate。你只需要下载或克隆存储库,移至包文件夹,然后运行 `build` 命令,就可以了:
+
+```
+git clone
+cd
+cargo build
+```
+
+### 使用 Cargo 构建优化的 Rust 程序
+
+到目前为止,你已经多次运行 `build`,但是你注意到它的输出了吗?不用担心,再次构建它并密切注意:
+
+```
+$ cargo build
+ Compiling hello_opensource v0.1.0 (/opensource/hello_opensource)
+ Finished dev [unoptimized + debuginfo] target(s) in 0.36s
+```
+
+看到了每次编译后的 `[unoptimized + debuginfo]` 文本了吗?这意味着 Cargo 生成的二进制文件包含大量调试信息,并且未针对执行进行优化。开发人员经常经历开发的多次迭代,并且需要此调试信息进行分析。同样,性能并不是开发软件时的近期目标。因此,对于现在而言是没问题的。
+
+但是,一旦准备好发布软件,就不再需要这些调试信息。而是需要对其进行优化以获得最佳性能。在开发的最后阶段,可以将 `--release` 标志与 `build` 一起使用。仔细看,编译后,你应该会看到 `[optimized]` 文本:
+
+```
+$ cargo build --release
+ Compiling hello_opensource v0.1.0 (/opensource/hello_opensource)
+ Finished release [optimized] target(s) in 0.29s
+```
+
+如果愿意,你可以通过这种练习来了解运行优化软件与未优化软件时节省的时间。
+
+### 使用 Cargo 创建库还是二进制文件
+
+任何软件程序都可以粗略地分类为独立二进制文件或库。一个独立二进制文件也许即使是当做外部库使用的,自身也是可以运行的。但是,作为一个库,是可以被另一个独立二进制文件所利用的。到目前为止,你在本教程中构建的所有程序都是独立二进制文件,因为这是 Cargo 的默认设置。 要创建一个**库**,请添加 `--lib` 选项:
+
+```
+$ cargo new --lib libhello
+ Created library `libhello` package
+```
+
+这次,Cargo 不会创建 `main.rs` 文件,而是创建一个 `lib.rs` 文件。 你的库的代码应该是这样的:
+
+```
+$ tree .
+.
+└── libhello
+ ├── Cargo.toml
+ └── src
+ └── lib.rs
+
+2 directories, 2 files
+```
+
+Cargo 就是这样的,不要奇怪,它在你的新库文件中添加了一些代码。通过移至包目录并查看文件来查找添加的内容。默认情况下,Cargo 在库文件中放置一个测试函数。
+
+### 使用 Cargo 运行测试
+
+Rust 为单元测试和集成测试提供了一流的支持,而 Cargo 允许你执行以下任何测试:
+
+```
+$ cd libhello/
+
+$ cat src/lib.rs
+#[cfg(test)]
+mod tests {
+ #[test]
+ fn it_works() {
+ assert_eq!(2 + 2, 4);
+ }
+}
+```
+
+Cargo 有一个方便的 `test` 命令,可以运行代码中存在的任何测试。尝试默认运行 Cargo 在库代码中放入的测试:
+
+```
+$ cargo test
+ Compiling libhello v0.1.0 (/opensource/libhello)
+ Finished test [unoptimized + debuginfo] target(s) in 0.55s
+ Running target/debug/deps/libhello-d52e35bb47939653
+
+running 1 test
+test tests::it_works ... ok
+
+test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
+
+ Doc-tests libhello
+
+running 0 tests
+
+test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
+```
+
+### 深入了解 Cargo 内部
+
+你可能有兴趣了解在运行一个 Cargo 命令时它底下发生了什么。毕竟,在许多方面,Cargo 只是个封装器。要了解它在做什么,你可以将 `-v` 选项与任何 Cargo 命令一起使用,以将详细信息输出到屏幕。
+
+这是使用 `-v` 选项运行 `build` 和 `clean` 的几个例子。
+
+在 `build` 命令中,你可以看到这些给定的命令行选项触发了底层的 `rustc`(Rust 编译器):
+
+```
+$ cargo build -v
+ Compiling hello_opensource v0.1.0 (/opensource/hello_opensource)
+ Running `rustc --edition=2018 --crate-name hello_opensource src/main.rs --error-format=json --json=diagnostic-rendered-ansi --crate-type bin --emit=dep-info,link -C debuginfo=2 -C metadata=147b8a0f466515dd -C extra-filename=-147b8a0f466515dd --out-dir /opensource/hello_opensource/target/debug/deps -C incremental=/opensource/hello_opensource/target/debug/incremental -L dependency=/opensource/hello_opensource/target/debug/deps`
+ Finished dev [unoptimized + debuginfo] target(s) in 0.36s
+```
+
+而 `clean` 命令表明它只是删除了包含中间文件和二进制文件的目录:
+
+```
+$ cargo clean -v
+ Removing /opensource/hello_opensource/target
+```
+
+### 不要让你的技能生锈
+
+要扩展你的技能,请尝试使用 Rust 和 Cargo 编写并运行一个稍微复杂的程序。很简单就可以做到:例如,尝试列出当前目录中的所有文件(可以用 9 行代码完成),或者尝试自己回显输入。小型的实践应用程序可帮助你熟悉语法以及编写和测试代码的过程。
+
+本文为刚起步的 Rust 程序员提供了大量信息,以使他们可以开始入门 Cargo。但是,当你开始处理更大、更复杂的程序时,你需要对 Cargo 有更深入的了解。当你准备好迎接更多内容时,请下载并阅读 Rust 团队编写的开源的《[Cargo 手册][10]》,看看你可以创造什么!
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/rust-cargo
+
+作者:[Gaurav Kamathe][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/gkamathe
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/bus-containers2.png?itok=idd8duC_ (Shipping containers stacked in a yard)
+[2]: https://www.rust-lang.org/
+[3]: https://insights.stackoverflow.com/survey/2019#technology-_-most-loved-dreaded-and-wanted-languages
+[4]: https://sh.rustup.rs/
+[5]: https://www.rust-lang.org/tools/install
+[6]: https://doc.rust-lang.org/cargo/faq.html
+[7]: mailto:user@mail.com
+[8]: mailto:test@mail.com
+[9]: http://crates.io
+[10]: https://doc.rust-lang.org/cargo
diff --git a/published/20200303 Session- An Open Source Private Messenger That Doesn-t Need Your Phone Number.md b/published/20200303 Session- An Open Source Private Messenger That Doesn-t Need Your Phone Number.md
new file mode 100644
index 0000000000..1d98fdf187
--- /dev/null
+++ b/published/20200303 Session- An Open Source Private Messenger That Doesn-t Need Your Phone Number.md
@@ -0,0 +1,138 @@
+[#]: collector: (lujun9972)
+[#]: translator: (HankChow)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11982-1.html)
+[#]: subject: (Session: An Open Source Private Messenger That Doesn’t Need Your Phone Number)
+[#]: via: (https://itsfoss.com/session-messenger/)
+[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
+
+Session:一款不需要电话号码的开源通信应用
+======
+
+Signal 作为一款私人通信应用,正在变得愈发流行。而我们下面要介绍开源应用 Session 则是 Signal 的一个复刻,它的一大亮点是并不需要提供手机号码即可以开始使用。
+
+### Session:一款真正意义上的私人通信应用
+
+![][1]
+
+对于私人通信服务来说,有没有既能保护通信安全性,又尊重用户跨平台隐私的集大成者呢?很多注重个人隐私的用户似乎都在寻找这个问题的答案。
+
+最近,我留意到 [Loki 基金会][3]开发的一款叫做 [Session][2] 的开源通信应用。从技术上来说,Session 是另一款[开源、加密的通信应用 Signal][4] 的一个复刻。
+
+在本文中,我会讲述我自己使用 Session 的体验,以及 Session 的一些主要功能。
+
+Session 在这个领域中算是一款比较新的应用了,因此我还会在文章的最后提到它的一些不足之处。
+
+### Session 的一些主要功能
+
+接下来我会重点介绍 Session 的主要功能,可以供你参考这款应用是否值得使用。
+
+#### Session 的使用过程中不需要提供手机号码
+
+![][5]
+
+在 Signal 或者其它类似的通信应用中,用户都需要提供手机号码才得以成功注册。注重隐私的用户们都认为这样的做法会潜藏着巨大的安全隐患。
+
+而使用 Session 则简单得多。在 PC 或手机上安装应用之后,只需要点击“创建账号”,无须提供手机号码,它就会生成一个类似 05652245af9a8bfee4f5a8138fd5c..... 这样的随机且唯一的 Session ID。
+
+此后,把 Session ID 分享给想要添加的联系人就可以了。Session 还支持二维码,其他人可以通过扫描二维码添加你的 Session ID 为好友。
+
+#### Session 使用了区块链等加密技术
+
+![Session ID][6]
+
+对[区块链][7]有所了解的用户都很期待区块链能为普罗大众做出什么有实际意义的应用,而 Session 可以算得上其中一个。尽管 Session 的核心是基于区块链的,但普通用户在使用时并不需要真正弄懂区块链。
+
+如果你好奇它的工作原理,可以参考这篇[官方的博客文章][8],里面有相关的解释。
+
+#### 跨平台支持
+
+![][9]
+
+这样严格保护隐私的应用,是否能在不同平台上使用?
+
+答案是肯定的。首先,它支持 Linux 和 Android 平台,同时也支持 Windows/Mac/iOS 平台。因此跨平台、跨设备的消息同步是没有问题的。
+
+#### 包含基本隐私选项
+
+![][10]
+
+毫无疑问,基本的隐私功能是必须有的,这是作为一个以安全为卖点的应用所必备的体验。
+
+最基本的选项包括:
+
+* **消息有效期**:你可以控制一条消息在接收者阅读前的保留时长
+* **已读回执**:消息发送者可以知晓你已经阅读该消息
+
+#### Session 使用去中心化网络保护你的元数据
+
+尽管 Session 不使用端对端技术,但它也不使用中心化的服务器。
+
+Session 采用了去中心化的架构实现消息的传输和路由。如果你不熟悉这方面的内容,可以关注 Session 的官方博客,尝试了解[中心化网络和去中心化网络的区别][11],以及它的实际工作原理。
+
+同时,这样的网络架构还有助于保护诸如与 IP 地址相关的信息等元数据。
+
+#### 其它功能
+
+除了专注于隐私之外,Session 也支持群聊、语音消息、发送附件等通信应用的基本功能。
+
+### 在 Linux 上安装 Session
+
+在[官方下载页面][12]中可以下载到对应的 .AppImage 文件。如果你不了解这个文件的使用方法,可以查阅我们的[相关文章][13]。
+
+另外,你也可以在它的 [Github 发布页面][14] 获取到对应的 .deb 安装文件。
+
+- [下载 Session][12]
+
+### 我使用 Session 的体验
+
+我在各种平台上都试用过 Session,其中在 PC 上我使用了 Pop!\_OS 19.10 的 .AppImage 文件运行这个应用。
+
+总的来说,使用的体验很不错,用户界面也没有出现问题。
+
+在设置中备份了密码(也称为种子)后,可以很方便地恢复账号。
+
+![][15]
+
+当然,我也发现了一些需要改进的地方:
+
+* 在接受好友请求时会出现延迟
+* 设备间连接的方式不太直观
+* 当你在不同的设备上使用同一个 Session ID 向同一个人回复消息时,对方会收到两个不同的对话
+
+### 总结
+
+当然,最完美的事物是不存在的。我也会一直使用 Session 并考虑它发展的方向,这是一个注重隐私的用户应该做的事情。
+
+欢迎在评论区发表你的看法。
+
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/session-messenger/
+
+作者:[Ankush Das][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://itsfoss.com/author/ankush/
+[b]: https://github.com/lujun9972
+[1]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/02/session-app.jpg?ssl=1
+[2]: https://getsession.org/
+[3]: https://loki.foundation/
+[4]: https://linux.cn/article-11764-1.html
+[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/02/session-create.jpg?ssl=1
+[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/03/session-application-id.jpg?ssl=1
+[7]: https://en.wikipedia.org/wiki/Blockchain
+[8]: https://getsession.org/how-session-protects-your-anonymity-with-blockchain-and-crypto/
+[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/02/session-cross-platform.jpg?ssl=1
+[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/02/session-settings.jpg?fit=800%2C512&ssl=1
+[11]: https://getsession.org/centralisation-vs-decentralisation-in-private-messaging/
+[12]: https://getsession.org/download/
+[13]: https://itsfoss.com/use-appimage-linux/
+[14]: https://github.com/loki-project/session-desktop/releases
+[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/02/session-seed.jpg?ssl=1
diff --git a/published/20200304 Drauger OS Linux Aims to Bring Console Gaming Experience on the Desktop.md b/published/20200304 Drauger OS Linux Aims to Bring Console Gaming Experience on the Desktop.md
new file mode 100644
index 0000000000..d574442156
--- /dev/null
+++ b/published/20200304 Drauger OS Linux Aims to Bring Console Gaming Experience on the Desktop.md
@@ -0,0 +1,131 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11972-1.html)
+[#]: subject: (Drauger OS Linux Aims to Bring Console Gaming Experience on the Desktop)
+[#]: via: (https://itsfoss.com/drauger-os/)
+[#]: author: (John Paul https://itsfoss.com/author/john/)
+
+Drauger OS Linux 旨在为台式机带来主机游戏体验
+======
+
+多年来(或数十年),人们抱怨不[使用Linux][1] 的原因之一是它缺乏主流游戏。[Linux 上的游戏][2]在最近几年有了显著改进,特别是 [Steam Proton][3] 项目的引入使你可以[在 Linux 上玩很多 Windows 专用的游戏][4]。
+
+这也鼓励了一些[以游戏为中心的 Linux发行版][5]。以 [Lakka][6] 为例,你可以[借助 Lakka Linux 将旧计算机变成复古的街机游戏机][7]。
+
+另一个以游戏为中心的 Linux 发行版是 [Draguer OS][8],我们今天将对其进行研究。
+
+### Drauger OS
+
+根据[该项目的网站][9],“Drauger OS 是 Linux 桌面游戏操作系统。它旨在为游戏玩家提供一个平台,使他们可以在不牺牲安全性的情况下获得出色的性能。此外,它旨在使任何人都可以轻松玩游戏,无论他们使用键盘和鼠标还是某种控制器。”
+
+他们强调 Drauger OS 并非供日常使用。因此,大多数其他发行版附带的许多生产力工具都不在 Drauger OS 中。
+
+![Drauger OS 7.4.1][10]
+
+Drauger OS [基于][9] Ubuntu 之上。当前版本(7.4.1 Jiangshi)使用 “[Liquorix][11] 低延迟Linux 内核,这是一种预编译的 ZEN 内核,设计时考虑了延迟和吞吐量之间的平衡”。但是,这将在下一版本中更改。他们只有一个桌面环境可供选择,即一个修改版本的 [Xfce][12]。
+
+Drauger OS 开箱即用地安装了多个应用程序和工具,以改善游戏体验。这些包括:
+
+* [PlayOnLinux][13]
+* WINE
+* [Lutris][14]
+* Steam
+* [DXVK][15]
+
+它还具有一组与游戏无关的有趣工具。[Drauger 安装器][16]是 .deb 安装程序,是 Gdebi 的替代品。[多软件库应用安装器][17](mrai)是“用于基于 Debian 的 Linux 操作系统的类似于 AUR-helper 的脚本”。Mrai 旨在与 apt、snap、flatpaks 配合使用,并且可以从 GitHub 安装应用程序。
+
+有趣的是,Drauger OS 的名称是一个错误。开发负责人 [Thomas Castleman][18](即 batcastle)曾打算为其发行版命名为 Draugr,但是却打错了名字。在 Drauger OS 播客的[第 23 集][19]中,Castleman 说会保留这个拼写错误的名称,因为要对其进行更正需要大量工作。根据 [Wikipedia][20] 的描述,Draugr 是“来自北欧神话中的不死生物”。
+
+是的,你没看错。Drauger OS 是仅有的几个具有自己的[播客][21]的发行版之一。当被问到这个问题时,Castleman 告诉我:“无论他们的情况如何,我都希望确保我们的社区拥有最大的透明度。”多数情况下,播客是 Drauger OS 博客的音频版本,但有时他们会在没有时间撰写博客文章时使用它来发布公告。
+
+### Drauger OS 的未来
+
+![Drauger OS][22]
+
+Druager OS 背后的开发人员正在开发其下一个主要版本:7.5.1。此版本将基于 Ubuntu 19.10。将有三个主要变化。首先,将使用“我们内部构建的内核” [替换][23] Liquorix 内核。该内核将基于 Linux 内核 GitHub 存储库,“因此,它会变得越来越原汁原味”。
+
+新版本的第二个主要变化将是为其桌面提供新布局。根据用户的反馈,他们决定将其更改为看起来更类似于 GNOME 的样子。
+
+第三,他们放弃了 SystemBack 作为其备份工具和安装程序。相反,他们从头开始编写了新的[安装程序][24]。
+
+开发团队也正在研究 Drauger OS 的 [ARM 版本][25]。他们希望在 2022 年的某个时候发布它。
+
+### 系统要求
+
+Drauger OS [系统要求][25]非常适中。请记住,Drauger OS 仅在 64 位系统上运行。
+
+#### 最低系统要求
+
+* CPU:双核、1.8GHz、64 位处理器
+* RAM:1 GB
+* 储存空间:16 GB
+* 图形处理器:集成
+* 屏幕分辨率:60Hz 时为 1024×768
+* 外部端口:1 个用于显示的端口(HDMI/DisplayPort/VGA/DVI),2 个用于安装 USB 驱动器和键盘的 USB 端口(鼠标可选,但建议使用)
+
+#### 推荐系统要求
+
+* CPU:四核、2.2Ghz、64 位处理器
+* RAM:4 GB
+* 储存空间:128 GB
+* 图形处理器:NVIDIA GTX 1050、AMD RX 460 或同等显卡
+* 屏幕分辨率:60Hz 时为 1080p
+* 外部端口:1 个用于显示的端口(HDMI/DisplayPort/VGA/DVI),3 个用于安装 USB 驱动器、键盘和鼠标的 USB 端口,1 个音频输出端口
+
+### 如何为Drauger OS提供帮助
+
+如果你有兴趣,可以通过多种方法来帮助 Drauger OS。他们一直在寻找[财政支持][26]以保持发展。
+
+如果你想贡献代码,他们正在寻找具有 BASH、C++ 和 Python 经验的人员。他们所有的代码都在 [GitHub][27] 上。你也可以在社交媒体上[联系][28]他们。
+
+### 结语
+
+Drauger OS 只是这类项目之一。我还见过其他[面向游戏的发行版][29],但 Drauger OS 在专注于游戏方面一心一意。由于我更喜欢休闲游戏,因此该发行版对我个人而言并不具有吸引力。但是,我可以看到它如何吸引游戏爱好者使用 Linux。祝他们在以后的发行中好运。
+
+你对这个仅限于游戏的发行版有何想法?你最喜欢的 Linux 游戏解决方案是什么?请在下面的评论中告诉我们。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/drauger-os/
+
+作者:[John Paul][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/john/
+[b]: https://github.com/lujun9972
+[1]: https://itsfoss.com/why-use-linux/
+[2]: https://linux.cn/article-7316-1.html
+[3]: https://linux.cn/article-10054-1.html
+[4]: https://itsfoss.com/steam-play/
+[5]: https://itsfoss.com/linux-gaming-distributions/
+[6]: http://www.lakka.tv/
+[7]: https://itsfoss.com/lakka-retrogaming-linux/
+[8]: https://draugeros.org/go/
+[9]: https://www.draugeros.org/go/about/
+[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/02/drauger-os-7.4.1.jpg?ssl=1
+[11]: https://liquorix.net/
+[12]: https://www.xfce.org/
+[13]: https://www.playonlinux.com/en/
+[14]: https://lutris.net/
+[15]: https://github.com/doitsujin/dxvk
+[16]: https://github.com/drauger-os-development/drauger-installer
+[17]: https://github.com/drauger-os-development/mrai
+[18]: https://github.com/Batcastle
+[19]: https://anchor.fm/drauger-os/episodes/Episode-23-eapu47
+[20]: https://en.wikipedia.org/wiki/Draugr
+[21]: https://anchor.fm/drauger-os
+[22]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/02/drauger-os-7.5.1.png?ssl=1
+[23]: https://www.draugeros.org/go/2020/01/20/major-changes-in-drauger-os-7-5-1/
+[24]: https://github.com/drauger-os-development/system-installer
+[25]: https://www.draugeros.org/go/system-requirements/
+[26]: https://www.draugeros.org/go/contribute/
+[27]: https://github.com/drauger-os-development
+[28]: https://www.draugeros.org/go/contact-us/
+[29]: https://itsfoss.com/manjaro-gaming-linux/
+[30]: https://reddit.com/r/linuxusersgroup
diff --git a/published/20200305 Install and Use Wireshark on Ubuntu Linux.md b/published/20200305 Install and Use Wireshark on Ubuntu Linux.md
new file mode 100644
index 0000000000..ec70ef40a8
--- /dev/null
+++ b/published/20200305 Install and Use Wireshark on Ubuntu Linux.md
@@ -0,0 +1,216 @@
+[#]: collector: (lujun9972)
+[#]: translator: (qianmingtian)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11987-1.html)
+[#]: subject: (Install and Use Wireshark on Ubuntu Linux)
+[#]: via: (https://itsfoss.com/install-wireshark-ubuntu/)
+[#]: author: (Community https://itsfoss.com/author/itsfoss/)
+
+Ubuntu 上 Wireshark 的安装与使用
+======
+
+> 在本教程中,你将学习如何在 Ubuntu 和其它基于 Ubuntu 的发行版上安装最新的 Wireshark。同时你也将学习如何在没有 sudo 的情况下来运行 Wireshark,以及如何设置它来进行数据包嗅探。
+
+[Wireshark][1] 是一款自由开源的网络协议分析器,它在全球被广泛使用。
+
+通过使用 Wireshark,你可以实时捕获网络的传入和传出数据包,并将其用于网络故障排除、数据包分析、软件和通信协议开发等。
+
+它适用于所有主流的桌面操作系统,如 Windows、Linux、macOS、BSD 等。
+
+在本教程中,我将指导你在 Ubuntu 和其他基于 Ubuntu 的发行版上安装 Wireshark 。我还将介绍如何设置和配置 Wireshark 来捕获数据包。
+
+### 在基于 Ubuntu 的 Linux 发行版上安装 Wireshark
+
+![][2]
+
+Wireshark 适用于所有主流 Linux 发行版。你应该查看[官方安装说明][3]。因为在本教程中,我将着重在仅基于 Ubuntu 的发行版上安装最新版本的 Wireshark 。
+
+Wireshark 可以在 Ubuntu 的 Universe 存储库中找到。你可以[启用 universe 存储库][4],然后按如下方式安装:
+
+```
+sudo add-apt-repository universe
+sudo apt install wireshark
+```
+
+这种方法的一个小问题是,你可能并不总是得到最新版本的 Wireshark 。
+
+例如,在 Ubuntu 18.04 中,如果你使用 [apt][5] 命令检查 Wireshark 的可用版本,可用版本会显示是 2.6 。
+
+```
+abhishek@nuc:~$ apt show wireshark
+Package: wireshark
+Version: 2.6.10-1~ubuntu18.04.0
+Priority: optional
+Section: universe/net
+Origin: Ubuntu
+Maintainer: Balint Reczey
+```
+
+然而, [Wireshark 3.2 稳定版][6]已经在几个月前发布了。当然,新版本拥有新的特性。
+
+那么在这种情况下,你应该怎么办呢?谢天谢地, Wireshark 开发者提供了一种官方 PPA 方式,你可以使用它在 Ubuntu 和其它基于 Ubuntu 的发行版上安装最新稳定版本的 Wireshark.
+
+我希望你熟悉 PPA。如果没有,请[阅读我们关于 PPA 的优秀指南,以便完全理解它][7]。
+
+打开终端并逐个使用以下命令:
+
+```
+sudo add-apt-repository ppa:wireshark-dev/stable
+sudo apt update
+sudo apt install wireshark
+```
+
+即使安装了旧版本的 Wireshark ,它也将更新为新版本。
+
+安装时,系统将询问你是否允许非超级用户捕获数据包。选择“Yes”允许,选择“No”限制非超级用户捕获数据包,最后完成安装。
+
+### 不使用 sudo 运行 Wireshark
+
+如果在上一次安装中选择了“No”,则以 root 用户身份运行以下命令:
+
+```
+sudo dpkg-reconfigure wireshark-common
+```
+
+然后按 `tab` 键并使用回车键选择“No”:
+
+![][8]
+
+由于你允许非超级用户捕获数据包,因此你必须将该用户添加到 `wireshark` 组。使用 [usermod][9] 命令将自己添加到 `wireshark` 组。
+
+```
+sudo usermod -aG wireshark $(whoami)
+```
+
+最后,[重启你的 Ubuntu 系统][10]对你的系统进行必要的修改。
+
+> 冷知识
+>
+> Wireshark 于 1998 年首次发布,最初被称为 Ethereal 。2006 年,由于商标问题,开发商不得不将其名称改为 Wireshark 。
+
+### 启动 Wireshark
+
+你可以从应用程序启动器或者命令行启动 Wireshark 应用。
+
+如果从命令行启动,只需要在你的控制台中输入 `wireshark`:
+
+```
+wireshark
+```
+
+要是从**图形化界面**启动,需要在搜索栏搜索 Wireshark 应用,并按回车键。
+
+![][11]
+
+现在,让我们来玩玩 Wireshark 吧。
+
+### 使用 Wireshark 捕获数据包
+
+当你启动 Wireshark 的时候,你会看到一个接口列表,你可以使用它来捕获这个接口接收和发送的数据包。
+
+你可以使用 Wireshark 监视许多类型的接口,例如,有线、外部设备等。根据你的偏好,你可以从下图中的标记区域选择在欢迎屏幕中显示特定类型的接口。
+
+![Select interface][12]
+
+例如,我只列出了**有线**网络接口。
+
+![][13]
+
+接下来,要开始捕获数据包,你必须选择接口(在我的示例中是 `ens33` ),然后单击“Start capturing packets”图标,如下图所示。
+
+![Start capturing packets with Wireshark][14]
+
+你还可以同时从多个接口捕获数据包。只需按住 `CTRL` 按钮,同时单击要捕获的接口,然后点击“Start capturing packets”图标,如下图所示。
+
+![][15]
+
+接下来,我尝试在终端中使用 `ping google.com` 命令,如你所见,捕获了许多数据包。
+
+![Captured packets][16]
+
+现在你可以选择任何数据包来检查该特定数据包。在点击一个特定的包之后,你可以看到与它相关的 TCP/IP 协议的不同层的信息。
+
+![Packet info][17]
+
+你还可以在底部看到该特定数据包的原始数据,如下图所示。
+
+![Check RAW data in the captured packets][18]
+
+> 这就是为什么端到端加密很重要。
+>
+> 假设你正在登录一个不使用 HTTPS 的网站。与你在同一网络上的任何人都可以嗅探数据包,并在原始数据中看到用户名和密码。
+>
+> 这就是为什么现在大多数聊天应用程序使用端到端加密,而大多数网站使用 https (而不是 http)。
+
+#### 在 Wireshark 中停止数据包捕获
+
+你可以点击如图所示的红色图标停止捕获数据包。
+
+![Stop packet capture in Wireshark][19]
+
+#### 将捕获的数据包保存成文件
+
+你可以单击下图中标记的图标,将捕获的数据包保存到文件中以备将来使用。
+
+![Save captured packets by Wireshark][20]
+
+
+**注意**:输出可以导出为 XML、PostScript、CSV 或纯文本。
+
+接下来,选择一个目标文件夹,键入文件名并单击“Save”。
+
+然后选择文件并单击“Open”。
+
+![][21]
+
+现在你可以随时打开和分析保存的数据包。要打开文件,请按 `\+o`,或从 Wireshark 转到 “File > Open”。
+
+捕获的数据包将从文件中加载。
+
+![][22]
+
+### 结语
+
+Wireshark 支持许多不同的通信协议。有许多选项和功能,使你能够以独特的方式捕获和分析网络数据包。你可以从 Wireshark 的[官方文档][23]了解更多关于 Wireshark 的信息。
+
+我希望这个教程能帮助你在 Ubuntu 上安装 Wireshark 。请让我知道你的问题和建议。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/install-wireshark-ubuntu/
+
+作者:[Kushal Rai][a]
+选题:[lujun9972][b]
+译者:[qianmingtian][c]
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/itsfoss/
+[b]: https://github.com/lujun9972
+[c]: https://github.com/qianmingtian
+[1]: https://www.wireshark.org/
+[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/wireshark_ubuntu.png?ssl=1
+[3]: https://www.wireshark.org/docs/wsug_html_chunked/ChBuildInstallUnixInstallBins.html
+[4]: https://itsfoss.com/ubuntu-repositories/
+[5]: https://itsfoss.com/apt-command-guide/
+[6]: https://www.wireshark.org/news/20191218.html
+[7]: https://itsfoss.com/ppa-guide/
+[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/yes.png?ssl=1
+[9]: https://linuxhandbook.com/usermod-command/
+[10]: https://itsfoss.com/schedule-shutdown-ubuntu/
+[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/03/wire.png?ssl=1
+[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/interfaces.jpg?ssl=1
+[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/intoption.jpg?ssl=1
+[14]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/03/singleinterface.jpg?ssl=1
+[15]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/selint.jpg?ssl=1
+[16]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/03/capture.jpg?ssl=1
+[17]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/03/packetinfo.png?ssl=1
+[18]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/raw.png?ssl=1
+[19]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/03/stopcapture.png?ssl=1
+[20]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/savepackets.jpg?ssl=1
+[21]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/savename.jpg?ssl=1
+[22]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/openpacket.png?ssl=1
+[23]: https://www.wireshark.org/docs/https://www.wireshark.org/docs/
+[24]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/kushal_rai.jpg?ssl=1
diff --git a/published/20200306 Communicating with other users on the Linux command line.md b/published/20200306 Communicating with other users on the Linux command line.md
new file mode 100644
index 0000000000..b5af59b838
--- /dev/null
+++ b/published/20200306 Communicating with other users on the Linux command line.md
@@ -0,0 +1,143 @@
+[#]: collector: (lujun9972)
+[#]: translator: (linusboyle)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-12023-1.html)
+[#]: subject: (Communicating with other users on the Linux command line)
+[#]: via: (https://www.networkworld.com/article/3530343/communicating-with-other-users-on-the-linux-command-line.html)
+[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
+
+使用 Linux 命令行与其他用户进行通信
+======
+
+![](https://img.linux.net.cn/data/attachment/album/202003/22/171055z3q772v2zq320zx3.jpg)
+
+使用 Linux 命令行向其他用户发送消息或许非常容易,这里有一些相关的命令你可以考虑使用。在这篇文章中,我们会考察 4 个这样的命令,看看它们是怎么工作的。
+
+### wall
+
+`wall`(“Write ALL” 的简称)命令允许你向所有系统中已登录的用户发送一条信息。这里我们假设用户都使用命令行在同一台服务器上工作。虽然 `wall` 命令最常被系统管理员用于向用户发布公告和传递信息(比如说,服务器即将因维护而关闭),但它可以被任何用户使用。
+
+系统管理员可能会用类似下面的方式发送信息:
+
+```
+$ wall The system will be going down in 15 minutes to address a serious problem
+```
+
+而所有登录的用户都将看到类似这样的信息:
+
+```
+Broadcast message from admin@dragonfly (pts/0) (Thu Mar 5 08:56:42 2020):
+The system is going down in 15 minutes to address a serious problem
+```
+
+如果希望在消息中使用单引号,你可以像这样将信息用双引号括起来:
+
+```
+$ wall "Don't forget to save your work before logging off"
+```
+
+最外层的双引号不会出现在发出的消息中,但是如果没有它们,`wall` 会停下并等待输入一个配对的单引号。
+
+### mesg
+
+如果出于某种理由你不想接收来自另一个用户的消息,你可以使用 `mesg` 命令来屏蔽这些消息。这个命令可以接受一个 `n` 作为参数来拒绝某用户的消息,或者接收一个 `y` 作为参数来接收用户发来的消息。
+
+```
+$ mesg n doug
+$ mesg y doug
+```
+
+被屏蔽的用户不会被告知这一事实。你也可以像这样使用 `mesg` 来屏蔽或者接收所有消息:
+
+```
+$ mesg y
+$ mesg n
+```
+
+### write
+
+另一个在不使用电子邮件的情况下发送文本的命令是 `write`,这个命令可以用来和一个特定的用户通信。
+
+```
+$ write nemo
+Are you still at your desk?
+I need to talk with you right away.
+^C
+```
+
+输入你的信息后用 `ctrl-c` 退出,这样就完成了通信。这个命令允许你发送文本,但并不会建立一个双向的通话。它只是将文本发送过去而已。如果目标用户在多个终端上登录,你可以指定你想将消息发送到哪一个终端,否则系统会选择空闲时间最短的那个终端。
+
+```
+$ write nemo#1
+```
+
+如果你试图向一个将消息屏蔽了的用户发送信息,你应该会看到这样的输出:
+
+```
+$ write nemo
+write: nemo has messages disabled
+```
+
+### talk/ytalk
+
+`talk` 和 `ytalk` 命令让你可以和一个或多个用户进行交互式的聊天。它们会展示一个有上下两个子窗口的界面,每个用户向显示在他们屏幕上方的窗口内输入内容,并在下方的窗口看到回复信息。要回复一个`talk` 请求,接收方可以输入 `talk`,在后面加上请求方的用户名。
+
+```
+Message from Talk_Daemon@dragonfly at 10:10 ...
+talk: connection requested by dory@127.0.0.1.
+talk: respond with: talk dory@127.0.0.1
+
+$ talk dory
+```
+
+如果使用的是 `ytalk`,那么窗口中可以包含多于两个参与者。正如下面的例子所展示的(这是上面 `talk dory` 命令的结果),`talk` 通常指向 `ytalk`。
+
+```
+----------------------------= YTalk version 3.3.0 =--------------------------
+Is the report ready?
+
+-------------------------------= nemo@dragonfly =----------------------------
+Just finished it
+```
+
+如上所述,在通话的另一侧,`talk`会话界面的窗口是相反的:
+
+```
+----------------------------= YTalk version 3.3.0 =--------------------------
+Just finished it
+
+-------------------------------= dory@dragonfly =----------------------------
+Is the report ready?
+```
+
+同样的,使用 `ctrl-c` 来退出。
+
+如果要和非本机的用户通讯,你需要加上 `-h` 选项和目标主机名或IP地址,就像这样:
+
+```
+$ talk -h 192.168.0.11 nemo
+```
+
+### 总结
+
+Linux 上有若干基本的命令可以用来向其他登录的用户发送消息。如果你需要向所有用户快速发送信息或是需要便捷的电话替代品,又或是希望能简单地开始一个多用户快速通讯会话,这些命令会十分实用。
+
+一些命令如 `wall` 允许广播消息但却不是交互式的。另外的一些命令如 `talk` 允许多用户进行长时间通讯,当你只需要非常快速地交换一些信息,它们可以你你避免建立一个电话会议。
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3530343/communicating-with-other-users-on-the-linux-command-line.html
+
+作者:[Sandra Henry-Stocker][a]
+选题:[lujun9972][b]
+译者:[linusboyle](https://github.com/linusboyle)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/
+[b]: https://github.com/lujun9972
+[1]: https://www.networkworld.com/article/3440100/take-the-intelligent-route-with-consumption-based-storage.html?utm_source=IDG&utm_medium=promotions&utm_campaign=HPE21620&utm_content=sidebar ( Take the Intelligent Route with Consumption-Based Storage)
+[2]: https://www.facebook.com/NetworkWorld/
+[3]: https://www.linkedin.com/company/network-world
diff --git a/published/20200306 Three Ways to Exclude-Hold-Prevent a Specific Package from an apt Upgrade.md b/published/20200306 Three Ways to Exclude-Hold-Prevent a Specific Package from an apt Upgrade.md
new file mode 100644
index 0000000000..f005d928fa
--- /dev/null
+++ b/published/20200306 Three Ways to Exclude-Hold-Prevent a Specific Package from an apt Upgrade.md
@@ -0,0 +1,182 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11992-1.html)
+[#]: subject: (Three Ways to Exclude/Hold/Prevent a Specific Package from an apt Upgrade)
+[#]: via: (https://www.2daygeek.com/debian-ubuntu-exclude-hold-prevent-packages-from-apt-get-upgrade/)
+[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/)
+
+从 apt 升级中排除/保留/阻止特定软件包的三种方法
+======
+
+![](https://img.linux.net.cn/data/attachment/album/202003/13/103902tfyv8eeuo5jf9ifo.jpg)
+
+有时,由于某些应用依赖性,你可能会意外更新不想更新的软件包。这在全系统更新或自动包升级时经常会发生。如果发生这种情况,可能会破坏应用的功能。这会造成严重的问题,你需要花费大量时间来解决问题。
+
+如何避免这种情况?如何从 `apt-get` 更新中排除软件包?
+
+> 如果你要[从 Yum Update 中排除特定软件包][1],请参考这篇。
+
+是的,可以在 Debian 和 Ubuntu 系统上使用以下三种方法来完成。
+
+* [apt-mark 命令][2]
+* [dpkg 命令][3]
+* aptitude 命令
+
+我们将分别详细展示。
+
+### 方法 1:如何使用 apt-mark 命令排除 Debian/Ubuntu 系统上的软件包更新
+
+`apt-mark` 用于将软件包标记/取消标记为自动安装。
+
+`hold` 选项用于将软件包标记为保留,以防止软件包被自动安装、升级或删除。
+
+`unhold` 选项用于取消先前面的设置,以允许重复执行所有操作。
+
+运行以下命令以使用 `apt-mark` 命令保留指定的软件包。
+
+```
+$ sudo apt-mark hold nano
+nano set on hold.
+```
+
+保留软件包后,请运行以下 `apt-mark` 命令查看它们。
+
+```
+$ sudo apt-mark showhold
+nano
+```
+
+这表明在执行完整的系统更新时,不会升级 nano 包。
+
+```
+$ sudo apt update
+
+Reading package lists… Done
+Building dependency tree
+Reading state information… Done
+Calculating upgrade… Done
+The following packages have been kept back:
+ nano
+0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
+```
+
+运行以下命令,使用 `apt-mark` 命令取消保留 nano 包。
+
+```
+$ sudo apt-mark unhold nano
+Canceled hold on nano.
+```
+
+### 方法 2:如何使用 dpkg 命令在 Debian/Ubuntu 系统上排除软件包更新
+
+`dpkg` 命令是一个 CLI 工具,用于安装、构建、删除和管理 Debian 软件包。`dpkg` 的主要且更用户友好的前端是 `aptitude`。
+
+运行以下命令使用 `dpkg` 命令阻止给定的软件包。
+
+语法:
+
+```
+$ echo "package_name hold" | sudo dpkg --set-selections
+```
+
+运行以下 `dpkg` 命令以保留 apache2 包。
+
+```
+$ echo "apache2 hold" | sudo dpkg --set-selections
+```
+
+保留软件包后,请运行以下命令查看它们。
+
+```
+$ sudo dpkg --get-selections | grep "hold"
+apache2 hold
+```
+
+它会显示在执行完整的系统更新时,不会升级 apache2包。
+
+```
+$ sudo apt update
+
+Reading package lists… Done
+Building dependency tree
+Reading state information… Done
+Calculating upgrade… Done
+The following packages have been kept back:
+ apache2
+0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
+```
+
+运行以下命令,使用 `dpkg` 命令取消对指定软件包的保留。
+
+语法:
+
+```
+$ echo "package_name install" | sudo dpkg --set-selections
+```
+
+运行以下命令,使用 `dpkg` 命令取消保留 apache2 包。
+
+```
+$ echo "apache2 install" | sudo dpkg --set-selections
+```
+
+### 方法 3:如何使用 aptitude 命令排除 Debian/Ubuntu 系统上的软件包更新
+
+`aptitude` 命令是 Debian 及其衍生版本的基于文本的软件包管理界面。
+
+它允许用户查看软件包列表并执行软件包管理任务,例如安装、升级和删除软件包。它可以从可视界面或命令行执行操作。
+
+运行以下命令,使用 `aptitude` 命令保留指定的软件包。
+
+```
+$ sudo aptitude hold python3
+```
+
+保留某些软件包后,请运行以下命令查看它们。
+
+```
+$ sudo dpkg --get-selections | grep "hold"
+或者
+$ sudo apt-mark showhold
+
+python3
+```
+
+这表明在执行完整的系统更新时,不会升级 python3 软件包。
+
+```
+$ sudo apt update
+
+Reading package lists… Done
+Building dependency tree
+Reading state information… Done
+Calculating upgrade… Done
+The following packages have been kept back:
+ python3
+0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
+```
+
+使用 `aptitude ` 命令运行以下命令以解除对 python3 软件包的保留。
+
+```
+$ sudo aptitude unhold python3
+```
+
+--------------------------------------------------------------------------------
+
+via: https://www.2daygeek.com/debian-ubuntu-exclude-hold-prevent-packages-from-apt-get-upgrade/
+
+作者:[Magesh Maruthamuthu][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.2daygeek.com/author/magesh/
+[b]: https://github.com/lujun9972
+[1]: https://www.2daygeek.com/redhat-centos-yum-update-exclude-specific-packages/
+[2]: https://www.2daygeek.com/apt-get-apt-cache-command-examples-manage-packages-debian-ubuntu-systems/
+[3]: https://www.2daygeek.com/dpkg-command-to-manage-packages-on-debian-ubuntu-linux-mint-systems/
diff --git a/published/20200309 6 Raspberry Pi tutorials to try out.md b/published/20200309 6 Raspberry Pi tutorials to try out.md
new file mode 100644
index 0000000000..a15b85f450
--- /dev/null
+++ b/published/20200309 6 Raspberry Pi tutorials to try out.md
@@ -0,0 +1,68 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-12005-1.html)
+[#]: subject: (6 Raspberry Pi tutorials to try out)
+[#]: via: (https://opensource.com/article/20/3/raspberry-pi-tutorials)
+[#]: author: (Lauren Pritchett https://opensource.com/users/lauren-pritchett)
+
+6 个可以尝试的树莓派教程
+======
+
+> 这些树莓派项目均旨在简化你的生活并提高生产力。
+
+![](https://img.linux.net.cn/data/attachment/album/202003/17/142619e7jbh7dj5448nf1i.jpg)
+
+没有什么比体验树莓派创作结果更令人兴奋了。经过数小时的编程、测试和徒手构建,你的项目终于开始成形,你不禁大喊 “哇哦!”树莓派可以带给日常生活的可能性让我着迷。无论你是想学习新知识、尝试提高效率还是只是乐在其中,本文总有一个树莓派项目适合你。
+
+### 设置 VPN 服务器
+
+本[教程][2]教你如何使用树莓派添加一个网络安全层。这个项目不仅有实际好处,而且还能为你带来很多乐趣。额外的安全性使你可以放心地做其它项目,例如下面列出的项目。
+
+### 创建一个物体跟踪摄像机
+
+树莓派之所以具有吸引力,是因为它提供了较低的入门门槛来学习机器学习等新技术。这份[分步指南][3]提供了详尽的说明,说明了如何构建一个全景摄像头,以便使用 TensorFlow 和树莓派跟踪运动。
+
+### 使用照片幻灯片展示你最喜欢的回忆
+
+你是否曾经问过自己:“我应该怎么处理这些数码照片?”。如果你像我一样这样想过,那么答案是“是”。在朋友和家人圈子中,我被公认为摄像爱好者。这就是为什么我喜欢这个树莓派项目。在[本教程][4]中,你将学习如何设置照片幻灯片,以便轻松地在家里展示自己喜欢的回忆,而无需打印机!
+
+### 玩复古电子游戏
+
+如果你对复古游戏系统怀有怀旧之情,那么可以尝试[本教程][5]。了解包括树莓派在内的哪些设备可以运行 Amiga 模拟器。完成设置后,你将可在树莓派上玩自己喜欢的 Amiga 游戏。
+
+### 为你的娱乐中心搭建时钟
+
+在过去的十年中,家庭娱乐中心发生了很大的变化。我的家人完全依靠流媒体服务来观看节目和电影。我之所以爱它是因为我可以通过移动设备或语音助手控制电视。但是,当你不再能一眼看到时钟时,便会失去一定程度的便利!请遵循[这些步骤][6],使用树莓派从头开始搭建自己的时钟显示。
+
+### 扩大自制啤酒的生产规模
+
+在[本教程][7]中,经验丰富的家庭酿酒师分享了他建立电动啤酒酿造系统的经验。该项目需要在硬件和零件上进行更多的前期投资,但由此产生的效率和一致性让这些值得。为此祝贺!
+
+如果你是像我这样的树莓派新手,那么我建议你阅读我们这些可下载的树莓派指南。我们的[单页速查表][8]提供了入门指南。有关更多技巧和教程,我们的[综合指南][9]涵盖了一些主题,例如选择树莓派、保持更新、为社区做出贡献等。
+
+你会尝试哪个树莓派项目?让我们在评论中知道。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/raspberry-pi-tutorials
+
+作者:[Lauren Pritchett][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/lauren-pritchett
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/raspberrypi_cartoon.png?itok=m3TcBONJ (Cartoon graphic of Raspberry Pi board)
+[2]: https://opensource.com/article/19/6/raspberry-pi-vpn-server
+[3]: https://opensource.com/article/20/1/object-tracking-camera-raspberry-pi
+[4]: https://opensource.com/article/19/2/wifi-picture-frame-raspberry-pi
+[5]: https://opensource.com/article/19/3/amiga-raspberry-pi
+[6]: https://opensource.com/article/17/7/raspberry-pi-clock
+[7]: https://opensource.com/article/17/7/brewing-beer-python-and-raspberry-pi
+[8]: https://opensource.com/downloads/getting-started-raspberry-pi-cheat-sheet
+[9]: https://opensource.com/downloads/raspberry-pi-guide
diff --git a/published/20200310 2020 Will Be a Year of Hindsight for SD-WAN.md b/published/20200310 2020 Will Be a Year of Hindsight for SD-WAN.md
new file mode 100644
index 0000000000..6b4c3c1886
--- /dev/null
+++ b/published/20200310 2020 Will Be a Year of Hindsight for SD-WAN.md
@@ -0,0 +1,61 @@
+[#]: collector: (lujun9972)
+[#]: translator: (hkurj)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-12034-1.html)
+[#]: subject: (2020 Will Be a Year of Hindsight for SD-WAN)
+[#]: via: (https://www.networkworld.com/article/3531315/2020-will-be-a-year-of-hindsight-for-sd-wan.html)
+[#]: author: (Zeus Kerravala https://www.networkworld.com/author/Zeus-Kerravala/)
+
+2020 年将是 SD-WAN 的回顾之年
+======
+
+![](https://images.idgesg.net/images/article/2020/03/istock-1127447341-100834720-large.jpg)
+
+对于软件定义的广域网(SD-WAN),“过去看起来困难的选择,知道了这些选择的结果后,现在看起来就很清晰了” 这一说法再合适不过了。总结过去的几年:云计算和数字化转型促使公司重新评估传统的 WAN 技术,该技术不再能够满足其不断增长的业务需求。从那时起,SD-WAN 成为一种有前途的新技术。
+
+SD-WAN 旨在解决物理设备的流量管理问题,并支持从云进行基于软件的配置。许多最初的 SD-WAN 部署都因希望取代昂贵的多协议标签交换 (MPLS) 而得到推动。公司希望它可以神奇地解决他们所有的网络问题。但是在实践中,基本的 SD-WAN 解决方案远没有实现这一愿景。
+
+快速发展到现在,围绕 SD-WAN 的炒作已经尘埃落定,并且早期的实施工作已经过去。现在是时候回顾一下我们在 2019 年学到的东西以及在 2020 年要改进的地方。所以,让我们开始吧。
+
+### 1、这与节省成本无关
+
+大多数公司选择 SD-WAN 作为 MPLS 的替代品,因为它可以降低 WAN 成本。但是,[节省的成本][1]会因 SD-WAN 的不同而异,因此不应将其用作部署该技术的主要驱动力。无论公司需要什么,公司都应该专注于提高网络敏捷性,例如实现更快的站点部署和减少配置时间。SD-WAN 的主要驱动力是使网络更高效。如果成功实现那么成本也会随之降低。
+
+### 2、WAN 优化是必要的
+
+说到效率,[WAN 优化][2]提高了应用程序和数据流量的性能。通过应用协议加速、重复数据消除、压缩和缓存等技术,WAN 优化可以增加带宽、减少延迟并减轻数据包丢失。最初的想法是 SD-WAN 可以完成对 WAN 优化的需求,但是我们现在知道某些应用程序需要更多的性能支持。这些技术相互补充,而不是相互替代。它们应该用来解决不同的问题。
+
+### 3、安全性不应该事后考虑
+
+SD-WAN 具有许多优点,其中之一就是使用宽带互联网快速发送企业应用程序流量。但是这种方法也带来了安全风险,因为它使用户及其本地网络暴露于不受信任的公共互联网中。从一开始,安全性就应该成为 SD-WAN 实施的一部分,而不是在事后。公司可以通过使用[安全的云托管][3]之类的服务,将安全性放在分支机构附近,从而实现所需的应用程序性能和保护。
+
+### 4、可见性对于 SD-WAN 成功至关重要
+
+在应用程序和数据流量中具有[可见性][4],这使网络管理不再需要猜测。最好的起点是部署前阶段,在此阶段,公司可以在实施 SD-WAN 之前评估其现有功能以及缺少的功能。可见性以日常监控和警报的形式在部署后继续发挥重要作用。了解网络中正在发生的情况的公司会更好地准备应对性能问题,并可以利用这些知识来避免将来出现问题。
+
+### 5、无线广域网尚未准备就绪
+
+SD-WAN 可通过包括宽带和 4G/LTE 无线在内的任何传输将用户连接到应用程序。这就是[移动互联][5]越来越多地集成到 SD-WAN 解决方案中的原因。尽管公司渴望将 4G 用作潜在的传输替代方案(尤其是在偏远地区),但由此带来的按使用付费 4G 服务成本却很高。此外,由于延迟和带宽限制,4G 可能会出现问题。最好的方法是等待服务提供商部署具有更好的价格选择的 5G。今年我们将看到 5G 的推出,并更加关注无线 SD-WAN。
+
+请务必观看以下 SD-WAN 视频系列:[你应该知道的所有关于 SD-WAN 的知识][6]。
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3531315/2020-will-be-a-year-of-hindsight-for-sd-wan.html
+
+作者:[Zeus Kerravala][a]
+选题:[lujun9972][b]
+译者:[hkurj](https://github.com/hkurj)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.networkworld.com/author/Zeus-Kerravala/
+[b]: https://github.com/lujun9972
+[1]: https://blog.silver-peak.com/to-maximize-the-value-of-sd-wan-look-past-hardware-savings
+[2]: https://blog.silver-peak.com/sd-wan-vs-wan-optimization
+[3]: https://blog.silver-peak.com/sd-wans-enable-scalable-local-internet-breakout-but-pose-security-risk
+[4]: https://blog.silver-peak.com/know-the-true-business-drivers-for-sd-wan
+[5]: https://blog.silver-peak.com/mobility-and-sd-wan-part-1-sd-wan-with-4g-lte-is-a-reality
+[6]: https://www.silver-peak.com/everything-you-need-to-know-about-sd-wan
diff --git a/published/20200310 Basilisk- A Firefox Fork For The Classic Looks and Classic Extensions.md b/published/20200310 Basilisk- A Firefox Fork For The Classic Looks and Classic Extensions.md
new file mode 100644
index 0000000000..b15e81597e
--- /dev/null
+++ b/published/20200310 Basilisk- A Firefox Fork For The Classic Looks and Classic Extensions.md
@@ -0,0 +1,103 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-12001-1.html)
+[#]: subject: (Basilisk: A Firefox Fork For The Classic Looks and Classic Extensions)
+[#]: via: (https://itsfoss.com/basilisk-browser/)
+[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
+
+Basilisk:一个有着经典的外观和扩展的 Firefox 复刻
+======
+
+> Basilisk 是一个 Firefox 复刻,它支持旧版的扩展等更多功能。在这里,我们看一下它的功能并尝试一下。
+
+![](https://img.linux.net.cn/data/attachment/album/202003/16/130319lvls6fvsaslzllrv.jpg)
+
+### Basilisk:基于 XUL 的开源 Web 浏览器
+
+尽管最好使用 Linux 上的常规浏览器(如 Firefox 或 Chromium),但了解其他浏览器也没坏处。最近,我偶然发现了一个 Firefox 复刻:[Basilisk][1] 浏览器,它有经典的 Firefox 用户界面以及对旧版扩展的支持(就像 [Waterfox][2] 一样)。
+
+![itsfoss.com homepage on Basilisk][3]
+
+如果你迫切需要使用旧版扩展程序或怀念 Firefox 的经典外观,Basilisk 浏览器可以帮到你。这个浏览器是由 [Pale Moon][4] 浏览器背后的团队维护(这是我接下来要介绍的另一个 Firefox 复刻)。
+
+如果你正在寻找开源 [Chrome 替代品][5],那么你可以快速了解一下 Basilisk 提供的功能。
+
+**注意:**Basilisk 是开发中软件。即使我在使用时没有遇到重大的可用性问题,但你也不应依赖它作为唯一使用的浏览器。
+
+### Basilisk 浏览器的特性
+
+![][6]
+
+Basilisk 开箱即用。但是,在考虑使用之前,可能需要先看一下以下这些特性:
+
+* 基于 [XUL][7] 的 Web 浏览器
+* 它具有 “Australis” Firefox 界面,这在 v29–v56 的 Firefox 版本中非常流行。
+* 支持 [NPAPI][8] 插件(Flash、Unity、Java 等)
+* 支持 XUL/Overlay Mozilla 形式的扩展。
+* 使用 [Goanna][9] 开源浏览器引擎,它是 Mozilla [Gecko][10] 的复刻
+* 不使用 Rust 或 Photon 用户界面
+* 仅支持 64 位系统
+
+### 在 Linux 上安装 Basilisk
+
+你可能没有在软件中心中找到它。因此,你必须前往其官方[下载页面][11]获得 tarball(tar.xz)文件。
+
+下载后,只需将其解压缩并进入文件夹。接下来,你将在其中找到一个 `Basilisk` 可执行文件。你只需双击或右键单击并选择 “运行” 即可运行它。
+
+你可以查看它的 [GitHub 页面][12]获取更多信息。
+
+![][13]
+
+你也可以按照下面的步骤使用终端进入下载的文件夹,并运行文件:
+
+```
+cd basilisk-latest.linux64
+cd basilisk
+./basilisk
+```
+
+- [下载 Basilisk][1]
+
+### 使用 Basilisk 浏览器
+
+![][14]
+
+如果你想要支持旧版扩展,Basilisk 是不错的 Firefox 复刻。它是由 Pale Moon 背后的团队积极开发的,对于希望获得 Mozilla Firefox(在 Quantum 更新之前)经典外观,且不包括现代 Web 支持的用户而言,它可能是一个不错的选择。
+
+浏览网页没有任何问题。但是,我注意到 YouTube 将其检测为过时的浏览器,并警告说它将很快停止支持它。
+
+**因此,我不确定 Basilisk 是否适合所有现有的 Web 服务 —— 但是,如果你确实需要使用 Firefox 较早版本中的扩展,那这是一个解决方案。**
+
+### 总结
+
+你认为这个 Firefox 复刻值得尝试吗?你喜欢哪个?在下面的评论中分享你的想法。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/basilisk-browser/
+
+作者:[Ankush Das][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/ankush/
+[b]: https://github.com/lujun9972
+[1]: https://www.basilisk-browser.org/
+[2]: https://itsfoss.com/waterfox-browser/
+[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/basilisk-itsfoss.jpg?ssl=1
+[4]: https://www.palemoon.org
+[5]: https://itsfoss.com/open-source-browsers-linux/
+[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/03/basilisk-options-1.jpg?ssl=1
+[7]: https://developer.mozilla.org/en-US/docs/Archive/Mozilla/XUL
+[8]: https://wiki.mozilla.org/NPAPI
+[9]: https://en.wikipedia.org/wiki/Goanna_(software)
+[10]: https://developer.mozilla.org/en-US/docs/Mozilla/Gecko
+[11]: https://www.basilisk-browser.org/download.shtml
+[12]: https://github.com/MoonchildProductions/Basilisk
+[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/basilisk-folder-1.jpg?ssl=1
+[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/basilisk-browser-1.jpg?ssl=1
diff --git a/published/20200310 Containers vs. VMs, Istio in production, and more industry news.md b/published/20200310 Containers vs. VMs, Istio in production, and more industry news.md
new file mode 100644
index 0000000000..c897efde43
--- /dev/null
+++ b/published/20200310 Containers vs. VMs, Istio in production, and more industry news.md
@@ -0,0 +1,85 @@
+[#]: collector: "lujun9972"
+[#]: translator: "messon007"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-12015-1.html"
+[#]: subject: "Containers vs. VMs, Istio in production, and more industry news"
+[#]: via: "https://opensource.com/article/20/3/survey-istio-industry-news"
+[#]: author: "Tim Hildred https://opensource.com/users/thildred"
+
+每周开源点评:容器 vs 虚拟机、生产环境中的 Istio 等
+======
+
+> 本文是最近一周开源社区的新闻和行业进展。
+
+![Person standing in front of a giant computer screen with numbers, data][1]
+
+我在一家采用开源软件开发模型的企业软件公司任高级产品营销经理,我的一部分职责是为产品营销人员,经理和其他相关人定期发布有关开源社区,市场和业界发展趋势的更新。以下是该更新中我和他们最喜欢的五篇文章。
+
+### 云原生应用采用的技术:容器等
+
+- [文章链接][2]
+
+> * 在生产环境中采用容器的比例从 2018 年的 73% 上升到 2019 年的 84%。其中,运行了至少 250 个容器的比例从 2018 年的 46% 上升到 2019 年的 58%。2017 到 2019 年间, 环境中拥有 50 台以上计算机(物理或虚拟)的受访者人数从 2017 年的 77% 上升到 2019 年的 81%。
+> * 表明: 容器的引入似乎缓解了需要管理的 VM 的快速增长。但是,请警惕要管理的原始机器数量会减少的说法。
+>
+
+**分析**:从直觉上看,随着容器使用的增长,虚拟机的增长将放缓;有许多容器被部署在虚拟机内部,从而充分利用了两者的优势特性,而且许多应用不会很快被容器化(留意下你所在企业的传统单体式应用)。
+
+### 在生产环境中运行Istio的经验
+
+- [文章链接][3]
+
+> 在 HelloFresh,我们将团队分为小队和团伙。每个团伙都有自己的 Kubernetes 命名空间。如上所述,我们先按命名空间启用 sidecar 注入,然后再逐个对应用启用。在将应用添加到 Istio 之前,我们举办了研讨会,以使小队了解其应用发生的变化。由于我们采用“您构建,您维护”的模型,团队可以在故障定位时了解应用的进出流量。不仅如此,它还提升了公司内部的知识量。我们还创建了 Istio 相关的 [OKR][4] ,来跟踪我们的进度并达成我们引入Istio的目的。
+
+**分析**:引入或是不引入技术,要由自己决定,同时要自行承担相应的后果。
+
+### Aether: 首个开源的边缘云平台
+
+- [文章链接][5]
+
+> ONF 的营销副主席 Sloane 这样解释 Aether: 它将多个正在自己的沙箱中开发和运行的项目聚集到一起,ONF 试图在该框架下将多种边缘服务在一个融合平台上支持起来。ONF 的各个项目将保持独立并可继续单独使用,但是 Aether 试图将多个能力绑定到一起来简化企业的私有边缘云运营。
+>
+> 他说:“我们认为我们正在创造一个新的合作空间,工业界和社区可以携手帮助推动通用平台背后的整合和关键工作,然后可以帮助这些边缘云中的通用功能不断发展”。
+
+**分析**:当今,使用技术解决的问题过于复杂,无法通过单一技术解决。比技术更重要的是要解决的业务问题需要聚焦于真正增值的部分。将两者结合起来,就是企业之间需要在他们共同的需求上找到合作的方法,并在它们特有的方面进行竞争。除了开源,你找不到比这更好的方法了。
+
+### 与云相关职业的女性正在改变现状
+
+- [文章链接][6]
+
+> Yordanova 说:“由于云是一种相对较新的技术,我的[成为一名“科技女性”][7]的经验可能并不典型,因为云行业极为多样化”。“实际上,我的团队中性别比例相当,成员由随着云技术而成长的不同个性、文化和优势的具体人员组成。“
+
+**分析**:我想考虑的一件事就是跨越式的演进思路。你可能可以跳过演进过程中的某个步骤或阶段,因为原先导致其存在的条件已不再适用。云技术时代没有形成“谁发明的以及它是为谁而生”的固有说法,所以也许它所承载的某些前代的技术负担更少?
+
+### StarlingX 如何在中国开源项目的星空中闪耀
+
+- [文章链接][8]
+
+> 我们的团队在中国,因此我们的任务之一是帮助中国的社区开发软件、贡献代码、文档等。大多数 StarlingX 项目会议是在中国的深夜举行,因此华人社区成员的出席和参与颇具挑战。为了克服这些障碍,我们与中国的其他社区成员(例如 99cloud 的朋友)一起采取了一些措施,例如和其他社区成员一起聚会,一起参加动手实践研讨会和中文的特设技术会议,将一些文档翻译成中文,并在微信小组中不断进行互动(就像每个人都可以享受的 24/7 通话服务一样)
+
+**分析**:随着中国对开源项目的贡献不断增长,这种情况似乎有可能逆转或至少相当。“学习英语”根本不是参与开源项目开发的先决条件。
+
+希望你喜欢这个列表,下周再见。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/survey-istio-industry-news
+
+作者:[Tim Hildred][a]
+选题:[lujun9972][b]
+译者:[messon007](https://github.com/messon007)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/thildred
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/data_metrics_analytics_desktop_laptop.png?itok=9QXd7AUr "Person standing in front of a giant computer screen with numbers, data"
+[2]: https://thenewstack.io/cncf-survey-snapshot-tech-adoption-in-the-cloud-native-world/
+[3]: https://engineering.hellofresh.com/everything-we-learned-running-istio-in-production-part-1-51efec69df65
+[4]: https://en.wikipedia.org/wiki/OKR
+[5]: https://www.sdxcentral.com/articles/news/onf-projects-coalesce-for-enterprise-edge-cloud/2020/03/
+[6]: https://www.cloudpro.co.uk/leadership/cloud-essentials/8446/how-women-in-cloud-are-challenging-the-narrative
+[7]: https://www.itpro.co.uk/business-strategy/33301/diversity-not-a-company-priority-claim-nearly-half-of-women-in-tech
+[8]: https://superuser.openstack.org/articles/starlingx-community-interview-how-starlingx-shines-in-the-starry-sky-of-open-source-projects-in-china/
diff --git a/published/20200311 How to install pip to manage PyPI packages easily.md b/published/20200311 How to install pip to manage PyPI packages easily.md
new file mode 100644
index 0000000000..b6453085c1
--- /dev/null
+++ b/published/20200311 How to install pip to manage PyPI packages easily.md
@@ -0,0 +1,145 @@
+[#]: collector: (lujun9972)
+[#]: translator: (HankChow)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11993-1.html)
+[#]: subject: (How to install pip to manage PyPI packages easily)
+[#]: via: (https://opensource.com/article/20/3/pip-linux-mac-windows)
+[#]: author: (Vijay Singh Khatri https://opensource.com/users/vijaytechnicalauthor)
+
+安装 pip 轻松管理 PyPI 软件包
+======
+
+> 在 Linux、Mac 或 Windows 上为旧版 Python 安装 pip。
+
+![](https://img.linux.net.cn/data/attachment/album/202003/14/102539wq3a73opalpzoabb.jpg)
+
+Python 是一种功能强大、流行广泛的编程语言,在常规编程、数据科学等很多方面它都有丰富的软件包可供使用。但这些软件包通常都不会在 Python 安装时自动附带,而是需要由用户自行下载、安装和管理。所有的这些软件包(包括库和框架)都存放在一个名叫 [PyPI][2](也就是 Python 软件包索引)的中央存储库当中,而 `pip`(也就是首选安装程序)则是管理这个中央存储库的工具。
+
+在安装 `pip` 之后,管理 PyPI 的软件包就变得很方便了。大部分的软件包都可以通过在终端或者命令行界面执行 `python -m pip install <软件包名>` 这样的命令来完成安装。
+
+较新版本的 Python 3(3.4 或以上)和 Python 2(2.7.9 或以上)都已经预装了 `pip`,旧版本的 Python 没有自带 `pip`,但可以另外安装。
+
+在这篇文章中,我将会介绍 `pip` 在 Linux、Mac 和 Windows 系统上的安装过程。想要了解更多详细信息,可以参考 [pip.pypa][3] 的文档。
+
+### 首先需要安装 Python
+
+首先你的系统中需要安装好 Python,否则 `pip` 安装器无法理解任何相关的命令。你可以在命令行界面、Bash 或终端执行 `python` 命令确认系统中是否已经安装 Python,如果系统无法识别 `python` 命令,请先[下载 Python][4] 并安装。安装完成后,你就可以看到一些引导你安装 `pip` 的提示语了。
+
+### 在 Linux 上安装 pip
+
+在不同发行版的 Linux 上,安装 `pip` 的命令也有所不同。
+
+在 Fedora、RHEL 或 CentOS 上,执行以下命令安装:
+
+```
+$ sudo dnf install python3
+```
+
+在 Debian 或 Ubuntu 上,使用 `apt` 包管理工具安装:
+
+```
+$ sudo apt install python3-pip
+```
+
+其它的发行版可能还会有不同的包管理工具,比如 Arch Linux 使用的是 `pacman`:
+
+```
+$ sudo pacman -S python-pip
+```
+
+执行 `pip --version` 命令就可以确认 `pip` 是否已经正确安装。
+
+在 Linux 系统上安装 `pip` 就是这样简单,你可以直接跳到“使用 pip”部分继续阅读。
+
+### 在 Mac 上安装 pip
+
+MacOS 已经预装了 Python,但 Python 版本一般是比较旧的。如果你要使用 Python 的话,建议[另外安装 Python 3][6]。
+
+在 Mac 上可以使用 [homebrew][7] 安装 Python 3:
+
+```
+$ brew update && brew upgrade python
+```
+
+如果你安装的是以上提到的新版本 Python 3,它会自带 `pip` 工具。你可以使用以下命令验证:
+
+```
+$ python3 -m pip --version
+```
+
+如果你使用的是 Mac,安装过程也到此结束,可以从“使用 pip”部分继续阅读。
+
+### 在 Windows 上安装 pip
+
+以下 `pip` 安装过程是针对 Windows 8 和 Windows 10 的。下面文章中的截图是 Windows 10 环境下的截图,但对 Windows 8 同样适用。
+
+首先确认 [Python 已经安装完成][8]。
+
+如果你想在 Windows 系统上像 Linux 一样使用包管理工具,[Chocolatey][9] 是一个不错的选择,它可以让 Python 的调用和更新变得更加方便。Chocolatey 在 PowerShell 中就可以运行,只需要简单的命令,Python 就可以顺利安装。
+
+```
+PS> choco install python
+```
+
+接下来就可以使用 `pip` 安装所需的软件包了。
+
+### 使用 pip
+
+在 Linux、BSD、Windows 和 Mac 上,`pip` 都是以同样的方式使用的。
+
+例如安装某个库:
+
+```
+python3 -m pip install foo --user
+```
+
+卸载某个已安装的库:
+
+```
+python3 -m pip uninstall foo
+```
+
+按照名称查找软件包:
+
+```
+python3 -m pip search foo
+```
+
+将 `pip` 更新到一个新版本:
+
+```
+$ sudo pip install --upgrade pip
+```
+
+需要注意的是,在 Windows 系统中不需要在前面加上 `sudo` 命令,这是因为 Windows 通过独有的方式管理用户权限,对应的做法是[创建一个执行策略例外][10]。
+
+```
+python -m pip install --upgrade pip
+```
+
+希望本文介绍的的方法能对你有所帮助,欢迎在评论区分享你的经验。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/pip-linux-mac-windows
+
+作者:[Vijay Singh Khatri][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/vijaytechnicalauthor
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/1980s-computer-yearbook.png?itok=eGOYEKK- (Person typing on a 1980's computer)
+[2]: https://pypi.org/
+[3]: https://pip.pypa.io/en/stable/installing/
+[4]: https://www.python.org/downloads/
+[5]: tmp.u1JOYd3gs9#usage
+[6]: https://opensource.com/article/19/5/python-3-default-mac
+[7]: https://brew.sh
+[8]: https://opensource.com/article/19/8/how-install-python-windows
+[9]: https://opensource.com/article/20/3/chocolatey
+[10]: https://opensource.com/article/20/3/chocolatey#admin
diff --git a/published/20200312 Amazon Has Launched Its Own Linux Distribution But It-s Not for Everyone.md b/published/20200312 Amazon Has Launched Its Own Linux Distribution But It-s Not for Everyone.md
new file mode 100644
index 0000000000..49d54dbc48
--- /dev/null
+++ b/published/20200312 Amazon Has Launched Its Own Linux Distribution But It-s Not for Everyone.md
@@ -0,0 +1,87 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-12018-1.html)
+[#]: subject: (Amazon Has Launched Its Own Linux Distribution But It’s Not for Everyone)
+[#]: via: (https://itsfoss.com/bottlerocket-linux/)
+[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
+
+Amazon 推出了自己的容器专用 Linux 发行版“瓶装火箭”
+======
+
+![](https://img.linux.net.cn/data/attachment/album/202003/21/074953h0a55lq72h0qlpzd.jpg)
+
+Amazon 已经[推出][1]了自己的基于 Linux 的开源操作系统 Bottlerocket(“瓶装火箭”)。但在你兴奋地想要尝试安装和运行它之前,我必须告诉你,它不是常规的如 Ubuntu、Fedora 或 Debian 这样的 Linux 发行版。那它是什么?
+
+### Bottlerocket:来自 Amazon 的 Linux 发行版,用于运行容器
+
+![][2]
+
+如果你不了解 Linux 容器,建议你阅读 Red Hat 的[这篇文章][3]。
+
+自从首次提出云计算一词以来,IT 行业发生了许多变化。得益于 Amazon AWS、Google、Linode、Digital Ocean 等云服务器提供商,部署 Linux 服务器(通常在虚拟机中运行)只需几秒钟。最重要的是,你可以借助 Docker 和 Kubernetes 之类的工具在这些服务器上以容器形式部署应用和服务。
+
+问题是,当你唯一目的是在 Linux 系统上运行容器时,并不总是需要完整的 Linux 发行版。这就是为什么容器专用 Linux 仅提供必要软件包的原因。这将大大减少操作系统的大小,从而进一步减少部署时间。
+
+[Bottlerocket][5] Linux 由 Amazon Web Services(AWS)专门构建,用于在虚拟机或裸机上运行容器。它支持 docker 镜像和其他遵循 [OCI 镜像][6]格式的镜像。
+
+### Bottlerocket Linux 的特性
+
+![][7]
+
+这是来自 Amazon 的新 Linux 发行版提供的特性:
+
+#### 没有逐包更新
+
+传统的 Linux 发行版更新过程由更新单个软件包组成。Bottlerocket 改用基于镜像的更新。
+
+由于采用了这种方法,可以避免冲突和破坏,并可以进行快速而完整的回滚(如有必要)。
+
+#### 只读文件系统
+
+Bottlerocket 还使用了只读主文件系统。在启动时通过 dm-verity 检查其完整性。在其他安全措施上,也不建议使用 SSH 访问,并且只能通过[管理容器][8](附加机制)使用。
+
+AWS 已经统治了云世界。
+
+#### 自动更新
+
+你可以使用 Amazon EKS 之类的编排服务来自动执行 Bottlerocket 更新。
+
+Amazon 还声称,与通用 Linux 发行版相比,仅包含运行容器的基本软件可以减少攻击面。
+
+### 你怎么看?
+
+Amazon 并不是第一个创建“容器专用 Linux” 的公司。我认为 CoreOS 是最早的此类发行版之一。[CoreOS 被 Red Hat 收购][9],Red Hat 又被 [IBM 收购][10]。Red Hat 公司最近停用了 CoreOS,并用 [Fedora CoreOS][11] 代替了它。
+
+云服务器是一个巨大的行业,它将继续发展壮大。像 Amazon 这样的巨头将竭尽所能与它竞争对手保持一致或领先。我认为,Bottlerocket 是对 IBM Fedora CoreOS(目前)的应答。
+
+尽管 [Bottlerocket 仓库可在 GitHub 上找到][12],但我还没发现就绪的镜像(LCTT 译注:源代码已经提供)。在撰写本文时,它仅[可在 AWS 上预览][5]。
+
+你对此有何看法?Amazon 会从 Bottlerocket 获得什么?如果你以前使用过 CoreOS 之类的软件,你会切换到 Bottlerocket 么?
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/bottlerocket-linux/
+
+作者:[Abhishek Prakash][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/abhishek/
+[b]: https://github.com/lujun9972
+[1]: https://aws.amazon.com/blogs/aws/bottlerocket-open-source-os-for-container-hosting/
+[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/03/botlerocket-logo.png?ssl=1
+[3]: https://www.redhat.com/en/topics/containers/whats-a-linux-container
+[4]: https://www.linode.com/
+[5]: https://aws.amazon.com/bottlerocket/
+[6]: https://www.opencontainers.org/
+[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/03/BottleRocket.png?ssl=1
+[8]: https://github.com/bottlerocket-os/bottlerocket-admin-container
+[9]: https://itsfoss.com/red-hat-acquires-coreos/
+[10]: https://itsfoss.com/ibm-red-hat-acquisition/
+[11]: https://getfedora.org/en/coreos/
+[12]: https://github.com/bottlerocket-os/bottlerocket
diff --git a/published/20200313 6 Best AUR (Arch User Repository) Helpers for Arch Linux.md b/published/20200313 6 Best AUR (Arch User Repository) Helpers for Arch Linux.md
new file mode 100644
index 0000000000..0a49142c98
--- /dev/null
+++ b/published/20200313 6 Best AUR (Arch User Repository) Helpers for Arch Linux.md
@@ -0,0 +1,215 @@
+[#]: collector: (lujun9972)
+[#]: translator: (hkurj)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-12019-1.html)
+[#]: subject: (6 Best AUR (Arch User Repository) Helpers for Arch Linux)
+[#]: via: (https://www.2daygeek.com/best-aur-arch-user-repository-helpers-arch-linux-manjaro/)
+[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/)
+
+6 个用于 Arch Linux 的最佳 AUR 助手
+======
+
+![](https://img.linux.net.cn/data/attachment/album/202003/21/082920kxdmlwkk7xx7llpw.jpeg)
+
+Arch Linux 是一款 Linux 发行版,主要由针对 x86-64 微处理器计算机的二进制软件包组成。Arch Linux 使用的是滚动发布模型,这种模式会频繁的给应用程序交付更新。它使用名为 [pacman][1] 的软件包管理器,可以用来安装、删除和更新软件包。
+
+由于 Arch Linux 是为有经验的用户构建的,建议新手在使用过其他 Linux 后再来尝试。
+
+### 什么是 AUR(Arch 用户软件仓库)?
+
+[Arch 用户软件仓库][2] 通常称为 AUR,是给 Arch 用户的基于社区的软件存储库。
+
+根据软件包在 AUR 社区的流行程度,用户编译的软件包会进入到 Arch 的官方存储库。
+
+### 什么是 AUR 助手?
+
+[AUR 助手][3]是一个包装程序,允许用户从 AUR 存储库安装软件包,而无需手动干预。
+
+很多用例实现了自动化,比如包搜索、解决依赖关系、检索和构建 AUR 包、Web 内容检索和 AUR 包提交之类。
+
+以下列出了 6 种最佳的 AUR 助手:
+
+* Yay(Yet another Yogurt)
+* Pakku
+* Pacaur
+* Pikaur
+* Trizen
+* Aura
+
+### 1)Yay(Yet another Yogurt)
+
+[Yay][4] 是 Arch Linux 下基于 CLI 的最佳 AUR 助手,使用 Go 语言编写。Yay 是基于 yaourt、apacman 和 pacaur 设计的。
+
+这是最合适推荐给新手的 AUR 助手。类似于 Pacman,其使用方法和 `pacman` 中的命令和选项很相似,可以让用户在搜索过程中找到匹配的软件包提供程序,并进行选择。
+
+#### 如何安装 yay
+
+依次运行以下命令以在 Arch Linux 系统上安装。
+
+```
+$ sudo pacman -S git go base-devel
+$ git clone https://aur.archlinux.org/yay.git
+$ cd yay
+$ makepkg -si
+```
+
+#### 如何使用 yay
+
+`yay` 语法与 `pacman` 相同,使用以下命令安装软件包。
+
+```
+$ yay -s arch-wiki-man
+```
+
+### 2)Pakku
+
+[Pakku][5] 可以被视为一个初始阶段的 Pacman。它是一个包装程序,可以让用户从 AUR 中搜索或安装软件包。
+
+它在删除依赖项方面做得不错,并且还允许通过克隆 PKGBUILD 来安装软件包。
+
+#### 如何安装 Pakku
+
+要在 Arch Linux 的系统上安装 Pakku,请依次运行以下命令。
+
+```
+$ sudo pacman -S git base-devel
+$ git clone https://aur.archlinux.org/pakku.git
+$ cd pakku
+$ makepkg -si
+```
+
+#### 如何使用 Pakku
+
+`pakku` 语法与 `pacman` 相同,使用以下命令安装软件包。
+
+```
+$ pakku -s dropbox
+```
+
+### 3)Pacaur
+
+另一个基于 CLI 的 AUR 助手,可帮助减少用户与提示符的交互。
+
+[Pacaur][6] 专为倾向于自动化重复任务的高级用户而设计。用户需要熟悉 `makepkg` 及其配置的 AUR 手动构建过程。
+
+#### 如何安装 Pacaur
+
+要在 Arch Linux 的系统上安装 Pakku,请依次运行以下命令。
+
+```
+$ sudo pacman -S git base-devel
+$ git clone https://aur.archlinux.org/pacaur.git
+$ cd pacaur
+$ makepkg -si
+```
+
+#### 如何使用 Pacaur
+
+`pacaur` 语法与 `pacman` 相同,使用以下命令安装软件包。
+
+```
+$ pacaur -s spotify
+```
+
+### 4)Pikaur
+
+[Pikaur][7] 是具有最小依赖性的 AUR 助手,可以一次查看所有 PKGBUILD,无需用户交互即可全部构建。
+
+Pikaur 将通过控制 `pacman` 命令来告知 Pacman 要执行的下一个步骤。
+
+#### 如何安装 Pikaur
+
+要在 Arch Linux 的系统上安装 Pakku,请依次运行以下命令。
+
+```
+$ sudo pacman -S git base-devel
+$ git clone https://aur.archlinux.org/pikaur.git
+$ cd pikaur
+$ makepkg -fsri
+```
+
+#### 如何使用 Pikaur
+
+`pikaur` 语法与 `pacman` 相同,使用以下命令安装软件包。
+
+```
+$ pacaur -s spotify
+```
+
+### 5)Trizen
+
+[Trizen][8] 是用 Perl 编写的基于命令行的 AUR 轻量级包装器。这个面向速度的 AUR 助手,它允许用户搜索、安装软件包,还允许阅读 AUR 软件包注释。
+
+支持编辑文本文件,并且输入/输出使用 UTF-8。内置与 `pacman` 的交互功能。
+
+#### 如何安装 Trizen
+
+要在 Arch Linux 的系统上安装 Trizen,请依次运行以下命令。
+
+```
+$ sudo pacman -S git base-devel
+$ git clone https://aur.archlinux.org/trizen.git
+$ cd trizen
+$ makepkg -si
+```
+
+#### 如何使用 Trizen
+
+`trizen` 语法与 `pacman` 相同,使用以下命令安装软件包。
+
+```
+$ pacaur -s google-chrome
+```
+
+### 6)Aura
+
+[Aura][9] 是用 Haskell 编写的,是用于 Arch Linux 和 AUR 的安全的多语言包管理器。它支持许多Pacman 操作和子选项,可轻松进行开发并编写精美的代码。
+
+它可以自动从 AUR 安装软件包。使用 Aura 时,用户通常会在系统升级方面遇到一些困难。
+
+#### 如何安装 Aura
+
+要在 Arch Linux 的系统上安装 Pakku,请依次运行以下命令。
+
+```
+$ sudo pacman -S git base-devel
+$ git clone https://aur.archlinux.org/aura.git
+$ cd aura
+$ makepkg -si
+```
+
+#### 如何使用 Aura
+
+`aura` 语法与 `pacman` 相同,使用以下命令安装软件包。
+
+```
+$ pacaur -s android-sdk
+```
+
+### 结论
+
+用户可以凭借这些分析在上述 6 个 AUR 助手中进行选择。
+
+--------------------------------------------------------------------------------
+
+via: https://www.2daygeek.com/best-aur-arch-user-repository-helpers-arch-linux-manjaro/
+
+作者:[Magesh Maruthamuthu][a]
+选题:[lujun9972][b]
+译者:[hkurj](https://github.com/hkurj)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.2daygeek.com/author/magesh/
+[b]: https://github.com/lujun9972
+[1]: https://www.2daygeek.com/pacman-command-examples-manage-packages-arch-linux-system/
+[2]: https://wiki.archlinux.org/index.php/Arch_User_Repository
+[3]: https://wiki.archlinux.org/index.php/AUR_helpers
+[4]: https://github.com/Jguer/yay
+[5]: https://github.com/kitsunyan/pakku
+[6]: https://github.com/E5ten/pacaur
+[7]: https://github.com/actionless/pikaur
+[8]: https://github.com/trizen/trizen
+[9]: https://github.com/fosskers/aura
diff --git a/published/20200313 GNOME 3.36 Released With Visual - Performance Improvements.md b/published/20200313 GNOME 3.36 Released With Visual - Performance Improvements.md
new file mode 100644
index 0000000000..f193b4d245
--- /dev/null
+++ b/published/20200313 GNOME 3.36 Released With Visual - Performance Improvements.md
@@ -0,0 +1,114 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-12030-1.html)
+[#]: subject: (GNOME 3.36 Released With Visual & Performance Improvements)
+[#]: via: (https://itsfoss.com/gnome-3-36-release/)
+[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
+
+GNOME 3.36 发布,对视觉和性能进行了改进
+======
+
+![](https://img.linux.net.cn/data/attachment/album/202003/23/151837oglshll1b7kjj8jg.jpg)
+
+在 [GNOME 3.34][1] 发布 6 个月后,最新版本的 GNOME 3.36 代号为 “Gresik” 也最终发布了。不仅是添加了功能,GNOME 3.36 还改进了许多我们需要的功能。
+
+在本文中,我将重点介绍 GNOME 新版本的主要更改。
+
+### GNOME 3.36 的关键改进
+
+如果你想快速了解发生了什么变化,可以看以下官方视频:
+
+[视频][2]
+
+现在,让我分别重点介绍最新版本中的更改:
+
+#### GNOME Shell 扩展应用
+
+你可以通过专门的“扩展”程序轻松管理 GNOME Shell 的扩展。
+
+![][3]
+
+因此,你可以使用该程序更新、配置、删除或禁用现有扩展。
+
+#### 切换到请勿打扰(DND)
+
+![][4]
+
+你可能已经在 Pop!\_OS 或其他 Linux 发行版中注意到了它。
+
+但是,GNOME 3.36 现在在通知弹出区域中实现了 DND 切换。除非你将其关闭,否则不会收到任何通知。
+
+#### 锁屏改进
+
+![][5]
+
+在新版本中,锁定屏幕在输入凭据之前没有额外的动画。取而代之会在登录屏幕直接打招呼。
+
+另外,为了提升一致性,锁屏背景将是墙纸的模糊版本。
+
+总的来说,对锁屏的改进旨在使之更易于访问,同时改善其外观/感觉。
+
+#### 视觉变化
+
+![][6]
+
+包含了一些明显的新增,这些设计更改改善了 GNOME 3.36 的总体外观。
+
+从图标的重新设计到文件夹和系统对话框,进行了许多小的改进以增强 GNOME 3.36 的用户体验。
+
+此外,设置应用已进行了调整,通过微小的界面重新设计,使得选项访问更加容易。
+
+#### 主要性能改进
+
+GNOME 声称,此更新还提升了 GNOME 桌面的性能。
+
+当使用装有 GNOME 3.36 的发行版时,你会注意到在性能上有明显的不同。无论是动画、重新设计还是微小的调整,对于 GNOME 3.36 所做的一切都会对用户的性能产生积极影响。
+
+#### 其他更改
+
+除了上述关键更改之外,还有很多其他改进,例如:
+
+* 时钟重新设计
+* 用户文档更新
+* GNOME 安装助手改进
+
+还有许多其他更改。你可以查看[官方发布说明][7]了解更多信息。
+
+### 如何获取 GNOME 3.36?
+
+即使 GNOME 3.36 已正式发布。Linux 发行版可能需要一段时间才能让你轻松升级 GNOME 体验。
+
+[Ubuntu 20.04 LTS][8] 将提供最新版本 GNOME。你可以等待。
+
+其他[流行的 Linux 发行版][9],如 Fedora、OpenSuse、Pop!\_OS,应该会很快包含 GNOME 3.36。[Arch Linux][10] 已升级到 GNOME 3.36。
+
+我建议你耐心等待,直到获得发行版本的更新。不过,你可以查看[源代码][11]或尝试即将发布的流行发行版的开发版本,这些发行版可能有 GNOME 3.36。
+
+你如何看待 GNOME 3.36?在下面的评论中让我知道你的想法。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/gnome-3-36-release/
+
+作者:[Ankush Das][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/ankush/
+[b]: https://github.com/lujun9972
+[1]: https://itsfoss.com/gnome-3-34-release/
+[2]: https://img.linux.net.cn/static/video/Introducing%20GNOME%203.36%20-%20%27Gresik%27-ae2D4aWTsXM.mp4
+[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/extensions-gnome.jpg?ssl=1
+[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/dnd-gnome.jpg?ssl=1
+[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/gnome-lockscreen.jpg?ssl=1
+[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/gnome-settings.jpg?ssl=1
+[7]: https://help.gnome.org/misc/release-notes/3.36/
+[8]: https://itsfoss.com/ubuntu-20-04-release-features/
+[9]: https://itsfoss.com/best-linux-distributions/
+[10]: https://www.archlinux.org/
+[11]: https://gitlab.gnome.org/GNOME
diff --git a/published/20200313 How to Change MAC Address in Linux.md b/published/20200313 How to Change MAC Address in Linux.md
new file mode 100644
index 0000000000..5e8d12da57
--- /dev/null
+++ b/published/20200313 How to Change MAC Address in Linux.md
@@ -0,0 +1,173 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-12008-1.html)
+[#]: subject: (How to Change MAC Address in Linux)
+[#]: via: (https://itsfoss.com/change-mac-address-linux/)
+[#]: author: (Dimitrios Savvopoulos https://itsfoss.com/author/itsfoss/)
+
+如何在 Linux 中更改 MAC 地址
+======
+
+在向你展示如何在 Linux 中更改 MAC 地址之前,让我们首先讨论为什么要更改它。
+
+可能有几个原因。也许你不希望在公共网络上公开你的实际 [MAC 地址][1](也称为物理地址)?还有可能是网络管理员可能已在路由器或防火墙中阻止了特定的 MAC 地址。
+
+一个实用的“好处”是某些公共网络(例如机场 WiFi)允许在有限的时间内免费上网。如果你还想继续使用,那么伪造 Mac 地址可能会欺骗网络,让它认为是一台新设备。这也是一个有名的原因。
+
+![](https://img.linux.net.cn/data/attachment/album/202003/18/120702qdjyb7hvyj7bsrj7.jpg)
+
+我将展示更改 MAC 地址(也称为欺骗/伪造 MAC 地址)的步骤。
+
+### 在 Linux 中更改 MAC 地址
+
+让我们一步步来:
+
+#### 查找你的 MAC 地址和网络接口
+
+让我们找出一些[关于 Linux 中网卡的细节][3]。使用此命令获取网络接口详细信息:
+
+```
+ip link show
+```
+
+在输出中,你将看到一些详细信息以及 MAC 地址:
+
+```
+1: lo: mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
+ link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
+2: eno1: mtu 1500 qdisc fq_codel state DOWN mode DEFAULT group default qlen 1000
+ link/ether 94:c6:f8:a7:d7:30 brd ff:ff:ff:ff:ff:ff
+3: enp0s31f6: mtu 1500 qdisc noqueue state UP mode DORMANT group default qlen 1000
+ link/ether 38:42:f8:8b:a7:68 brd ff:ff:ff:ff:ff:ff
+4: docker0: mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
+ link/ether 42:02:07:8f:a7:38 brd ff:ff:ff:ff:ff:ff
+```
+
+如你所见,在这里,我的网络接口称为 `enp0s31f6`,MAC 地址为 `38:42:f8:8b:a7:68`。
+
+你可能需要在安全的地方记录下来,以便稍后还原到该原始 MAC 地址。
+
+现在你可以继续更改 MAC 地址。
+
+注意!
+
+如果在当前使用的网络接口上执行此操作,那么可能会中断你的网络连接。因此,请在其他网卡上尝试使用此方法,或者准备重启网络。
+
+#### 方法 1:使用 Macchanger 更改 MAC 地址
+
+![][4]
+
+[Macchanger][5] 是查看、修改和操作网卡 MAC 地址的简单程序。它几乎在所有 GNU/Linux 操作系统中都可用,你可以使用发行版的包安装程序进行安装。
+
+在 Arch Linux 或 Manjaro 上:
+
+```
+sudo pacman -S macchanger
+```
+
+在 Fedora、CentOS 和 RHEL 上:
+
+```
+sudo dnf install macchanger
+```
+
+在 Debian、Ubuntu、Linux Mint、Kali Linux 上:
+
+```
+sudo apt install macchanger
+```
+
+**重要!**系统会要求你选择是否应将 `macchanger` 设置为在每次启动或关闭网络设备时自动运行。每当你接到网线或重启 WiFi 时,它都会提供一个新的 MAC 地址。
+
+![Not a good idea to run it automatically][6]
+
+我建议不要自动运行它,除非你确实需要每次更改 MAC 地址。因此,选择“No”(按 `Tab` 键),然后按回车键继续。
+
+**如何使用 Macchanger 更改 MAC 地址**
+
+你还记得网络接口名称吗?你在前面的步骤中获得了它。
+
+现在,要将随机 MAC 地址分配给该网卡,请使用:
+
+```
+sudo macchanger -r enp0s31f6
+```
+
+更改 MAC 后,使用以下命令进行验证:
+
+```
+ip addr
+```
+
+现在你将看到已经伪造 MAC。
+
+要将 MAC 地址更改为特定值,请使用以下命令指定自定义 MAC 地址:
+
+```
+macchanger --mac=XX:XX:XX:XX:XX:XX
+```
+
+其中 XX:XX:XX:XX:XX:XX 是你要更改的新 MAC。
+
+最后,要将 MAC 地址恢复为其原始硬件值,请运行以下命令:
+
+```
+macchanger -p enp0s31f6
+```
+
+但是,你不必如此。重启系统后,更改将自动丢失,并且实际的 MAC 地址将再次恢复。
+
+你可以随时查看手册页以获取更多详细信息。
+
+#### 方法 2:使用 iproute2 更改 Mac 地址(中级知识)
+
+我建议你使用 macchanger,但如果你不想使用它,那么可以使用另一种方法在 Linux 中更改 MAC 地址。
+
+首先,使用以下命令关闭网卡:
+
+```
+sudo ip link set dev enp0s31f6 down
+```
+
+接下来,使用以下命令设置新的 MAC:
+
+```
+sudo ip link set dev enp0s31f6 address XX:XX:XX:XX:XX:XX
+```
+
+最后,使用以下命令重新打开网络:
+
+```
+sudo ip link set dev enp0s31f6 up
+```
+
+现在,验证新的 MAC 地址:
+
+```
+ip link show enp0s31f6
+```
+
+就是这些了。你已经成功地在 Linux 中修改了 MAC 地址。敬请期待 FOSS 更多有关 Linux 教程和技巧的文章。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/change-mac-address-linux/
+
+作者:[Dimitrios Savvopoulos][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/itsfoss/
+[b]: https://github.com/lujun9972
+[1]: https://en.wikipedia.org/wiki/MAC_address
+[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/airport_wifi_meme.jpg?ssl=1
+[3]: https://itsfoss.com/find-network-adapter-ubuntu-linux/
+[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/03/Change_MAC_Address_Linux.jpg?ssl=1
+[5]: https://github.com/alobbs/macchanger
+[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/configuring_mcchanger.jpg?ssl=1
+[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/Dimitrios.jpg?ssl=1
diff --git a/published/20200314 How to Install Netbeans on Ubuntu and Other Linux.md b/published/20200314 How to Install Netbeans on Ubuntu and Other Linux.md
new file mode 100644
index 0000000000..95cd74089e
--- /dev/null
+++ b/published/20200314 How to Install Netbeans on Ubuntu and Other Linux.md
@@ -0,0 +1,98 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-12017-1.html)
+[#]: subject: (How to Install Netbeans on Ubuntu and Other Linux)
+[#]: via: (https://itsfoss.com/install-netbeans-ubuntu/)
+[#]: author: (Community https://itsfoss.com/author/itsfoss/)
+
+如何在 Ubuntu 和其他 Linux 上安装 Netbeans
+======
+
+> 在本教程中,你将学习在 Ubuntu 和其他 Linux 发行版上安装 Netbeans IDE 的各种方法。
+
+[NetBeans][1] 是一个开源集成开发环境,具有良好的跨平台支持。此工具已被 Java 和 C/C++ 开发社区广泛认可。
+
+开发环境相当灵活。你可以配置它以支持各种开发。实际上,你可以用它来开发 Web、桌面和移动应用,而无需离开此平台。这太神奇了,不是吗?除此之外,用户可以添加许多已知语言,如 [PHP][2]、C、C++、HTML、[Ajax][3]、JavaScript、JSP、Ruby on Rails 等。
+
+如果你正在了解如何在 Linux 上安装 Netbeans,那么有几种方法可以做到。我编写本教程主要是为了 Ubuntu,但一些安装方法也适用于其他发行版。
+
+* [使用 apt 在 Ubuntu 上安装 Netbeans][4]:适用于 Ubuntu 和基于 Ubuntu 的发行版,但通常**它是旧版的 Netbeans**
+* [使用 Snap 在 Ubuntu 上安装 Netbeans][5]:适用于已启用 Snap 包支持的任何 Linux 发行版
+* [使用 Flatpak 安装 Netbeans] [6]:适用于所有支持 Flatpak 包的 Linux 发行版
+
+### 使用 Apt 包管理器在 Ubuntu 上安装 Netbeans IDE
+
+如果在 Ubuntu 软件中心搜索 Netbeans,你将找到两个版本的 Netbeans。Apache Netbeans 是 snap 版本,大小较大,但提供了最新的 Netbeans。
+
+只需单击一下即可安装它。无需打开终端。是最简单的方法。
+
+![Apache Netbeans in Ubuntu Software Center][7]
+
+你也可以选择使用 `apt` 命令,但使用 `apt` 时,你无法获得最新的 Netbeans。例如,在编写本教程时,Ubuntu 18.04 中 Apt 提供 Netbeans 10,而 Snap 有最新的 Netbeans 11。
+
+如果你是 [apt 或 apt-get][8] 的粉丝,那么可以[启用 universe 仓库][9],并在终端中使用此命令安装 Netbeans:
+
+```
+sudo apt install netbeans
+```
+
+### 使用 Snap 在任何 Linux 发行版上安装 Netbeans IDE
+
+![][10]
+
+Snap 是一个通用包管理器,如果[发行版上启用了 Snap][11],那么可以使用以下命令安装它:
+
+```
+sudo snap install netbeans --classic
+```
+
+此过程可能需要一些时间才能完成,因为总下载大小约为 1 GB。完成后,你将在应用程序启动器中看到它。
+
+你不仅可以通过 Snap 获取最新的 Netbeans,已安装的版本将自动更新到较新版本。
+
+### 使用 Flatpak 安装 Netbeans
+
+[Flatpak][12] 是另一个类似 Snap 的包安装器。默认情况下,某些发行版支持 Flatpak,在其他发行版上你可以[启用 Flatpak 支持][13]。
+
+发行版支持 Flatpak 后,你可以使用以下命令安装 Netbeans:
+
+```
+flatpak install flathub org.apache.netbeans
+```
+
+另外,你可以下载源码并自己编译。
+
+- [下载 Netbeans][14]
+
+希望你使用了上面其中一个方法在你的 Ubuntu 上安装了 Netbeans。但你使用的是哪个方法?有遇到问题么?让我们知道。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/install-netbeans-ubuntu/
+
+作者:[Srimanta Koley][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/itsfoss/
+[b]: https://github.com/lujun9972
+[1]: https://netbeans.org/
+[2]: https://www.php.net/
+[3]: https://en.wikipedia.org/wiki/Ajax_(programming)
+[4]: tmp.ZNFNEC210y#apt
+[5]: tmp.ZNFNEC210y#snap
+[6]: tmp.ZNFNEC210y#flatpak
+[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/apache-netbeans-ubuntu-software-center.jpg?ssl=1
+[8]: https://itsfoss.com/apt-vs-apt-get-difference/
+[9]: https://itsfoss.com/ubuntu-repositories/
+[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/03/Install_Netbeans_Linux.jpg?ssl=1
+[11]: https://itsfoss.com/install-snap-linux/
+[12]: https://flatpak.org/
+[13]: https://itsfoss.com/flatpak-guide/
+[14]: https://netbeans.apache.org/download/index.html
+[15]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/03/srimanta.jpg?ssl=1
diff --git a/published/20200316 Connect your Google Drive to Fedora Workstation.md b/published/20200316 Connect your Google Drive to Fedora Workstation.md
new file mode 100644
index 0000000000..134703d0dc
--- /dev/null
+++ b/published/20200316 Connect your Google Drive to Fedora Workstation.md
@@ -0,0 +1,67 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-12037-1.html)
+[#]: subject: (Connect your Google Drive to Fedora Workstation)
+[#]: via: (https://fedoramagazine.org/connect-your-google-drive-to-fedora-workstation/)
+[#]: author: (Paul W. Frields https://fedoramagazine.org/author/pfrields/)
+
+将你的 Google Drive 连接到 Fedora 工作站
+======
+
+![][1]
+
+有大量的云服务可用于存储重要文档。Google Drive 无疑是最受欢迎的之一。它提供了一组相应的应用程序,例如文档,表格和幻灯片来创建内容。但是,你也可以在 Google Drive 中存储任意内容。本文向你展示如何将其连接到 [Fedora 工作站][2]。
+
+### 添加帐户
+
+Fedora 工作站可在安装后首次启动或者之后的任何时候添加一个帐户。要在首次启动期间添加帐户,请按照提示进行操作。其中包括选择添加一个帐户:
+
+![][3]
+
+选择 Google,然后会出现一个登录提示,请使用你的 Google 帐户信息登录。
+
+![][4]
+
+请注意,此信息仅传输给 Google,而不传输给 GNOME 项目。下一个页面要求你授予访问权限,这是必需的,以便系统桌面可以与 Google 进行交互。向下滚动查看访问请求,然后选择“允许”继续。
+
+你会在移动设备和 Gmail 中收到有关新设备(系统)访问 Google 帐户的通知。这是正常现象。
+
+![][5]
+
+如果你在初次启动时没有执行此操作,或者需要重新添加帐户,请打开“设置”,然后选择“在线账户”来添加帐户。可以通过顶部栏右侧的下拉菜单(“齿轮”图标)或打开“概览”并输入“settings”来使用它。接着和上面一样。
+
+### 在 Google Drive 中使用“文件”应用
+
+打开“文件”应用(以前称为 “nautilus”)。“文件”应用可以通过左侧栏访问。在列表中找到你的 Google 帐户。
+
+当你选择帐户后,“文件”应用会显示你的 Google Drive 的内容。你可以使用 Fedora 工作站的本地应用打开某些文件,例如声音文件或 [LibreOffice][6] 兼容文件(包括 Microsoft Office 文档)。其他文件(例如 Google 文档、表格和幻灯片等 Google 应用文件)将使用浏览器和相应的应用打开。
+
+请记住,如果文件很大,将需要一些时间才能通过网络接收文件,你才可以打开它。
+
+你还可以复制粘贴 Google Drive 中的文件到连接到 Fedora 工作站的其他存储,或者反之。你还可以使用内置功能来重命名文件、创建文件夹并组织它们。对于共享和其他高级选项,请和平常一样在浏览器中使用 Google Drive。
+
+请注意,“文件”应用程序不会实时刷新内容。如果你从其他连接 Google 的设备(例如手机或平板电脑)添加或删除文件,那么可能需要按 `Ctrl+R` 刷新“文件”应用。
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/connect-your-google-drive-to-fedora-workstation/
+
+作者:[Paul W. Frields][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://fedoramagazine.org/author/pfrields/
+[b]: https://github.com/lujun9972
+[1]: https://fedoramagazine.org/wp-content/uploads/2020/03/gdrive-workstation-816x345.jpg
+[2]: https://getfedora.org/workstation
+[3]: https://fedoramagazine.org/wp-content/uploads/2020/03/firstboot-choices.jpg
+[4]: https://fedoramagazine.org/wp-content/uploads/2020/03/firstboot-signin.jpg
+[5]: https://fedoramagazine.org/wp-content/uploads/2020/03/firstboot-grantaccess.jpg
+[6]: https://fedoramagazine.org/discover-hidden-gems-libreoffice/
+[7]: https://unsplash.com/@beatriz_perez?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
+[8]: https://unsplash.com/s/photos/office-files?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
diff --git a/published/20200317 Coronavirus challenges remote networking.md b/published/20200317 Coronavirus challenges remote networking.md
new file mode 100644
index 0000000000..9467133c2d
--- /dev/null
+++ b/published/20200317 Coronavirus challenges remote networking.md
@@ -0,0 +1,116 @@
+[#]: collector: (lujun9972)
+[#]: translator: (HankChow)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-12039-1.html)
+[#]: subject: (Coronavirus challenges remote networking)
+[#]: via: (https://www.networkworld.com/article/3532440/coronavirus-challenges-remote-networking.html)
+[#]: author: (Michael Cooney https://www.networkworld.com/author/Michael-Cooney/)
+
+新型冠状病毒对远程网络的影响
+======
+
+> 由于 COVID-19 的肆虐,IBM、谷歌、亚马逊、AT&T、思科、苹果等公司都争先恐后地为远程办公提供了技术上的支持,这为远程网络带来了不少的压力。
+
+![](https://images.idgesg.net/images/article/2018/02/crisis_survival_strategy_disaster_preparedness_readiness_recovery_continuity_plan_thinkstock_600161484-100749343-large.jpg)
+
+在新型冠状病毒广泛传播的大环境下,很多公司都要求员工留在家中远程办公,远程网络技术因此承受了更大的压力,一些带宽和安全方面的问题也接踵而至。
+
+在过去的几十年当中,由于企业的蓬勃发展,远程办公的人数估计增加了 400 多万。而当前疫情流行的背景下,远程办公的需求激增,有望达到一个新的高峰。
+
+一家虚拟私有网络(缩写:???)提供商 [Atlas][1] 的一份研究表明,在今年 3 月 9 日到 3 月 15 日之间,美国的虚拟私有网络使用量增加了 53%,并且还会继续提高。而在意大利这个疫情爆发比美国早两周的国家,过去一周内的虚拟私有网络使用量甚至增加了 112%。Atlas 虚拟私有网络的首席执行官 Rachel Welch 在一份声明中称,美国的虚拟私有网络使用量在 3 月底预估会达到 150% 的增幅。
+
+部分企业正在尝试通过一日测试来评估远程办公的可行性。据《[芝加哥论坛报][2]》的报道,摩根大通、晨星以及一家数据分析方面的初创公司 Arity 已经通过让员工在家办公一天来测试整个办公系统的稳定性。
+
+在政府方面,[美国国家海洋与大气管理局][3]和 NASA 都已经进行或计划进行网络方面的压力测试,评估是否有足够的网络容量足以让上千名工作人员远程办公,以及远程办公可能造成的影响。而放眼整个美国,供职于美国政府部门的员工数量在 [200 万][4]左右。
+
+为了避免蜂窝数据网络发生拥堵,美国[联邦通信委员会][5]已批准 T-mobile 临时访问已分配给其它运营商的 600MHz 频段,T-mobile 表示“将使用这个频段让美国人更方便地享受远程医疗、参与远程工作和学习,同时在保持‘物理距离’的情况下保持联系”。
+
+- [video](https://youtu.be/-1-ugVx0hVc)
+
+但也有一些业内人士指出,在一些对蜂窝网络有较强依赖的的场景下,“最后一英里”的网络访问会变得非常拥堵。
+
+网络情报公司 ThousandEyes 的主要产品是局域网和广域网性能分析的软件,该公司的产品经理 Alex Cruz Farmer 表示,网络瓶颈在于一些较为偏远的农村地区,因为那些地区的网络基础设施较为薄弱,主要通过微波或蜂窝网络来访问互联网。最大的挑战在于现有的解决方案所能提供的带宽远远不足。
+
+Alex Cruz Farmer 还补充道,尽管持续时间不长,但现在的确已经出现一些由于运营商问题或网络负载增加导致的故障现象。
+
+AT&T 表示目前已经留意到蜂窝网络使用量的变化,但网络容量并没有作出提高。
+
+[AT&T 在一份声明中称][7],在新冠病毒传播最严重的城市中,由于越来越多的人留在了家中远程办公,减少了通勤和人群聚集,很多特定位置和特定时段的蜂窝网络使用量峰值都明显降低了。他们还使用了一些工具对网络带宽进行了统计和监控,通过这些工具,他们可以更直观地了解网络使用情况的趋势,同时获取网络性能和网络容量方面的报告,进而管理整个通信网络。
+
+Verison 表示,自从新型冠状病毒疫情爆发以来,尽管在家办公的用户数量大增,但使用的数据量并没有明显的上升。他们在一份声明中称:“Verison 的网络是为满足未来的需求设计建造的,面对各种需求量的增加或使用方式的改变,我们都有充分的准备。虽然这是一次前所未有的社会事件,整个局面也在不断发生改变,但随着不断了解实际需求的变化情况,我们随时可以对网络资源作出调整”。
+
+Verison 一直在关注受影响最严重的地区的网络使用情况,并承诺将会与医院、医护人员、政府机构合作,制定网络资源使用的优先级,以满足他们的需求。Verison 还宣布计划在 2020 年将支出在 170 亿至 180 亿美元的基础上再提高 5 亿美元,以实现“加快 Verison 向 5G 过渡并在困难时期帮助支撑经济”的目标。
+
+### 企业虚拟私有网络安全问题
+
+对于企业来说,数据中心与远程用户之间的网络和安全问题解决起来绝非易事,尤其是使用虚拟私有网络进行远程访问时,来自用户所在住宅网络的访问几乎无法由企业控制。CIMI 公司总裁 Tom Nolle 认为,IT 部门有必要验证这些连接是否符合企业的标准(关于 Tom Nolle 更多关于在家办公的看法,可以查阅[这里][8])。
+
+Tom Nolle 认为像 ISP、DNS 和 Wi-Fi 这些常见的家用网络要素都应该作为适合远程办公网络业务认证的一部分。他发现 Google 的 DNS 服务比 ISP 提供的服务更能承受压力,OpenDNS 也是一个很好的选择,这说明用户可以考虑使用其中一种。
+
+Tom Nolle 还说,家庭 Wi-Fi 网络的安全性也是一个问题,IT 部门应该要求远程办公的员工提交 Wi-Fi 配置的屏幕截图,以保证使用了正确的加密方式。之所以有这样的想法,是因为他觉得很多远程办公的员工都会绕过企业预设的一些安全措施。
+
+DNS 软件公司 BlueCat 的首席战略官 Andrew Wertkin 表示,对一些刚刚开始在家远程办公的员工来说,适当提供相关指导是很有必要的。大部分员工从来没有尝试过在家远程办公,他们或许并不了解安全的重要性。如果员工访问公司网络的时候使用的是个人设备而不是公司设备,就更有可能出现问题。
+
+而使用[虚拟私有网络][9]远程办公的人数激增也会为企业带来成本上的挑战。
+
+“虚拟私有网络设备并不便宜,如果考虑到计算资源的成本和每个人的均摊成本,迁移到云上的虚拟环境会带来一笔不小的开支,这还不包括每个虚拟私有网络许可证价格的上升”,Alex Cruz Farmer 坦言。
+
+在容量方面,随着远程访问量的增加,用于分配 IP 地址的 DHCP 服务也会承受巨大的压力。Andrew Wertkin 指出,如果进行远程连接的设备无法获取到网络地址,则是否具有足够的虚拟私有网络许可证并不重要。企业内部必须对这些风险进行测试,了解其中存在瓶颈的部分,并制定规避这些风险的策略。
+
+按照这个思路,企业甚至需要验证数据中心可以用于公开的 SSL 套接字数量,否则也会面临数量不足的风险。
+
+微软 Office 365 产品团队的高级程序经理 Paul Collinge 也表达了类似的担忧。他在一篇关于优化 Office 365 员工远程办公流量的[博客][10]中写道,当大量员工在同时接入企业网络时,会对诸如虚拟私有网络集中器、中央网络出口设备(例如代理、DLP)、中央互联网带宽、回程 MPLS 和 NAT 等网络要素产生巨大的压力。最终导致的结果是低下的性能、低下的生产力,以及员工们低下的使用体验。
+
+Alex Cruz Farmer 提出,企业很可能需要增加网络上虚拟私有网络集中器的数量,这样就可以让远程用户分布在多个不同的虚拟私有网络端点上,避免产生拥堵。退而求其次,只能在防火墙上把某些端口放开,允许特定应用程序的公开访问,尽管这样有助于提高工作效率,但却降低了整体的安全性。
+
+### 虚拟私有网络隧道分割技术有效吗?
+
+业内人士对隧道分割有不同的看法。
+
+BlueCat 的 Andrew Wertkin 认为,虚拟私有网络可以使用隧道分割技术,使得仅有需要访问企业内部网络的流量才通过虚拟私有网络隧道访问,其余流量则直接进入互联网。这意味着会有部分流量不受隧道和企业网络内部的安全控制,用户的计算机会暴露在互联网当中,进而导致企业的数据和网络面临安全风险。
+
+尽管如此,微软在上周还是建议 IT 管理员使用隧道分割技术以缓解 Office 365 由于大量远程用户涌入导致的拥堵问题。微软在[建议][10]中提供了相关接入点的 URL 和 IP 地址列表,并引导 IT 人员如何按照这个方式将流量路由到 Office 365。
+
+按照 Paul Collinge 的说法,虚拟私有网络客户端需要经过配置,才能将流量路由到已标识的 URL/IP/ 端口上,进而为全球的用户提供高性能的服务。
+
+Alex Cruz Farmer 认为,在虚拟私有网络使用率上升之后,企业很有必要对网络安全进行一个全面的审查。对于仍然在使用传统网络安全架构的企业来说,应该开始考虑基于云端的网络安全方案了,这不仅可以提升远程办公的性能,还能减少企业对于广域网的使用量。
+
+其它相关情况:
+
+* [FCC][11] 呼吁,宽带提供商应该适当放宽数据传输的限制,电话运营商应该适当免除用户的长途电话费,远程教育提供商应该合作为社会提供远程学习的机会,网络运营商应该优先考虑医院或医疗机构的网络连接需求。对此,AT&T 已经作出了相关的回应和行动。
+* [美国参议员 Mark R. Warner (D-VA)][12] 和其他 17 名参议员致信了 AT&T、CenturyLink、Charter Communications、Comcast、Cox Communications、Sprint、T-Mobile、Verizon 这八家主要 ISP 的首席执行官,呼吁这些公司应该采取措施应对远程办公、在线教育、远程医疗、远程支持服务等方面需求激增带来的压力。这些参议员在信中呼吁,各公司应该降低可能对远程服务产生影响的限制和费用,同时还应该为受到疫情影响的学生提供免费或收费的宽带服务,否则学生在疫情期间无法接入网络进行在线学习。
+* [思科][13]、微软、[谷歌][14]、[LogMeIn][15]、[Spectrum][16] 等供应商都提供了一些免费工具,帮助用户在疫情爆发期间正常进行安全通信。
+
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3532440/coronavirus-challenges-remote-networking.html
+
+作者:[Michael Cooney][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.networkworld.com/author/Michael-Cooney/
+[b]: https://github.com/lujun9972
+[1]: https://atlasvpn.com/blog/vpn-usage-in-italy-rockets-by-112-and-53-in-the-us-amidst-coronavirus-outbreak/
+[2]: https://www.chicagotribune.com/coronavirus/ct-coronavirus-work-from-home-20200312-bscm4ifjvne7dlugjn34sksrz4-story.html
+[3]: https://federalnewsnetwork.com/workforce/2020/03/agencies-ramp-up-coronavirus-preparations-as-noaa-plans-large-scale-telework-test/
+[4]: https://fas.org/sgp/crs/misc/R43590.pdf
+[5]: https://www.fcc.gov/coronavirus
+[6]: https://www.networkworld.com/blog/itaas-and-the-corporate-storage-technology/?utm_source=IDG&utm_medium=promotions&utm_campaign=HPE22140&utm_content=sidebar (ITAAS and Corporate Storage Strategy)
+[7]: https://about.att.com/pages/COVID-19.html
+[8]: https://blog.cimicorp.com/?p=4055
+[9]: https://www.networkworld.com/article/3268744/understanding-virtual-private-networks-and-why-vpns-are-important-to-sd-wan.html
+[10]: https://techcommunity.microsoft.com/t5/office-365-blog/how-to-quickly-optimize-office-365-traffic-for-remote-staff-amp/ba-p/1214571
+[11]: https://www.fcc.gov/document/commissioner-starks-statement-fccs-response-covid-19
+[12]: https://www.warner.senate.gov/public/_cache/files/2/3/239084db-83bd-4641-bf59-371cb829937a/A99E41ACD1BA92FB37BDE54E14A97BFA.letter-to-isps-on-covid-19-final-v2.-signed.pdf
+[13]: https://blogs.cisco.com/collaboration/cisco-announces-work-from-home-webex-contact-center-quick-deployment
+[14]: https://cloud.google.com/blog/products/g-suite/helping-businesses-and-schools-stay-connected-in-response-to-coronavirus
+[15]: https://www.gotomeeting.com/work-remote?clickid=RFlSQF3DBxyOTSr0MKVSfWfHUknShrScK0%3AhTY0&irgwc=1&cid=g2m_noam_ir_aff_cm_pl_ct
+[16]: https://www.multichannel.com/news/charter-opening-wi-fi-hotspots-in-face-of-covid-19
+[17]: https://www.facebook.com/NetworkWorld/
+[18]: https://www.linkedin.com/company/network-world
diff --git a/published/20200318 Top 10 open source tools for working from home.md b/published/20200318 Top 10 open source tools for working from home.md
new file mode 100644
index 0000000000..c8357aadc7
--- /dev/null
+++ b/published/20200318 Top 10 open source tools for working from home.md
@@ -0,0 +1,141 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-12014-1.html)
+[#]: subject: (Top 10 open source tools for working from home)
+[#]: via: (https://opensource.com/article/20/3/open-source-working-home)
+[#]: author: (Seth Kenlon https://opensource.com/users/seth)
+
+在家工作的十大开源工具
+======
+
+> 无论你是在家工作的资深人士还是远程工作的新手,这些工具都可以使交流和协作变得轻而易举。
+
+![](https://img.linux.net.cn/data/attachment/album/202003/20/103814bwxxqxkxc9qqxkbb.jpg)
+
+如果你在家工作(WFH),你就会知道拥有一系列实用的工具是很重要的,这些工具可以让你远离烦恼,专注于重要的事情。在工作期间工作越努力,工作日结束后,你就越容易放松。
+
+我已经在家工作多年了,这是我精选的远程工作者必备的最佳开源工具。
+
+### 视频会议:Jitsi
+
+![Jitsi screenshot][2]
+
+当你不在同事身边时,每周保持连接几次非常重要,甚至只是这样也可以保持人与人之间的联系,否则你就会变得孤独。市场上有很多视频会议系统,但以我的经验,最简单、最好的是开源的 [Jitsi][3]。
+
+通过易于记忆的 URL([meet.jit.si][3])和按需会议室,Jitsi 使得召开即席会议非常简单。而且更好的是,无需注册。你只需进入 [meet.jit.si][3],找到一个带有友好的、随机生成的 URL(此处没有字母和数字的随机组合) 的会议室,你就可以立即开始聊天。如果你选择注册,那么还可以与几种日历进行集成。
+
+在现实生活中,我参加了许多来自新西兰最偏远地区的会议,而 Jitsi 无疑是我迄今为止拥有的最好的视频聊天体验。不需要浪费一半的会议时间在迷宫般的虚拟会议室中寻找彼此,也不用在尴尬的滞后时间中坐着发呆,更不用努力地为聊天应用程序安装更新。使用开源和符合标准的 webRTC 协议的 Jitsi 可以让你有个愉悦的开会体验。
+
+### 白板:Drawpile
+
+![Drawpile screenshot][4]
+
+有时,白板非常适合解释事情、跟踪想法或只是散布一下疯狂的想法。白板是办公室会议室的常见物品,但在数字世界中却很难获得。幸运的是,有了 [Drawpile][5],这是一个实时协作的绘图应用程序。你可以在自己的计算机上托管绘图会话并邀请其他用户,也可以在 Drawpile 的服务器上托管会话。
+
+它易于使用,足够精简、直观而功能强大,当你的粗略想法开始逐渐成型时,它是使其成为可行的作品的应用程序。
+
+### 看板:Taiga
+
+![Taiga screenshot][6]
+
+想要保持有序并与你的部门保持同步吗?你应该试试 [Taiga][7],这是一个虚拟的“便利贴”面板,可以帮助团队跟踪各个任务。这种组织和项目计划方法被称为看板,在软件开发中很流行,而它也流行于从假期规划到家庭装修项目的所有计划之中。
+
+Taiga 的优点是它是一个在线共享空间。与你进行协作或与之合作的任何人都可以把任务放到面板上,并且随着每个人的进展,他们将任务从左列(起点)移到右边(终点线)。Taiga 具有令人愉悦的图形化和交互性,没有什么比从一列移动到另一列的拖放任务令人感到舒适的了。
+
+如果你的团队有 Taiga 无法满足的特定需求,那么你应该看看[我们挑选的最佳开源看板][8]。
+
+### 个人笔记本:Joplin
+
+![Joplin][9]
+
+我在办公桌旁放着一个纸质笔记本,这样我就可以随时记下思考或想法了。想要捕捉这种简单动作的感受和便利是很棘手的,但 Joplin 却做的很好。
+
+你可以在 Joplin 中创建虚拟笔记本,每个笔记本可以有任意数量的条目。这些条目可以是简单的文本,也可以是带有图形、任务列表、超链接等的复杂的动态文档。最重要的是,你可以将 Joplin 与所有的在线存储服务同步,包括开源的 Nextcloud 服务,这样你可以在任何计算机和任何设备上使用笔记本。这是使你的工作日井井有条、专心致志并保持活动顺畅的好方法。
+
+如果 Joplin 不太满足你的要求,请查看一些我们最喜欢的[笔记本应用][10]。
+
+### 群聊:Riot
+
+![Riot screenshot][11]
+
+并非所有内容都需要视频聊天或语音通话,但是有些事情比电子邮件更紧急。这就是团队聊天发挥作用的地方。一个好的群聊应用程序应该具有这些功能:即时消息传递、支持表情符号、支持 GIF 和图像,按需聊天室或“频道”、广泛的兼容性和隐私性。[Matrix][12] 是一个用于实时通信的开放标准和轻量级协议,如果你厌烦于键入大段消息,则可以使用相同的协议快速切换到 VOIP。你将获得世界上最好的群聊体验。
+
+Matrix 是一种协议,并且有许多应用程序可以接驳到它(就像使用 Internet 协议一样,Firefox 是使人类可以访问的应用程序)。最受欢迎的客户端之一是 [Riot.im][13]。你可以为你的计算机和手机下载 Riot,并且只是短时间使用的话,可以通过 Web 浏览器连接到 Riot。你的团队总是会近在咫尺,但永远不会近到让你感到不舒服。
+
+### 共享文档:Etherpad
+
+![Etherpad screenshot][14]
+
+如果你想与他人协作处理文档或与开会,则仅需 Etherpad 就行。Etherpad 是一个实时共享的文字处理器。可以邀请一个或多个人访问文档,并在每个人进行添加和编辑时进行观察。这是一种快速有效的方法,可将想法记入“纸上”并一起迭代修订。
+
+有几种使用 Etherpad 的方法。如果你拥有良好的 IT 支持,则可以要求你的 IT 部门为你的组织托管一个 Etherpad 实例。否则,将有来自开源支持者的在线公共实例,例如 [Riseup][15] 和 [Etherpad][16] 本身所提供的。
+
+### 共享电子表格:Ethercalc
+
+![Ethercalc screenshot][17]
+
+与 Etherpad 相似,在线 [Ethercalc][18] 编辑器允许多个用户同时在同一屏幕上远程地在电子表格上工作。Ethercalc 甚至可以从现有电子表格和定界文本文件中导入数据。你可能会也可能不会丢失大部分格式,具体取决于要导入的内容的复杂性,但是我从来没有弄坏过我的数据,因此导入文件总是一个好的开始。 下次需要复杂公式的帮助时,或者需要在最新预算中输入收据时,或者只是需要某人在格子上的输入时,请将其输入到 Ethercalc。
+
+### 共享存储与日历:Nextcloud
+
+![Nextcloud screenshot][19]
+
+[Nextcloud][20] 是一个心存远志的应用程序。顾名思义,它是你自己的个人云。它最明显的切入点是在线共享存储,它可以与台式机和移动设备上的文件夹同步。将文件放入文件中,文件会上传到存储空间,然后当一切内容都同步后,它们会出现在所有设备上。为组织中的每个人提供一个帐户,你马上便拥有了共享的存储空间,可以通过单击鼠标单击以共享带有或不带有密码的文件和文件夹。
+
+但是,除了充当共享数据的保管箱之外,Nextcloud 还有很多其他功能。由于其插件式结构,你可以将无数的 Web 应用程序安装到 Nextcloud 中,例如聊天客户端、电子邮件客户端、视频聊天等等。并非所有插件都是“官方的”,因此其支持服务各不相同,但是有几个非常好的官方插件。值得注意的是,有一个官方的日历应用程序,你和你的同事可以用它安排会议并跟踪即将发生的重要事件。该日历使用 CalDAV 协议,因此你所做的一切都可以与任何 CalDAV 客户端兼容。
+
+### LibreOffice
+
+![LibreOffice screenshot][21]
+
+如果你习惯于每天一整天都在办公室里工作,那么你也可能习惯整天在办公套件里工作。包含所有常用功能的面面俱到的应用程序会令人感到某种程度的舒适,而在开源办公世界中的这样的应用程序就是 [LibreOffice][22]。它具有办公套件所应有的一切:文字处理器、电子表格和幻灯片演示。它还具有超出预期的功能,例如基于矢量的绘图应用程序,它还可以编辑 PDF 文件,还有一个带有图形界面构建器的关系型数据库。如果你正在寻找一个好的办公应用程序,那么 LibreOffice 是你应该首先看一看的,因为一旦你使用它,你就再也不用看别的了。
+
+### Linux
+
+![][23]
+
+如果你不熟悉远程工作,而可能是由于某种原因而正在经历一场重大变革。对于某些人来说,变革的时光是一个极好的动力,它可以一劳永逸地改变一切。如果你是其中的一员,那么可能是时候更改一下整个操作系统了。Windows 和 Mac 可能在过去为你提供了很好的服务,但是如果你希望从非开源软件转向开源软件,为什么不换一下运行所有这些应用程序的平台呢?
+
+有许多出色的 Linux 发行版可以让你认真地工作、认真地自我管理和认真地进阶。获取一份 Linux 副本,不论是 [Fedora][24]、[Elementary][25] 还是 [Red Hat Enterprise Linux][26] 的长期支持订购,去尝试使用自由的开源操作系统吧。等你熟悉了远程人的生活时,你最终将成为一名 Linux 专家!
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/open-source-working-home
+
+作者:[Seth Kenlon][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/seth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/oatmeal-and-fedora.jpg?itok=NBFUH9eF (Oatmeal and a laptop.)
+[2]: https://opensource.com/sites/default/files/uploads/jitsi_0.jpg (Jitsi screenshot)
+[3]: http://meet.jit.si
+[4]: https://opensource.com/sites/default/files/uploads/drawpile-whiteboard.jpg (Drawpile screenshot)
+[5]: https://drawpile.net/
+[6]: https://opensource.com/sites/default/files/uploads/taiga_kanban_screen_0.jpg (Taiga screenshot)
+[7]: http://taiga.io
+[8]: https://opensource.com/alternatives/trello
+[9]: https://opensource.com/sites/default/files/joplin_0.png (Joplin)
+[10]: https://opensource.com/alternatives/evernote
+[11]: https://opensource.com/sites/default/files/uploads/riot-matrix.jpg (Riot screenshot)
+[12]: http://matrix.org
+[13]: http://riot.im
+[14]: https://opensource.com/sites/default/files/uploads/etherpad.jpg (Etherpad screenshot)
+[15]: https://pad.riseup.net/
+[16]: https://beta.etherpad.org
+[17]: https://opensource.com/sites/default/files/uploads/ethercalc.jpg (Ethercalc screenshot)
+[18]: https://ethercalc.org
+[19]: https://opensource.com/sites/default/files/uploads/nextcloud-calendar.jpg (Nextcloud screenshot)
+[20]: http://nextcloud.com
+[21]: https://opensource.com/sites/default/files/uploads/libreoffice.png (LibreOffice screenshot)
+[22]: http://libreoffice.org
+[23]: https://opensource.com/sites/default/files/uploads/advent-pantheon.jpg
+[24]: https://getfedora.org/
+[25]: https://elementary.io
+[26]: https://www.redhat.com/en/store/red-hat-enterprise-linux-workstation
diff --git a/published/20200319 Manually rotating log files on Linux.md b/published/20200319 Manually rotating log files on Linux.md
new file mode 100644
index 0000000000..ae5f7294e3
--- /dev/null
+++ b/published/20200319 Manually rotating log files on Linux.md
@@ -0,0 +1,151 @@
+[#]: collector: (lujun9972)
+[#]: translator: (HankChow)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-12038-1.html)
+[#]: subject: (Manually rotating log files on Linux)
+[#]: via: (https://www.networkworld.com/article/3531969/manually-rotating-log-files-on-linux.html)
+[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
+
+在 Linux 系统中手动滚动日志
+======
+
+![](https://img.linux.net.cn/data/attachment/album/202003/25/223932xqibwq5fafx5ao3f.jpg)
+
+日志滚动在 Linux 系统上是再常见不过的一个功能了,它为系统监控和故障排查保留必要的日志内容,同时又防止过多的日志造成单个日志文件太大。
+
+日志滚动的过程是这样的:在一组日志文件之中,编号最大的(最旧的)一个日志文件会被删除,其余的日志文件编号则依次增大并取代较旧的日志文件,而较新的文件则取代它作为当前的日志文件。这一个过程很容易就可以实现自动化,在细节上还能按需作出微调。
+
+使用 `logrotate` 命令可以手动执行日志滚动的操作。本文将要介绍的就是手动进行日志滚动的方法,以及预期产生的结果。
+
+文中出现的示例适用于 Ubuntu 等 Linux 系统,对于其它类型的系统,日志文件和配置文件可能会有所不同,但日志滚动的过程是大同小异的。
+
+### 为什么需要滚动日志
+
+一般情况下,无需手动旋转日志文件。Linux 系统会每隔一天(或间隔更长的时间)或根据日志文件的大小自动进行一次日志滚动。如果你需要滚动日志以释放存储空间,又或者将某一部分日志从当前的活动中分割出来,这很容易做到,具体要取决于文件滚动规则。
+
+### 一点背景介绍
+
+在 Linux 系统安装完成后就已经有很多日志文件被纳入到日志滚动的范围内了。另外,一些应用程序在安装时也会为自己产生的日志文件设置滚动规则。一般来说,日志滚动的配置文件会放置在 `/etc/logrotate.d`。如果你想了解日志滚动的详细实现,可以参考[这篇以前的文章][4]。
+
+在日志滚动的过程中,活动日志会以一个新名称命名,例如 `log.1`,之前被命名为 `log.1` 的文件则会被重命名为 `log.2`,依此类推。在这一组文件中,最旧的日志文件(假如名为 `log.7`)会从系统中删除。日志滚动时文件的命名方式、保留日志文件的数量等参数是由 `/etc/logrotate.d` 目录中的配置文件决定的,因此你可能会看到有些日志文件只保留少数几次滚动,而有些日志文件的滚动次数会到 7 次或更多。
+
+例如 `syslog` 在经过日志滚动之后可能会如下所示(注意,行尾的注释部分只是说明滚动过程是如何对文件名产生影响的):
+
+```
+$ ls -l /var/log/syslog*
+-rw-r----- 1 syslog adm 128674 Mar 10 08:00 /var/log/syslog <== 新文件
+-rw-r----- 1 syslog adm 2405968 Mar 9 16:09 /var/log/syslog.1 <== 之前的 syslog
+-rw-r----- 1 syslog adm 206451 Mar 9 00:00 /var/log/syslog.2.gz <== 之前的 syslog.1
+-rw-r----- 1 syslog adm 216852 Mar 8 00:00 /var/log/syslog.3.gz <== 之前的 syslog.2.gz
+-rw-r----- 1 syslog adm 212889 Mar 7 00:00 /var/log/syslog.4.gz <== 之前的 syslog.3.gz
+-rw-r----- 1 syslog adm 219106 Mar 6 00:00 /var/log/syslog.5.gz <== 之前的 syslog.4.gz
+-rw-r----- 1 syslog adm 218596 Mar 5 00:00 /var/log/syslog.6.gz <== 之前的 syslog.5.gz
+-rw-r----- 1 syslog adm 211074 Mar 4 00:00 /var/log/syslog.7.gz <== 之前的 syslog.6.gz
+```
+
+你可能会发现,除了当前活动的日志和最新一次滚动的日志文件之外,其余的文件都已经被压缩以节省存储空间。这样设计的原因是大部分系统管理员都只需要查阅最新的日志文件,其余的日志文件压缩起来,需要的时候可以解压查阅,这是一个很好的折中方案。
+
+### 手动日志滚动
+
+你可以这样执行 `logrotate` 命令进行手动日志滚动:
+
+```
+$ sudo logrotate -f /etc/logrotate.d/rsyslog
+```
+
+值得一提的是,`logrotate` 命令使用 `/etc/logrotate.d/rsyslog` 这个配置文件,并通过了 `-f` 参数实行“强制滚动”。因此,整个过程将会是:
+
+- 删除 `syslog.7.gz`,
+- 将原来的 `syslog.6.gz` 命名为 `syslog.7.gz`,
+- 将原来的 `syslog.5.gz` 命名为 `syslog.6.gz`,
+- 将原来的 `syslog.4.gz` 命名为 `syslog.5.gz`,
+- 将原来的 `syslog.3.gz` 命名为 `syslog.4.gz`,
+- 将原来的 `syslog.2.gz` 命名为 `syslog.3.gz`,
+- 将原来的 `syslog.1.gz` 命名为 `syslog.2.gz`,
+- 但新的 `syslog` 文件不一定必须创建。
+
+你可以按照下面的几条命令执行操作,以确保文件的属主和权限正确:
+
+```
+$ sudo touch /var/log/syslog
+$ sudo chown syslog:adm /var/log/syslog
+$ sudo chmod 640 /var/log/syslog
+```
+
+你也可以把以下这一行内容添加到 `/etc/logrotate.d/rsyslog` 当中,由 `logrotate` 来帮你完成上面三条命令的操作:
+
+```
+create 0640 syslog adm
+```
+
+整个配置文件的内容是这样的:
+
+```
+/var/log/syslog
+{
+rotate 7
+daily
+missingok
+notifempty
+create 0640 syslog adm <==
+delaycompress
+compress
+postrotate
+/usr/lib/rsyslog/rsyslog-rotate
+endscript
+}
+```
+
+下面是手动滚动记录用户登录信息的 `wtmp` 日志的示例。由于 `/etc/logrotate.d/wtmp` 中有 `rotate 2` 的配置,因此系统中只保留了两份 `wtmp` 日志文件。
+
+滚动前:
+
+```
+$ ls -l wtmp*
+-rw-r----- 1 root utmp 1152 Mar 12 11:49 wtmp
+-rw-r----- 1 root utmp 768 Mar 11 17:04 wtmp.1
+```
+
+执行滚动命令:
+
+```
+$ sudo logrotate -f /etc/logrotate.d/wtmp
+```
+
+滚动后:
+
+```
+$ ls -l /var/log/wtmp*
+-rw-r----- 1 root utmp 0 Mar 12 11:52 /var/log/wtmp
+-rw-r----- 1 root utmp 1152 Mar 12 11:49 /var/log/wtmp.1
+-rw-r----- 1 root adm 99726 Feb 21 07:46 /var/log/wtmp.report
+```
+
+需要知道的是,无论发生的日志滚动是自动滚动还是手动滚动,最近一次的滚动时间都会记录在 `logrorate` 的状态文件中。
+
+```
+$ grep wtmp /var/lib/logrotate/status
+"/var/log/wtmp" 2020-3-12-11:52:57
+```
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3531969/manually-rotating-log-files-on-linux.html
+
+作者:[Sandra Henry-Stocker][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.networkworld.com/author/Sandra-Henry_Stocker/
+[b]: https://github.com/lujun9972
+[1]: https://www.flickr.com/photos/klif/4244284159/in/photolist-7t44P6-oPFpsr-a8c5W-gWNZ6-32EEo4-cjdxqy-diHaq9-8DYZWf-gWNWM-bgLApc-hBt94C-cj71kY-PMESV-dZBcCU-pSqgNM-51eKHq-EecbfS-osGNau-KMUx-nFaWEL-cj71PE-HFVXn-gWNWs-85HueR-8QpDh8-kV1dEc-76qYSV-5YnxuS-gWNXr-dYoQ5w-dzj1j3-3AJyd-mHbaWF-q2fTri-e9bFa6-nJyvfR-4PnMyH-gWNZr-8VUtGS-gWNWZ-ajzUd4-2hAjMk-gWW3g-gWP11-dwYbH5-4XMew-cj71B1-ica9kJ-5RonM6-8z5tGL
+[2]: https://creativecommons.org/licenses/by/2.0/legalcode
+[3]: https://www.networkworld.com/newsletters/signup.html
+[4]: https://www.networkworld.com/article/3218728/how-log-rotation-works-with-logrotate.html
+[5]: https://www.networkworld.com/blog/itaas-and-the-corporate-storage-technology/?utm_source=IDG&utm_medium=promotions&utm_campaign=HPE22140&utm_content=sidebar (ITAAS and Corporate Storage Strategy)
+[6]: https://www.facebook.com/NetworkWorld/
+[7]: https://www.linkedin.com/company/network-world
diff --git a/published/20200322 Linus Torvalds- Advice on Working From Home during Coronavirus Lockdown.md b/published/20200322 Linus Torvalds- Advice on Working From Home during Coronavirus Lockdown.md
new file mode 100644
index 0000000000..753398999f
--- /dev/null
+++ b/published/20200322 Linus Torvalds- Advice on Working From Home during Coronavirus Lockdown.md
@@ -0,0 +1,106 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-12029-1.html)
+[#]: subject: (Linus Torvalds’ Advice on Working From Home during Coronavirus Lockdown)
+[#]: via: (https://itsfoss.com/torvalds-remote-work-advice/)
+[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
+
+Linus Torvalds 关于在冠状病毒禁足期间在家工作的建议
+======
+
+在冠状病毒爆发期间,我们中的许多人都在室内自我隔离。[ZDNet][1] 特此与 Linus Torvalds 进行了专题采访,讨论了他对冠状病毒禁足期间在家工作的看法或想法。
+
+如果你还不知道(怎么可能不知道),[Linus Torvalds][2] 是 Linux 的创建者,也是 [Git][3] 的创建者,而所有这一切都是他在家里工作时做的。这是 2016 年的视频,Torvalds 展示了他的家庭办公室:
+
+- [video](https://img.linux.net.cn/static/video/Linus%20Torvalds%20Guided%20Tour%20of%20His%20Home%20Office-SOXeXauRAm0.mp4)
+
+因此,在本文中,我将分享我关注的一些主要要点,以及来自 Linus Torvalds 接受 ZDNet [Steven J. Vaughan-Nichols][4] 采访互动时的回应。
+
+### 消除对人际交往缺失的恐惧
+
+Linus 提到,几年前刚开始在家工作时,他担心过缺少人与人之间的互动,包括去办公室、与人互动或哪怕只是出去吃个午餐。
+
+有趣的是,他似乎并没有错过任何东西,他更喜欢在家中没有人际交往的时间。
+
+当然,将自己与人际互动隔离开并不是最好的事情 ,但在目前看来,这是一件好事。
+
+### 利用在家工作的优势
+
+![][5]
+
+就像我们是完全远程操作一样,你可以做很多事情,而无需实际在办公室。
+
+不要忘记,你可以随心所欲地养猫,我有 6 只猫,我知道这很困难(*哈哈*)。
+
+而且,正如 Linus 所提到的,远程工作的真正优势在于“灵活性”。你不一定需要朝九晚五甚至更长的时间坐在办公桌前。从技术上讲,你可以在工作中自由休息,并在家中做你想做的任何事情。
+
+换句话说,Linus 建议**不要在你的家中重新搞一个办公室**,这比去办公室还差。
+
+### 高效沟通是关键
+
+![][6]
+
+虽然你可以在一天之中召开几次会议(视频会议或音频呼叫),但这真的有必要吗?
+
+对于某些人来说,这可能很重要,但是你应该通过简化和整理内容来尽量减少会议花费的时间。
+
+或者,按照 Linus 的建议,最好有个电子邮件列表来记录事情,以确保一切各司其职,这就是 [Linux 内核][7] 的运行方式。
+
+James Bottomley 是 [IBM 研究院][8]的杰出工程师,也是资深 Linux 内核开发人员,他也建议你重新阅读你的文字以确保发送的准确信息不会被人不小心跳过。
+
+就个人而言,出于同样的原因,我更喜欢文本而不是语音。实际上,它可以节省你的时间。
+
+但是,请记住,你需要只以适当的方式传达必要的信息,而不要使通过文本/电子邮件发送的信息过载。
+
+### 追踪你的时间
+
+灵活性并不一定意味着你可以减少工作量并泡在社交媒体平台上,除非那就是你的工作。
+
+因此,你需要确保充分利用自己的时间。为此,你可以使用多种工具来跟踪你的时间用在什么地方,以及在计算机上花费的时间。
+
+你甚至可以将其记录在便签上,以确保你可以将时间高效地分配于工作上。你可以选择使用 [RescueTime][9] 或 [ActivityWatch][10] 来跟踪你在计算机或智能手机上花费的时间。
+
+### 和猫(宠物)一起玩
+
+![][11]
+
+不歧视其他宠物,但这就是 Linus Torvalds 提到的。
+
+正因为你在家中,你在安排工作或尝试有效利用时间时要做的事情有很多。
+
+Linus 坚持认为,每当你感到无聊时,可以在必要时出门获取必需品,也可以与猫(或你的其它宠物)一起玩。
+
+### 结语
+
+虽然 Linus 还提到了当你在家时没人会评判你,但他的建议似乎是正确的,对于那些在家工作的人来说可能很有用。
+
+不仅是因为冠状病毒的爆发,而且如果你打算一直在家工作,应该牢记这些。
+
+你如何看待 Linus 的看法呢?你同意他的观点吗?
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/torvalds-remote-work-advice/
+
+作者:[Ankush Das][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/ankush/
+[b]: https://github.com/lujun9972
+[1]: https://www.zdnet.com/article/pet-the-cat-own-the-bathrobe-linus-torvalds-on-working-from-home/
+[2]: https://en.wikipedia.org/wiki/Linus_Torvalds
+[3]: https://git-scm.com/
+[4]: https://twitter.com/sjvn
+[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/Work-from-Home-torvalds.jpg?ssl=1
+[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/03/torvalds-home-office.jpg?ssl=1
+[7]: https://en.wikipedia.org/wiki/Linux_kernel
+[8]: https://www.research.ibm.com/
+[9]: https://www.rescuetime.com/
+[10]: https://activitywatch.net/
+[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/torvalds-penguins.jpeg?ssl=1
diff --git a/sources/news/20200130 NSA cloud advice, Facebook open source year in review, and more industry trends.md b/sources/news/20200130 NSA cloud advice, Facebook open source year in review, and more industry trends.md
deleted file mode 100644
index 7a3a40d845..0000000000
--- a/sources/news/20200130 NSA cloud advice, Facebook open source year in review, and more industry trends.md
+++ /dev/null
@@ -1,71 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (NSA cloud advice, Facebook open source year in review, and more industry trends)
-[#]: via: (https://opensource.com/article/20/1/nsa-facebook-more-industry-trends)
-[#]: author: (Tim Hildred https://opensource.com/users/thildred)
-
-NSA cloud advice, Facebook open source year in review, and more industry trends
-======
-A weekly look at open source community and industry trends.
-![Person standing in front of a giant computer screen with numbers, data][1]
-
-As part of my role as a senior product marketing manager at an enterprise software company with an open source development model, I publish a regular update about open source community, market, and industry trends for product marketers, managers, and other influencers. Here are five of my and their favorite articles from that update.
-
-## [Facebook open source year in review][2]
-
-> Last year was a busy one for our [open source][3] engineers. In 2019 we released 170 new open source projects, bringing our portfolio to a total of 579 [active repositories][3]. While it’s important for our internal engineers to contribute to these projects (and they certainly do — with more than 82,000 commits this year), we are also incredibly grateful for the massive support from external contributors. Approximately 2,500 external contributors committed more than 32,000 changes. In addition to these contributions, nearly 93,000 new people starred our projects this year, growing the most important component of any open source project — the community! Facebook Open Source would not be here without your contributions, so we want to thank you for your participation in 2019.
-
-**The impact**: Facebook got ~33% more changes than they would have had they decided to develop these as closed projects. Organizations addressing similar challenges got an 82,000-commit boost in exchange. What a clear illustration of the business impact of open source development.
-
-## [Cloud advice from the NSA][4]
-
-> This document divides cloud vulnerabilities into four classes (misconfiguration, poor access control, shared tenancy vulnerabilities, and supply chain vulnerabilities) that encompass the vast majority of known vulnerabilities. Cloud customers have a critical role in mitigating misconfiguration and poor access control, but can also take actions to protect cloud resources from the exploitation of shared tenancy and supply chain vulnerabilities. Descriptions of each vulnerability class along with the most effective mitigations are provided to help organizations lock down their cloud resources. By taking a risk-based approach to cloud adoption, organizations can securely benefit from the cloud’s extensive capabilities.
-
-**The impact**: The Fear, Uncertainty, and Doubt (FUD) that has been associated with cloud adoption is being debunked more all the time. None other then the US Department of Defense has done a lot of the thinking so you don't have to, and there is a good chance that their concerns are at least as dire as yours are.
-
-## [With Kubernetes, China Minsheng Bank transformed its legacy applications][5]
-
-> But all of CMBC’s legacy applications—for example, the core banking system, payment systems, and channel systems—were written in C and Java, using traditional architecture. “We wanted to do distributed applications because in the past we used VMs in our own data center, and that was quite expensive and with low resource utilization rate,” says Zhang. “Our biggest challenge is how to make our traditional legacy applications adaptable to the cloud native environment.” So far, around 20 applications are running in production on the Kubernetes platform, and 30 new applications are in active development to adopt the Kubernetes platform.
-
-**The impact**: This illustrates nicely the challenges and opportunities facing businesses in a competitive environment, and suggests a common adoption pattern. Do new stuff the new way, and move the old stuff as it makes sense.
-
-## [The '5 Rs' of the move to cloud native: Re-platform, re-host, re-factor, replace, retire][6]
-
-> The bottom line is that telcos and service providers will go cloud native when it is cheaper for them to migrate to the cloud and pay cloud costs than it is to remain in the data centre. That time is now and by adhering to the "5 Rs" of the move to cloud native, Re-platform, Re-host, Re-factor, Replace and/or Retire, the path is open, clearly marked and the goal eminently achievable.
-
-**The impact**: Cloud-native is basically used as a synonym for open source in this interview; there is no other type of technology that will deliver the same lift.
-
-## [Fedora CoreOS out of preview][7]
-
-> Fedora CoreOS is a new Fedora Edition built specifically for running containerized workloads securely and at scale. It’s the successor to both [Fedora Atomic Host][8] and [CoreOS Container Linux][9] and is part of our effort to explore new ways of assembling and updating an OS. Fedora CoreOS combines the provisioning tools and automatic update model of Container Linux with the packaging technology, OCI support, and SELinux security of Atomic Host. For more on the Fedora CoreOS philosophy, goals, and design, see the [announcement of the preview release][10].
-
-**The impact**: Collapsing these two branches of the Linux family tree into one another moves the state of the art forward for everyone (once you get through the migration).
-
-_I hope you enjoyed this list of what stood out to me from last week and come back next Monday for more open source community, market, and industry trends._
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/20/1/nsa-facebook-more-industry-trends
-
-作者:[Tim Hildred][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/thildred
-[b]: https://github.com/lujun9972
-[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/data_metrics_analytics_desktop_laptop.png?itok=9QXd7AUr (Person standing in front of a giant computer screen with numbers, data)
-[2]: https://opensource.com/article/20/1/hybrid-developer-future-industry-trends
-[3]: https://opensource.facebook.com/
-[4]: https://media.defense.gov/2020/Jan/22/2002237484/-1/-1/0/CSI-MITIGATING-CLOUD-VULNERABILITIES_20200121.PDF
-[5]: https://www.cncf.io/blog/2020/01/23/with-kubernetes-china-minsheng-bank-transformed-its-legacy-applications-and-moved-into-ai-blockchain-and-big-data/
-[6]: https://www.telecomtv.com/content/cloud-native/the-5-rs-of-the-move-to-cloud-native-re-platform-re-host-re-factor-replace-retire-37473/
-[7]: https://fedoramagazine.org/fedora-coreos-out-of-preview/
-[8]: https://www.projectatomic.io/
-[9]: https://coreos.com/os/docs/latest/
-[10]: https://fedoramagazine.org/introducing-fedora-coreos/
diff --git a/sources/news/20200205 The Y2038 problem in the Linux kernel, 25 years of Java, and other industry news.md b/sources/news/20200205 The Y2038 problem in the Linux kernel, 25 years of Java, and other industry news.md
deleted file mode 100644
index 2e814fdfc0..0000000000
--- a/sources/news/20200205 The Y2038 problem in the Linux kernel, 25 years of Java, and other industry news.md
+++ /dev/null
@@ -1,71 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (The Y2038 problem in the Linux kernel, 25 years of Java, and other industry news)
-[#]: via: (https://opensource.com/article/20/2/linux-java-and-other-industry-news)
-[#]: author: (Tim Hildred https://opensource.com/users/thildred)
-
-The Y2038 problem in the Linux kernel, 25 years of Java, and other industry news
-======
-A weekly look at open source community and industry trends.
-![Person standing in front of a giant computer screen with numbers, data][1]
-
-As part of my role as a senior product marketing manager at an enterprise software company with an open source development model, I publish a regular update about open source community, market, and industry trends for product marketers, managers, and other influencers. Here are five of my and their favorite articles from that update.
-
-## [Need 32-bit Linux to run past 2038? When version 5.6 of the kernel pops, you're in for a treat][2]
-
-> Arnd Bergmann, an engineer working on the thorny Y2038 problem in the Linux kernel, posted to the [mailing list][3] that, yup, Linux 5.6 "should be the first release that can serve as a base for a 32-bit system designed to run beyond year 2038."
-
-**The impact:** Y2K didn't get fixed; it just got bigger and delayed. There is no magic in software or computers; just people trying to solve complicated problems as best they can, and some times introducing more complicated problems for different people to solve at some point in the future.
-
-## [What the dev? Celebrating Java's 25th anniversary][4]
-
-> Java is coming up on a big milestone: Its 25th anniversary! To celebrate, we take a look back over the last 25 years to see how Java has evolved over time. In this episode, Social Media and Online Editor Jenna Sargent talks to Rich Sharples, senior director of product management for middleware at Red Hat, to learn more.
-
-**The impact:** There is something comforting about immersing yourself in a deep well of lived experience. Rich clearly lived through what he is talking about and shares insider knowlege with you (and his dog).
-
-## [Do I need an API Gateway if I use a service mesh?][5]
-
-> This post may not be able to break through the noise around API Gateways and Service Mesh. However, it’s 2020 and there is still abundant confusion around these topics. I have chosen to write this to help bring real concrete explanation to help clarify differences, overlap, and when to use which. Feel free to [@ me on twitter (@christianposta)][6] if you feel I’m adding to the confusion, disagree, or wish to buy me a beer (and these are not mutually exclusive reasons).
-
-**The impact:** Yes, though they use similar terms and concepts they have different concerns and scopes.
-
-## [What Australia's AGL Energy learned about Cloud Native compliance][7]
-
-> This is really at the heart of what open source is, enabling everybody to contribute equally. Within large enterprises, there are controls that are needed, but if we can automate the management of the majority of these controls, we can enable an amazing culture and development experience.
-
-**The impact:** They say "software is eating the world" and "developers are the new kingmakers." The fact that compliance in an energy utility is subject to developer experience improvement basically proves both statements.
-
-## [Monoliths are the future][8]
-
-> And then what they end up doing is creating 50 deployables, but it’s really a _distributed_ monolith. So it’s actually the same thing, but instead of function calls and class instantiation, they’re initiating things and throwing it over a network and hoping that it comes back. And since they can’t reliably _make it_ come back, they introduce things like [Prometheus][9], [OpenTracing][10], all of this stuff. I’m like, **“What are you doing?!”**
-
-**The impact:** Do things for real reasons with a clear-eyed understanding of what those reasons are and how they'll make your business or your organization better.
-
-_I hope you enjoyed this list of what stood out to me from last week and come back next Monday for more open source community, market, and industry trends._
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/20/2/linux-java-and-other-industry-news
-
-作者:[Tim Hildred][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/thildred
-[b]: https://github.com/lujun9972
-[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/data_metrics_analytics_desktop_laptop.png?itok=9QXd7AUr (Person standing in front of a giant computer screen with numbers, data)
-[2]: https://www.theregister.co.uk/2020/01/30/linux_5_6_2038/
-[3]: https://lkml.org/lkml/2020/1/29/355
-[4]: https://whatthedev.buzzsprout.com/673192/2543290-celebrating-java-s-25th-anniversary-episode-16
-[5]: https://blog.christianposta.com/microservices/do-i-need-an-api-gateway-if-i-have-a-service-mesh/ (Do I Need an API Gateway if I Use a Service Mesh?)
-[6]: http://twitter.com/christianposta?lang=en
-[7]: https://thenewstack.io/what-australias-agl-energy-learned-about-cloud-native-compliance/
-[8]: https://changelog.com/posts/monoliths-are-the-future
-[9]: https://prometheus.io/
-[10]: https://opentracing.io
diff --git a/sources/news/20200211 Building a Linux desktop, CERN powered by Ceph, and more industry trends.md b/sources/news/20200211 Building a Linux desktop, CERN powered by Ceph, and more industry trends.md
deleted file mode 100644
index 424f69bcc2..0000000000
--- a/sources/news/20200211 Building a Linux desktop, CERN powered by Ceph, and more industry trends.md
+++ /dev/null
@@ -1,66 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Building a Linux desktop, CERN powered by Ceph, and more industry trends)
-[#]: via: (https://opensource.com/article/20/2/linux-desktop-cern-more-industry-trends)
-[#]: author: (Tim Hildred https://opensource.com/users/thildred)
-
-Building a Linux desktop, CERN powered by Ceph, and more industry trends
-======
-A weekly look at open source community and industry trends.
-![Person standing in front of a giant computer screen with numbers, data][1]
-
-As part of my role as a senior product marketing manager at an enterprise software company with an open source development model, I publish a regular update about open source community, market, and industry trends for product marketers, managers, and other influencers. Here are five of my and their favorite articles from that update.
-
-## [Building a Linux desktop for cloud-native development][2]
-
-> This post covers the building of my Linux Desktop PC for Cloud Native Development. I'll be covering everything from parts, to peripherals, to CLIs, to SaaS software with as many links and snippets as I can manage. I hope that you enjoy reading about my experience, learn something, and possibly go on to build your own Linux Desktop.
-
-**The impact**: I hope the irony is not lost on anyone that step 1, when doing cloud-native software development, is to install Linux on a physical computer.
-
-## [Enabling CERN’s particle physics research with open source][3]
-
-> Ceph is an open-source software-defined storage platform. While it’s not often in the spotlight, it’s working hard behind the scenes, playing a crucial role in enabling ambitious, world-renowned projects such as CERN’s particle physics research, Immunity Bio’s cancer research, The Human Brain Project, MeerKat radio telescope, and more. These ventures are propelling the collective understanding of our planet and the human race beyond imaginable realms, and the outcomes will forever change how we perceive our existence and potential.
-
-**The impact**: It is not often that you get to see a straight line drawn between storage and the perception of human existence. Thanks for that, CERN!
-
-## [2020 cloud predictions][4]
-
-> "Serverless" as a concept provides a simplified developer experience that will become a platform feature. More platform-as-a-service providers will incorporate serverless traits into the daily activities developers perform when building cloud-native applications, becoming the default computing paradigm for the cloud.
-
-**The impact:** All of the trends in the predictions in this post are basically about maturation as ideas like serverless, edge computing, DevOps, and other cloud-adjacent buzz words move from the early adopters into the early majority phase of the adoption curve.
-
-## [End-of-life announcement for CoreOS Container Linux][5]
-
-> As we've [previously announced][6], [Fedora CoreOS][7] is the official successor to CoreOS Container Linux. Fedora CoreOS is a [new Fedora Edition][8] built specifically for running containerized workloads securely and at scale. It combines the provisioning tools and automatic update model of Container Linux with the packaging technology, OCI support, and SELinux security of Atomic Host. For more on the Fedora CoreOS philosophy, goals, and design, see the [announcement of the preview release][9] and the [Fedora CoreOS documentation][10].
-
-**The impact**: Milestones like this are often bittersweet for both creators and users. The CoreOS team built something that their community loved to use, which is something to be celebrated. Hopefully, that community can find a [new home][11] in the wider [Fedora ecosystem][8].
-
-_I hope you enjoyed this list and come back next week for more open source community, market, and industry trends._
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/20/2/linux-desktop-cern-more-industry-trends
-
-作者:[Tim Hildred][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/thildred
-[b]: https://github.com/lujun9972
-[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/data_metrics_analytics_desktop_laptop.png?itok=9QXd7AUr (Person standing in front of a giant computer screen with numbers, data)
-[2]: https://blog.alexellis.io/building-a-linux-desktop-for-cloud-native-development/
-[3]: https://insidehpc.com/2020/02/how-ceph-powers-exciting-research-with-open-source/
-[4]: https://www.devopsdigest.com/2020-cloud-predictions-2
-[5]: https://coreos.com/os/eol/
-[6]: https://groups.google.com/d/msg/coreos-user/zgqkG88DS3U/PFP9yrKbAgAJ
-[7]: https://getfedora.org/coreos/
-[8]: https://fedoramagazine.org/fedora-coreos-out-of-preview/
-[9]: https://fedoramagazine.org/introducing-fedora-coreos/
-[10]: https://docs.fedoraproject.org/en-US/fedora-coreos/
-[11]: https://getfedora.org/en/coreos/
diff --git a/sources/news/20200212 OpenShot Video Editor Gets a Major Update With Version 2.5 Release.md b/sources/news/20200212 OpenShot Video Editor Gets a Major Update With Version 2.5 Release.md
deleted file mode 100644
index bb3b2dc59a..0000000000
--- a/sources/news/20200212 OpenShot Video Editor Gets a Major Update With Version 2.5 Release.md
+++ /dev/null
@@ -1,115 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (OpenShot Video Editor Gets a Major Update With Version 2.5 Release)
-[#]: via: (https://itsfoss.com/openshot-2-5-release/)
-[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
-
-OpenShot Video Editor Gets a Major Update With Version 2.5 Release
-======
-
-[OpenShot][1] is one of the [best open-source video editors][2] out there. With all the features that it offered – it was already a good video editor on Linux.
-
-Now, with a major update to it (**v.2.5.0**), OpenShot has added a lot of new improvements and features. And, trust me, it’s not just any regular release – it is a huge release packed with features that you probably wanted for a very long time.
-
-In this article, I will briefly mention the key changes involved in the latest release.
-
-![][3]
-
-### OpenShot 2.5.0 Key Features
-
-Here are some of the major new features and improvements in OpenShot 2.5:
-
-#### Hardware Acceleration Support
-
-The hardware acceleration support is still an experimental addition – however, it is a useful feature to have.
-
-Instead of relying on your CPU to do all the hard work, you can utilize your GPU to encode/decode video data when working with MP4/H.264 video files.
-
-This will affect (or improve) the performance of OpenShot in a meaningful way.
-
-#### Support Importing/Exporting Files From Final Cut Pro & Premiere
-
-![][4]
-
-[Final Cut Pro][5] and [Adobe Premiere][6] are the two popular video editors for professional content creators. OpenShot 2.5 now allows you to work on projects created on these platforms. It can import (or export) the files from Final Cut Pro & Premiere in EDL & XML formats.
-
-#### Thumbnail Generation Improved
-
-This isn’t a big feature – but a necessary improvement to most of the video editors. You don’t want broken images in the thumbnails (your timeline/library). So, with this update, OpenShot now generates the thumbnails using a local HTTP server, can check multiple folder locations, and regenerate missing ones.
-
-#### Blender 2.8+ Support
-
-The new OpenShot release also supports the latest [Blender][7] (.blend) format – so it should come in handy if you’re using Blender as well.
-
-#### Easily Recover Previous Saves & Improved Auto-backup
-
-![][8]
-
-It was always a horror to lose your timeline work after you accidentally deleted it – which was then auto-saved to overwrite your saved project.
-
-Now, the auto-backup feature has improved with an added ability to easily recover your previous saved version of the project.
-
-Even though you can recover your previous saves now – you will find a limited number of the saved versions, so you have to still remain careful.
-
-#### Other Improvements
-
-In addition to all the key highlights mentioned above, you will also notice a performance improvement when using the keyframe system.
-
-Several other issues like SVG compatibility, exporting & modifying keyframe data, and resizable preview window have been fixed in this major update. For privacy-concerned users, OpenShot no longer sends usage data unless you opt-in to share it with them.
-
-For more information, you can take a look at [OpenShot’s official blog post][9] to get the release notes.
-
-### Installing OpenShot 2.5 on Linux
-
-You can simply download the .AppImage file from its [official download page][10] to [install the latest OpenShot version][11]. If you’re new to AppImage, you should also check out [how to use AppImage][12] on Linux to easily launch OpenShot.
-
-[Download Latest OpenShot Release][10]
-
-Some distributions like Arch Linux may also provide the latest OpenShot release with regular system updates.
-
-#### PPA available for Ubuntu-based distributions
-
-On Ubuntu-based distributions, if you don’t want to use AppImage, you can [use the official PPA][13] from OpenShot:
-
-```
-sudo add-apt-repository ppa:openshot.developers/ppa
-sudo apt update
-sudo apt install openshot-qt
-```
-
-You may want to know how to remove PPA if you want to uninstall it later.
-
-**Wrapping Up**
-
-With all the latest changes/improvements considered, do you see [OpenShot][11] as your primary [video editor on Linux][14]? If not, what more do you expect to see in OpenShot? Feel free to share your thoughts in the comments below.
-
---------------------------------------------------------------------------------
-
-via: https://itsfoss.com/openshot-2-5-release/
-
-作者:[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://www.openshot.org/
-[2]: https://itsfoss.com/open-source-video-editors/
-[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/02/openshot-2-5-0.png?ssl=1
-[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/02/openshot-xml-edl.png?ssl=1
-[5]: https://www.apple.com/in/final-cut-pro/
-[6]: https://www.adobe.com/in/products/premiere.html
-[7]: https://www.blender.org/
-[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/02/openshot-recovery.jpg?ssl=1
-[9]: https://www.openshot.org/blog/2020/02/08/openshot-250-released-video-editing-hardware-acceleration/
-[10]: https://www.openshot.org/download/
-[11]: https://itsfoss.com/openshot-video-editor-release/
-[12]: https://itsfoss.com/use-appimage-linux/
-[13]: https://itsfoss.com/ppa-guide/
-[14]: https://itsfoss.com/best-video-editing-software-linux/
diff --git a/sources/news/20200213 KDE Plasma 5.18 LTS Released With New Features.md b/sources/news/20200213 KDE Plasma 5.18 LTS Released With New Features.md
deleted file mode 100644
index 8100290280..0000000000
--- a/sources/news/20200213 KDE Plasma 5.18 LTS Released With New Features.md
+++ /dev/null
@@ -1,121 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (KDE Plasma 5.18 LTS Released With New Features)
-[#]: via: (https://itsfoss.com/kde-plasma-5-18-release/)
-[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
-
-KDE Plasma 5.18 LTS Released With New Features
-======
-
-[KDE plasma][1] desktop is undoubtedly one of the most impressive [Linux desktop environments][2] available out there right now.
-
-Now, with the latest release, the KDE Plasma desktop just got more awesome!
-
-KDE Plasma 5.18 marks itself as an LTS (Long Term Support) release i.e it will be maintained by the KDE contributors for the next 2 years while the regular versions are maintained for just 4 months.
-
-![KDE Plasma 5.18 on KDE Neon][3]
-
-So, if you want more stability on your KDE-powered Linux system, it would be a good idea to upgrade to KDE’s Plasma 5.18 LTS release.
-
-### KDE Plasma 5.18 LTS Features
-
-Here are the main new features added in this release:
-
-#### Emoji Selector
-
-![Emoji Selector in KDE][4]
-
-Normally, you would Google an emoji to copy it to your clipboard or simply use the good-old emoticons to express yourself.
-
-Now, with the latest update, you get an emoji selector in Plasma Desktop. You can simply find it by searching for it in the application launcher or by just pressing (Windows key/Meta/Super Key) + . (**period/dot)**.
-
-The shortcut should come in handy when you need to use an emoji while sending an email or any other sort of messages.
-
-#### Global Edit Mode
-
-![Global Edit Mode][5]
-
-You probably would have used the old desktop toolbox on the top-right corner of the screen in the Plasma desktop, but the new release gets rid of that and instead – provides you with a global edit mode when you right-click on the desktop and click on “**Customize Layout**“.
-
-#### Night Color Control
-
-![Night Color Control][6]
-
-Now, you can easily toggle the night color mode right from the system tray. In addition to that, you can even choose to set a keyboard shortcut for both night color and the do not disturb mode.
-
-#### Privacy Improvements For User Feedback
-
-![Improved Privacy][7]
-
-It is worth noting that KDE Plasma lets you control the user feedback information that you share with them.
-
-You can either choose to disable sharing any information at all or control the level of information you share (basic, intermediate, and detailed).
-
-#### Global Themes
-
-![Themes][8]
-
-You can either choose from the default global themes available or download community-crafted themes to set up on your system.
-
-#### UI Improvements
-
-There are several subtle improvements and changes. For instance, the look and feel of the notifications have improved.
-
-You can also notice a couple of differences in the software center (Discover) to help you easily install apps.
-
-Not just limited to that, but you also get the ability to mute the volume of a window from the taskbar (just like you normally do on your browser’s tab). Similarly, there are a couple of changes here and there to improve the KDE Plasma experience.
-
-#### Other Changes
-
-In addition to the visual changes and customization ability, the performance of KDE Plasma has improved when coupled with a graphics hardware.
-
-To know more about the changes, you can refer the [official announcement post][9] for KDE Plasma 5.18 LTS.
-
-[Subscribe to our YouTube channel for more Linux videos][10]
-
-### How To Get KDE Plasma 5.18 LTS?
-
-If you are using a rolling release distribution like Arch Linux, you might have got it with the system updates. If you haven’t performed an update yet, simply check for updates from the system settings.
-
-If you are using Kubuntu, you can add the Kubuntu backports PPA to update the Plasma desktop with the following commands:
-
-```
-sudo add-apt-repository ppa:kubuntu-ppa/backports
-sudo apt update && sudo apt full-upgrade
-```
-
-If you do not have KDE as your desktop environment, you can refer our article on [how to install KDE on Ubuntu][11] to get started.
-
-**Wrapping Up**
-
-KDE Plasma 5.18 may not involve a whole lot of changes – but being an LTS release, the key new features seem helpful and should come in handy to improve the Plasma desktop experience for everyone.
-
-What do you think about the latest Plasma desktop release? Feel free to let me know your thoughts in the comments below.
-
---------------------------------------------------------------------------------
-
-via: https://itsfoss.com/kde-plasma-5-18-release/
-
-作者:[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://kde.org/plasma-desktop/
-[2]: https://itsfoss.com/best-linux-desktop-environments/
-[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/02/kde-plasma-5-18-info.jpg?ssl=1
-[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/02/kde-plasma-emoji-pick.jpg?ssl=1
-[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/02/kde-plasma-global-editor.jpg?ssl=1
-[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/02/kde-plasma-night-color.jpg?ssl=1
-[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/02/user-feedback-kde-plasma.png?ssl=1
-[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/02/kde-plasma-global-themes.jpg?ssl=1
-[9]: https://kde.org/announcements/plasma-5.18.0.php
-[10]: https://www.youtube.com/c/itsfoss?sub_confirmation=1
-[11]: https://itsfoss.com/install-kde-on-ubuntu/
diff --git a/sources/news/20200314 Linux Foundation prepares for disaster, new anti-tracking data set, Mozilla goes back to mobile OSes, and more open source news.md b/sources/news/20200314 Linux Foundation prepares for disaster, new anti-tracking data set, Mozilla goes back to mobile OSes, and more open source news.md
new file mode 100644
index 0000000000..0f3aa9a0a3
--- /dev/null
+++ b/sources/news/20200314 Linux Foundation prepares for disaster, new anti-tracking data set, Mozilla goes back to mobile OSes, and more open source news.md
@@ -0,0 +1,82 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Linux Foundation prepares for disaster, new anti-tracking data set, Mozilla goes back to mobile OSes, and more open source news)
+[#]: via: (https://opensource.com/article/20/3/news-march-14)
+[#]: author: (Scott Nesbitt https://opensource.com/users/scottnesbitt)
+
+Linux Foundation prepares for disaster, new anti-tracking data set, Mozilla goes back to mobile OSes, and more open source news
+======
+Catch up on the biggest open source headlines from the past two weeks.
+![][1]
+
+In this edition of our open source news roundup, we take a look at the Linux Foundation's disaster relief project, DuckDuckGo's anti-tracking tool, open textbooks, and more!
+
+### Linux Foundation unveils Project OWL
+
+When a disaster happens, it's vital to keep communications links up and running. One way to do that is with [mesh networks][2]. The Linux Foundation [has unveiled][3] Project OWL to "help build mesh network nodes for global emergency communications networks."
+
+Short for _Organisation, Whereabouts, and Logistics_, OWL is firmware for Internet of Things (IoT) devices that "can quickly turn a cheap wireless device into a ‘DuckLink’, a mesh network node". Those devices can connect to other, similar devices around them. OWL also provides an analytics tool that responders can use for "coordinating resources, learning about weather patterns, and communicating with civilians who would otherwise be cut off."
+
+### New open source tool to block web trackers
+
+It's no secret that sites all over the web track their visitors. Often, it's shocking how much of that goes on and what a threat to your privacy that is. To help web browser developers better protect their users, the team behind search engine DuckDuckGo is "[sharing data it's collected about online trackers with other companies so they can also protect your privacy][4]."
+
+That dataset is called Tracker Radar and it "details 5,326 internet domains used by 1,727 companies and organizations that track you online". Browser Radar is different from other tracker databases in that it "annotates data with other information, like whether blocking a tracker is likely to break a website, so anyone using it can pick the best balance of privacy and convenience."
+
+Tracker Radar's dataset is [available on GitHub][5]. The repository also links to the code for the [crawler][6] and [detector][7] that work with the data.
+
+### Oregon Tech embracing open textbooks
+
+With the cost of textbooks taking an increasingly large bite out of the budgets of university students, more and more schools are turning to open textbooks to cut those costs. By embracing open textbooks, the Oregon Institute of Technology has [save students $400,000][8] over the last two years.
+
+The school offers open textbooks for 26 courses, ranging "from chemistry and biology, to respiratory care, sociology and engineering." Although the textbooks are free, university librarian John Schoppert points out that the materials are of a high quality and that faculty members have been "developing lab manuals and open-licensed textbooks where they hadn’t existed before and improved on others’ materials."
+
+### Mozilla to help update feature phone OS
+
+A few years ago, Mozilla tried to break into the world of mobile operating systems with Firefox OS. While that effort didn't pan out, Firefox OS found new life powering low-cost feature phones under the name KaiOS. Mozilla's [jumping back into the game][9] by helping "modernize the browser engine that's core to the software."
+
+KaiOS is built upon a four-year-old version of Mozilla's Gecko browser engine. Updating Gecko will "improve security, make apps run faster and more smoothly, and open [KaiOS to] more-sophisticated apps and WebGL 2.0 for better games graphics." Mozilla said its collaboration will include "Mozilla's help with test engineering and adding new low-level Gecko abilities."
+
+#### In other news
+
+ * [CERN adopts Mattermost, an open source messaging app][10]
+ * [Open-source software analyzes economics of biofuels, bioproducts][11]
+ * [Netflix releases Dispatch for crisis management orchestration][12]
+ * [FreeNAS and TrueNAS are merging][13]
+ * [Smithsonian 3D Scans NASA Space Shuttle Discovery And Makes It Open Source][14]
+
+
+
+Thanks, as always, to Opensource.com staff members and [Correspondents][15] for their help this week.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/news-march-14
+
+作者:[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://opensource.com/sites/default/files/styles/image-full-size/public/weekly_news_roundup_tv.png?itok=tibLvjBd
+[2]: https://en.wikipedia.org/wiki/Mesh_networking
+[3]: https://www.smartcitiesworld.net/news/news/linux-announces-open-source-project-to-aid-disaster-relief-5102
+[4]: https://www.cnet.com/news/privacy-focused-duckduckgo-launches-new-effort-to-block-online-tracking/
+[5]: https://github.com/duckduckgo/tracker-radar
+[6]: https://github.com/duckduckgo/tracker-radar-collector
+[7]: https://github.com/duckduckgo/tracker-radar-detector
+[8]: https://www.heraldandnews.com/news/local_news/oregon-tech-turns-to-open-source-materials-to-save-students/article_ba641e79-3034-5b9a-a8f7-b5872ddc998e.html
+[9]: https://www.cnet.com/news/mozilla-helps-modernize-feature-phones-powered-by-firefox-tech/
+[10]: https://joinup.ec.europa.eu/collection/open-source-observatory-osor/news/cern-uses-mattermost
+[11]: http://www.biomassmagazine.com/articles/16848/open-source-software-analyzes-economics-of-biofuels-bioproducts
+[12]: https://jaxenter.com/netflix-dispatch-crisis-management-orchestration-169381.html
+[13]: https://liliputing.com/2020/03/freenas-and-turenas-are-merging-open-source-operating-systems-for-network-attached-storage.html
+[14]: https://www.forbes.com/sites/tjmccue/2020/03/04/smithsonian-3d-scans-the-nasa-space-shuttle-discovery-and-makes-it-open-source/#39aa0f243ecd
+[15]: https://opensource.com/correspondent-program
diff --git a/sources/news/20200319 Fedora 32 Release Date, New Features and Everything Else.md b/sources/news/20200319 Fedora 32 Release Date, New Features and Everything Else.md
new file mode 100644
index 0000000000..c70c034a22
--- /dev/null
+++ b/sources/news/20200319 Fedora 32 Release Date, New Features and Everything Else.md
@@ -0,0 +1,94 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Fedora 32 Release Date, New Features and Everything Else)
+[#]: via: (https://itsfoss.com/fedora-32/)
+[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
+
+Fedora 32 Release Date, New Features and Everything Else
+======
+
+Fedora 32 should be releasing at the end of April, around the same time as the [Ubuntu 20.04 LTS release][1].
+
+Since we are covering the Ubuntu 20.04 release in detail, we thought of doing the same for our Fedora fans here.
+
+In this article, I am going to highlight the new features coming to Fedora 32. I’ll update this article as the development progresses further.
+
+### New features in Fedora 32
+
+![][2]
+
+#### EarlyOOM Enabled
+
+With this release, [EarlyOOM][3] comes enabled by default. To give you a background, EarlyOOM lets users to easily recover their systems from a low-memory situation with heavy [swap][4] usage.
+
+It is worth noting that it is applicable to the Fedora 32 Beta Workstation edition.
+
+#### GNOME 3.36 Added
+
+The new Fedora 32 Workstation also comes included with the new [GNOME 3.36][5].
+
+Not just limited to Fedora 32 Beta Workstation – but it has also been added to the daily build of [Ubuntu 20.04 LTS][1].
+
+Of course, the improvements in GNOME 3.36 translates to Fedora’s latest release as well – providing a faster and better experience, overall.
+
+So, you’ll get the new lock screen, the do not disturb feature and everything else that comes with GNOME 3.36.
+
+#### Package Updates
+
+Fedora 32 release also updates a lot of important packages that include Ruby, Perl, and Python. It also features the latest version 10 of the [GNU Compiler Collection][6] (GCC).
+
+#### Other Changes
+
+In addition to the key highlights, there’s a lot of things that have changed, improved, or fixed. You can take a detailed look at its [changelog][7] to know more about what has changed.
+
+### Download Fedora 32 (development version)
+
+Fedora 32 is still under development. The beta version has been released and you may test it on a spare system or in virtual machine. **I would not advise you to use it on your main system before the final release**. There’s an official [list of know bugs][8] for the current release, you can refer to that as well.
+
+In the [official announcement][9], they mentioned the availability of both **Fedora 32 beta workstation** and the **server** along with other popular variants.
+
+To get the Workstation and the Server edition, you have to visit the official download page for [Fedora Workstation][10] and [Fedora Server][11] (depending on what you want).
+
+![Fedora Download Beta][12]
+
+Once, you do that, just look for a release tagged as “**Beta!**” as shown in the image above and start downloading it. For other variants, click on the links below to head to their respective download pages:
+
+ * [Fedora 32 Beta Spins][13]
+ * [Fedora 32 Beta Labs][14]
+ * [Fedora 32 Beta ARM][15]
+
+
+
+Have you noticed any other new feature in Fedora 32? What features you would like to see here? Feel free to leave a comment below.
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/fedora-32/
+
+作者:[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/ubuntu-20-04-release-features/
+[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/11/update_fedora.jpg?ssl=1
+[3]: https://fedoraproject.org/wiki/Changes/EnableEarlyoom#Enable_EarlyOOM
+[4]: https://itsfoss.com/swap-size/
+[5]: https://itsfoss.com/gnome-3-36-release/
+[6]: https://gcc.gnu.org/
+[7]: https://fedoraproject.org/wiki/Releases/32/ChangeSet
+[8]: https://fedoraproject.org/wiki/Common_F32_bugs
+[9]: https://fedoramagazine.org/announcing-the-release-of-fedora-32-beta/
+[10]: https://getfedora.org/workstation/download/
+[11]: https://getfedora.org/server/download/
+[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/fedora-download-beta.jpg?ssl=1
+[13]: https://spins.fedoraproject.org/prerelease
+[14]: https://labs.fedoraproject.org/prerelease
+[15]: https://arm.fedoraproject.org/prerelease
diff --git a/sources/news/20200319 Tools for monitoring, introvert inclusion, and more industry trends.md b/sources/news/20200319 Tools for monitoring, introvert inclusion, and more industry trends.md
new file mode 100644
index 0000000000..838a4e2c23
--- /dev/null
+++ b/sources/news/20200319 Tools for monitoring, introvert inclusion, and more industry trends.md
@@ -0,0 +1,60 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Tools for monitoring, introvert inclusion, and more industry trends)
+[#]: via: (https://opensource.com/article/20/3/monitoring-introvert-industry-trends)
+[#]: author: (Tim Hildred https://opensource.com/users/thildred)
+
+Tools for monitoring, introvert inclusion, and more industry trends
+======
+A weekly look at open source community and industry trends.
+![Person standing in front of a giant computer screen with numbers, data][1]
+
+As part of my role as a senior product marketing manager at an enterprise software company with an open source development model, I publish a regular update about open source community, market, and industry trends for product marketers, managers, and other influencers. Here are five of my and their favorite articles from that update.
+
+## [Top six open source tools for monitoring][2]
+
+> These tools are widely used in the tech industry, and they all have their benefits. Most of these solutions, however, require skilled implementation and ongoing manual maintenance that can be a burden for DevOps teams and a distraction from the business. There’s no one solution that can cater to all of your requirements, since each tool focuses on one or two specific aspects of observability and analysis. By mixing these tools together, you can derive a unique solution for your individual business needs.
+
+**The impact**: If a container falls over in the cluster and there is no open source monitoring tool to see it, did it really happen?
+
+## [Introvert environment: What can we do?][3]
+
+> An example is its inclusive team dynamics programme, which consists of both information and guidance on everyday practices. Each team is required to appoint an inclusion champion, who ensures all members are given the space to contribute to discussions. Leaders are also encouraged not to speak first during meetings.
+
+**The impact**: If it is hard for you not to speak for a while in a meeting, that probably indicates you should be doing it more often. Will new WFH policies make this harder, or easier? Only time will tell.
+
+## [The difference between API Gateways and service mesh][4]
+
+> The service connectivity capabilities that service mesh provides are conflicting with the API connectivity features that an API gateway provides. However, because the ones provided by service mesh are more inclusive (L4 + L7, all TCP traffic, not just HTTP and not just limited to APIs but to every service), they are in a way more complete. But as we can see from the diagram above, there are also use cases that service mesh does not provide, and that is the “API as a product” use case as well as the full API management lifecycle, which still belong to the API gateway pattern.
+
+**The impact**: Another way of saying this is you can't make money from your service mesh directly, unlike your APIs.
+
+## [Open Policy Agent’s mission to secure the cloud][5]
+
+> While the cost of implementing OPA is a little high today, the technology pays for itself by providing more control and helping to secure systems. As OPA continues to be refined, we can expect implementation costs to fall, making an investment in OPA easier to justify.
+
+**The impact**: Compliance is expensive; large investments in it only make sense if non-compliance is even more so.
+
+_I hope you enjoyed this list and come back next week for more open source community, market, and industry trends._
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/monitoring-introvert-industry-trends
+
+作者:[Tim Hildred][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/thildred
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/data_metrics_analytics_desktop_laptop.png?itok=9QXd7AUr (Person standing in front of a giant computer screen with numbers, data)
+[2]: https://devops.com/top-six-open-source-tools-for-monitoring-kubernetes-and-docker/
+[3]: https://www.raconteur.net/hr/introverts-workplace
+[4]: https://www.cncf.io/blog/2020/03/06/the-difference-between-api-gateways-and-service-mesh/
+[5]: https://thenewstack.io/open-policy-agents-mission-to-secure-the-cloud/
diff --git a/sources/news/20200319 With npm Acquisition, Microsoft is Set to Own the Largest Software Registry in the World.md b/sources/news/20200319 With npm Acquisition, Microsoft is Set to Own the Largest Software Registry in the World.md
new file mode 100644
index 0000000000..7e2d898bfe
--- /dev/null
+++ b/sources/news/20200319 With npm Acquisition, Microsoft is Set to Own the Largest Software Registry in the World.md
@@ -0,0 +1,78 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (With npm Acquisition, Microsoft is Set to Own the Largest Software Registry in the World)
+[#]: via: (https://itsfoss.com/microsoft-npm-acquisition/)
+[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
+
+With npm Acquisition, Microsoft is Set to Own the Largest Software Registry in the World
+======
+
+Microsoft has been betting big on open source for past few years. Apart from open sourcing a few things here and there, Microsoft is contributing a lot to Linux kernel (for its Azure cloud platform).
+
+To further strengthen its position in the open source world, [Microsoft acquired the popular open source code hosting platform GitHub for $7.5 billion][1].
+
+Now Microsoft owned GitHub [has acquired][2] [npm][3] ( short for Node Package Manager). npm is the [world’s largest software registry][4] with [more than 1.3 million packages that have 75 billion downloads a month][5].
+
+![][6]
+
+If you are not familiar, npm is a package manager for JavaScript programming language, primarily the hugely popular open source [Node.js][7].
+
+Though npm has scope of private repository for enterprises, most of the 1.3 million packages are open source and/or used in various open source projects.
+
+Both node.js and npm are used by big software and IT companies like IBM, Yahoo and big corporations like Netflix and PayPal.
+
+In case you are wondering, the acquisition amount has not been disclosed by either party.
+
+### Microsoft’s proposed plan for npm
+
+![][8]
+
+GitHub CEO Nat Friedman assured that Microsoft intends to keep the npm registry available as open-source and free to developers.
+
+Once the acquisition is complete, Microsoft is going to invest in the registry infrastructure and platform. It plans to improve the core experience of npm by adding new features like Workspaces, as well as bringing improvements to publishing and multi-factor authentication.
+
+Microsoft also intends to integrate GitHub and npm so that developers could trace a change from a GitHub pull request to the npm package version that fixed it.
+
+### Part of a larger plan
+
+First, [Microsoft bought GitHub][1], the platform that had the largest open source repositories and now npm, the largest software registry. Clearly, Microsoft is tightening its grip around open source projects. This could allow Microsoft to dictate the policies around these open source projects in future.
+
+When Microsoft acquired GitHub, several open source developers moved to [alternate platforms like GitLab][9] but GitHub remained the first choice for the developers. Microsoft did introduce some innovative features like security advisories, [package registry][10], [sponsorship][11] etc. Microsoft is expanding GitHub by forming communities around it specially in developing countries. Recently, [GitHub announced its Indian subsidiary][12] to specially attract young developers to its platform.
+
+So now Microsoft owns the professional social network [LinkedIn][13], developer oriented GitHub and npm. This indicates that Microsoft will continue its shopping spree and will acquire more open source related projects that have substantial developer population.
+
+What could be next then? WordPress because it is the [most popular open source CMS][14] and [runs 33% of the websites][15] on the internet?
+
+While we wait and watch for Microsoft’s next move, why not share your views on this development? Comment section is all yours.
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/microsoft-npm-acquisition/
+
+作者:[Abhishek Prakash][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/abhishek/
+[b]: https://github.com/lujun9972
+[1]: https://itsfoss.com/microsoft-github/
+[2]: https://github.blog/2020-03-16-npm-is-joining-github/
+[3]: https://www.npmjs.com/
+[4]: https://www.linux.com/news/state-union-npm/
+[5]: https://www.zdnet.com/article/microsoft-buys-javascript-developer-platform-npm-plans-to-integrate-it-with-github/
+[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/microsoft-github-npm.jpg?ssl=1
+[7]: https://nodejs.org/en/
+[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/github-npm.jpg?ssl=1
+[9]: https://itsfoss.com/github-alternatives/
+[10]: https://github.blog/2019-05-10-introducing-github-package-registry/
+[11]: https://itsfoss.com/github-sponsors-program/
+[12]: https://github.blog/2020-02-12-announcing-github-india/
+[13]: https://www.linkedin.com/
+[14]: https://itsfoss.com/open-source-cms/
+[15]: https://wordpress.org/news/2019/03/one-third-of-the-web/
diff --git a/sources/news/20200322 OBS Studio 25.0 is Here With Vulkan-based Games Capture Feature and More.md b/sources/news/20200322 OBS Studio 25.0 is Here With Vulkan-based Games Capture Feature and More.md
new file mode 100644
index 0000000000..afd9891678
--- /dev/null
+++ b/sources/news/20200322 OBS Studio 25.0 is Here With Vulkan-based Games Capture Feature and More.md
@@ -0,0 +1,98 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (OBS Studio 25.0 is Here With Vulkan-based Games Capture Feature and More)
+[#]: via: (https://itsfoss.com/obs-studio-25-release/)
+[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
+
+OBS Studio 25.0 is Here With Vulkan-based Games Capture Feature and More
+======
+
+_**Brief: Open source screen recording and streaming software OBS Studio 25.0 has just been released and it brings the ability to capture Vulkan-based games with game capture among other new features.**_
+
+![][1]
+
+If you are into recording your desktop or streaming it, you might have heard of [OBS][2] (Open Broadcaster Software) Studio. It’s one of the [best screen recorder tools on Linux][3] and other operating systems.
+
+But OBS is more than just a simple screen recorder. It also provides all the stuff you need for streaming your recordings.
+
+### New features in OBS Studio 25.0
+
+![OBS 25.0][4]
+
+OBS Studio has released it’s latest version 25.0 with plenty of new features to make your recording and streaming experience better. Let’s take a look at some of the main new features:
+
+ * Capture Vulkan-based games with game capture
+ * New capture method to window capture which allows capturing browsers, browser-based windows, and UWP programs
+ * Advanced scene collection importing allows you to import from other common streaming programs
+ * Media source hotkeys to allow control of playback
+ * Ability to drag and drop URLs to create browser sources
+ * Support for the [SRT protocol][5]
+ * Ability to lock volume values of audio sources in the mixer
+ * Support for certain devices that can automatically rotate their camera output such as the Logitech StreamCam
+ * System tray icon to show when the recording is paused
+ * Help icons when an property has a tooltip associated with it
+
+
+
+Apart from there, there are plenty of bug features and minor changes that you may follow in the [release notes][6].
+
+### Install OBS Studio 25.0 on Linux
+
+OBS Studio is a cross-platform software and is also available for Windows and macOS in addition to Linux. You can download it from its official website.
+
+[Download OBS Studio 25.0][7]
+
+For Linux, you can grab the source code and build it your self. I know that’s not very convenient for everyone. The good news is that you can install the latest OBS version using Snap or Flatpak packages.
+
+On Ubuntu or any other [Linux distribution with Snap support][8], you can use the following command:
+
+```
+sudo snap install obs-studio
+```
+
+If your distribution supports Fltapak packages, you can get it from Flathub website:
+
+[OBS Studio on Flathub][9]
+
+For Ubuntu users, there is also the official PPA for easily installing it. In a terminal, you can enter the following command one by one:
+
+```
+sudo add-apt-repository ppa:obsproject/obs-studio
+sudo apt update
+sudo apt install obs-studio
+```
+
+You can [learn about deleting PPA here][10].
+
+Personally, I haven’t used OBS much though I have heard great stuff about it. I don’t live stream but I do record my desktop to create tutorial and information Linux videos on I[t’s FOSS YouTube channel][11] (you should subscribe to it if you haven’t already). For that, I [use Kazam][12] which I find simpler to use.
+
+Do you use OBS Studio? Which features you like the most? Do share your views.
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/obs-studio-25-release/
+
+作者:[Abhishek Prakash][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/abhishek/
+[b]: https://github.com/lujun9972
+[1]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/obs_logo_icon_small.png?resize=150%2C150&ssl=1
+[2]: https://obsproject.com/
+[3]: https://itsfoss.com/best-linux-screen-recorders/
+[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/03/obs-25-ubuntu.png?ssl=1
+[5]: https://en.wikipedia.org/wiki/Secure_Reliable_Transport
+[6]: https://github.com/obsproject/obs-studio/releases/tag/25.0.0
+[7]: https://obsproject.com/download
+[8]: https://itsfoss.com/install-snap-linux/
+[9]: https://flathub.org/apps/details/com.obsproject.Studio
+[10]: https://itsfoss.com/how-to-remove-or-delete-ppas-quick-tip/
+[11]: https://www.youtube.com/channel/UCEU9D6KIShdLeTRyH3IdSvw
+[12]: https://itsfoss.com/kazam-screen-recorder/
diff --git a/sources/talk/20190822 How the Linux desktop has grown.md b/sources/talk/20190822 How the Linux desktop has grown.md
index e46b310502..3928a643e4 100644
--- a/sources/talk/20190822 How the Linux desktop has grown.md
+++ b/sources/talk/20190822 How the Linux desktop has grown.md
@@ -1,5 +1,5 @@
[#]: collector: (lujun9972)
-[#]: translator: ( )
+[#]: translator: (wxy)
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
diff --git a/sources/talk/20191031 A Bird-s Eye View of Big Data for Enterprises.md b/sources/talk/20191031 A Bird-s Eye View of Big Data for Enterprises.md
index 23db96ce3d..c62169b830 100644
--- a/sources/talk/20191031 A Bird-s Eye View of Big Data for Enterprises.md
+++ b/sources/talk/20191031 A Bird-s Eye View of Big Data for Enterprises.md
@@ -1,5 +1,5 @@
[#]: collector: (lujun9972)
-[#]: translator: (chai-yuan)
+[#]: translator: ( )
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
diff --git a/sources/talk/20200117 Insights into Why Hyperbola GNU-Linux is Turning into Hyperbola BSD.md b/sources/talk/20200117 Insights into Why Hyperbola GNU-Linux is Turning into Hyperbola BSD.md
index a2bca0089f..68ede9acfa 100644
--- a/sources/talk/20200117 Insights into Why Hyperbola GNU-Linux is Turning into Hyperbola BSD.md
+++ b/sources/talk/20200117 Insights into Why Hyperbola GNU-Linux is Turning into Hyperbola BSD.md
@@ -1,5 +1,5 @@
[#]: collector: (lujun9972)
-[#]: translator: (Morisun029)
+[#]: translator: ( )
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
diff --git a/sources/talk/20200214 Linux is our love language.md b/sources/talk/20200214 Linux is our love language.md
deleted file mode 100644
index 397ddee4d3..0000000000
--- a/sources/talk/20200214 Linux is our love language.md
+++ /dev/null
@@ -1,83 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Linux is our love language)
-[#]: via: (https://opensource.com/article/20/2/linux-love-language)
-[#]: author: (Christopher Cherry https://opensource.com/users/chcherry)
-
-Linux is our love language
-======
-When a wife teaches a husband some new tech skills, they both learn a
-lot more than they expect.
-![Red heart with text "you are not alone"][1]
-
-2019 was a year of learning in the Cherry household. I am a senior software engineer who set out to learn new skills and, along the way, I taught my husband, Chris. By teaching him some of the things I learned and asking him to work through my technology walkthrough articles, I helped Chris learn new skills that enabled him to pivot his career deeper into the technology field. And I learned new ways to make my walkthroughs and training materials more accessible for readers to digest.
-
-In this article, we talk about what we learned individually and from each other, then we explore what it means for their future.
-
-### Questions for the student
-
-**Jess:** Chris, what made you want to learn more about my field?
-
-**Chris:** It was primarily to further my career. Being in network engineering has shown me that being an expert only on networks is not as valuable as it once was, and I have to know a little bit of everything. Since the network is often blamed for outages or application challenges these days, I wanted to understand more from a developer's perspective on writing applications so I could see how they depend on the network as a resource.
-
-**Jess:** What did I teach you first, and what did you learn from it?
-
-**Chris:** It all started with installing Linux for the first time, then adding [Ansible][2]. Each Linux distribution I worked with was easy enough to install, as long as the hardware was compatible, but compatibility wasn't always clear. That meant sometimes I learned first-hand how to troubleshoot Linux within the first five minutes of running an installation (and I liked it). Ansible gave me a reason to learn Linux package managers to install the software. Once it was installed, I quickly learned how package management handles dependencies as I looked at the files that yum installed, so Ansible, which is written in Python, can run on my system. From there, I started to install all kinds of applications with Ansible.
-
-**Jessica:** Do you like the way I taught you?
-
-**Chris:** We had our struggles at first, until we ironed out how I like to learn and how you should present the best way for me to learn. In the beginning, it was hard to follow what you meant. For instance, when you said things like "a Docker container," I had no reference to what you were talking about. Early on, the response was, "well, it's a container," which meant nothing to me at the time. Once I got you to explain it in more detail, it became a lot more fun to learn.
-
-**Jess:** To be fair, this was a big lesson for me as well. I hadn't trained anyone with less knowledge on this technology than me before you, so you helped me realize that I needed to be clearer with my explanations. Thanks for that.
-
-How did you feel about testing my articles, the ones where I had you run through the steps?
-
-**Chris:** Personally, I thought it would be easy, and boy, was I wrong. One of the main things I learned from these, like your [introduction to Vagrant][3], was how each Linux distribution varies more than I realized. The operating system (OS) changes how you set it up, the requirements to run, and the specific commands. It seems like a lot more variability than there is with the network gear I've worked on. So I started to pay a lot more attention to the instructions and whether they were written for my OS or another one (and how difficult it can be to know sometimes). I seemed to break a lot of things along the way.
-
-**Jess:** I break stuff all day, so different paths for different problems are daily occurrences for me.
-
-### Questions for the teacher
-
-**Chris:** Jess, would you change anything with the way you taught me so far?
-
-**Jess:** I'd have liked to make you read more, as I do. Learning new technology has me churning through books. I read a book and a half, if not two books, a week, and that's with spending one hour in the morning and one hour before bed every day. I also pick one project to run through for two weeks for about an hour a day to reinforce the book skills. And that's in addition to the tech articles I read for the first hour of my day while taking in an immense amount of coffee. When I think about your goal to grow your career, I think books are an important element alongside the great blog posts and articles we talk about. I feel my reading regiment has kept me up to speed, and if you did the same, you would catch up to me pretty quickly.
-
-**Chris:** So did the student teach the teacher in any way?
-
-**Jess:** I learned a great deal about being patient from you. For instance, after walking through an installation of Ansible, I asked what you wanted to do next. Your first answer was, "I don't know," which was hard for me because I want you to learn what you want to learn. So I changed my approach, and now we talk more about what you want to achieve before walking through installing anything. When we moved on to the Vagrant article we worked on together, I created it with an end goal in mind, so we had something to achieve right away.
-
-This actually made a massive change in how I do training at work. Now I ask more questions on how people learn and work hand-in-hand more often than I did before. I am more likely to sit and go through and make sure someone understands what I'm saying and what we're doing. I wasn't really before.
-
-### What we learned together
-
-As a couple, we both grew from collaborating on technology over the last year.
-
-**Chris:** I'm blown away at how much I learned. Over the course of a year, I understand new operating systems, how to use an API, web application deployment with Ansible, and standing up virtual machines with Vagrant. I also learned how documentation makes life better, so it's worth the time it takes to write some. In this field of work, however, behavior isn't always documented, so I've learned to be ready to work through tough issues and document how I fix them.
-
-**Jess:** Beyond what I learned from teaching you, I've focused on learning a good deal about Kubernetes in cloud environments. That includes deployment strategies, the complexity of the Kubernetes API, building my own containers, and securing these environments. I've also saved time to dabble: toying around with serverless code, AI models, Python, and graphically displaying heat maps. It's been a good year.
-
-What's next for us? It's yet to be seen, but I can assure you that we're going to share it here on Opensource.com.
-
-**Who did you mentor in 2019, or who are you mentoring in 2020? Tell us about it in the comments.**
-
-I can see the brightness of curiosity in my six year old niece Shuchi's eyes when she explores a...
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/20/2/linux-love-language
-
-作者:[Christopher Cherry][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/chcherry
-[b]: https://github.com/lujun9972
-[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/red-love-heart-alone-stone-path.jpg?itok=O3q1nEVz (Red heart with text "you are not alone")
-[2]: https://opensource.com/resources/what-ansible
-[3]: https://opensource.com/resources/vagrant
diff --git a/sources/talk/20200302 8 reasons to consider hyperconverged infrastructure for your data center.md b/sources/talk/20200302 8 reasons to consider hyperconverged infrastructure for your data center.md
new file mode 100644
index 0000000000..10b1e0575d
--- /dev/null
+++ b/sources/talk/20200302 8 reasons to consider hyperconverged infrastructure for your data center.md
@@ -0,0 +1,113 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (8 reasons to consider hyperconverged infrastructure for your data center)
+[#]: via: (https://www.networkworld.com/article/3530072/eight-reasons-to-consider-hyperconverged-infrastructure-for-your-data-center.html)
+[#]: author: (Andy Patrizio https://www.networkworld.com/author/Andy-Patrizio/)
+
+8 reasons to consider hyperconverged infrastructure for your data center
+======
+
+Thinkstock
+
+Demand for on-premises data center equipment is shrinking as organizations move workloads to the cloud. But on-prem is far from dead, and one segment that’s thriving is hyperconverged infrastructure ([HCI][1]).
+
+HCI is a form of scale-out, software-integrated infrastructure that applies a modular approach to compute, network and storage capacity. Rather than silos with specialized hardware, HCI leverages distributed, horizontal blocks of commodity hardware and delivers a single-pane dashboard for reporting and management. Form factors vary: Enterprises can choose to deploy hardware-agnostic [hyperconvergence software][2] from vendors such as Nutanix and VMware, or an integrated HCI appliance from vendors such as HP Enterprise, Dell, Cisco, and Lenovo.
+
+**Learn more about enterprise infrastructure trends**
+
+ * [Making the right hyperconvergence choice: HCI hardware or software?][3]
+ * [10 of the world's fastest supercomputers][4]
+ * [NVMe over Fabrics creates data-center storage disruption][5]
+ * [For enterprise storage, persistent memory is here to stay][6]
+
+
+
+The market is growing fast. By 2023, Gartner projects 70% of enterprises will be running some form of hyperconverged infrastructure, up from less than 30% in 2019. And as HCI grows in popularity, cloud providers such as Amazon, Google and Microsoft are providing connections to on-prem HCI products for hybrid deployment and management.
+
+So why is it so popular? Here are some of the top reasons.
+
+### 1) Simplified design
+
+A traditional data center design is comprised of separate storage silos with individual tiers of servers and specialized networking spanning the compute and storage silos. This worked in the pre-cloud era, but it’s too rigid for the cloud era. “It’s untenable for IT teams to take weeks or months to provision new infrastructure so the dev team can produce new apps and get to market quickly,” says Greg Smith, vice president of product marketing at Nutanix.
+
+“HCI radically simplifies data center architectures and operations, reducing the time and expense of managing data and delivering apps,” he says.
+
+### 2) Cloud integration
+
+HCI software, such as from Nutanix or VMware, is deployed the same way in both a customer’s data center and cloud instances; it runs on bare metal instances in the cloud exactly the same as it does in a data center. HCI “is the best foundation for companies that want to build a hybrid cloud. They can deploy apps in their data center and meld it with a public cloud,” Smith says.
+
+[][7]
+
+“Because it’s the same on both ends, I can have one team manage an end-to-end hybrid cloud and with confidence that whatever apps run in my private cloud will also run in that public cloud environment,” he adds.
+
+### 3) Ability to start small, grow large
+
+“HCI allows you to consolidate compute, network, and storage into one box, and grow this solution quickly and easily without a lot of downtime,” says Tom Lockhart, IT systems manager with Hastings Prince Edward Public Health in Bellville, Ontario, Canada.
+
+In a legacy approach, multiple pieces of hardware – a server, Fiber Channel switch, host-based adapters, and a hypervisor – have to be installed and configured separately. With hyperconvergence, everything is software-defined. HCI uses the storage in the server, and the software almost entirely auto-configures and detects the hardware, setting up the connections between compute, storage, and networking.
+
+“Once we get in on a workload, [customers] typically have a pretty good experience. A few months later, they try another workload, then another, and they start to extend it out of their data center to remote sites,” says Chad Dunn, vice president of product management for HCI at Dell.
+
+“They can start small and grow incrementally larger but also have a consistent operating model experience, whether they have 1,000 nodes or three nodes per site across 1,000 sites, whether they have 40 terabytes of data or 40 petabytes. They have consistent software updates where they don’t have to retrain their people because it’s the same toolset,” Dunn added.
+
+### 4) Reduced footprint
+
+By starting small, customers find they can reduce their hardware stack to just what they need, rather than overprovision excessive capacity. Moving away from the siloed approach also allows users to eliminate certain hardware.
+
+Josh Goodall, automation engineer with steel fabricator USS-POSCO Industries, says his firm deployed HCI primarily for its ability to do stretched clusters, where the hardware cluster is in two physical locations but linked together. This is primarily for use as a backup, so if one site went down, the other can take over the workload. In the process, though, USS-POSCO got rid of a lot of expensive hardware and software. “We eliminated several CPU [software] licenses, we eliminated the SAN from other site, we didn’t need SRM [site recovery management] software, and we didn’t need Commvault licensing. We saved between $25,000 and $30,000 on annual license renewals,” Goodall says.
+
+### 5) No special skills needed
+
+To run a traditional three-tiered environment, companies need specialists in compute, storage, and networking. With HCI, a company can manage its environment with general technology consultants and staff rather than the more expensive specialists.
+
+“HCI has empowered the storage generalist,” Smith says. “You don’t have to hire a storage expert, a network expert. Everyone has to have infrastructure, but they made the actual maintenance of infrastructure a lot easier than under a typical scenario, where a deep level of expertise is needed to manage under those three skill sets.”
+
+Lockhart of Hastings Prince Edward Public Health says adding new compute/storage/networking is also much faster when compared to traditional infrastructure. “An upgrade to our server cluster was 20 minutes with no down time, versus hours of downtime with an interruption in service using the traditional method,” he says.
+
+“Instead of concentrating on infrastructure, you can expand the amount of time and resources you spend on workloads, which adds value to your business. When you don’t have to worry about infrastructure, you can spend more time on things that add value to your clients,” Lockhart adds.
+
+### 6) Faster disaster recovery
+
+Key elements of hyperconvergence products are their backup, recovery, data protection, and data deduplication capabilities, plus analytics to examine it all. Disaster recovery components are managed from a single dashboard, and HCI monitors not only the on-premises storage but also cloud storage resources. With deduplication, compression rates as high as 55:1, and backups can be done in minutes.
+
+USS-POSCO Industries is an HP Enterprise shop and uses HPE’s SimpliVity HCI software, which includes dedupe, backup, and recovery. Goodall says he gets about 12-15:1 compression on mixed workloads, and that has eliminated the need for third-party backup software.
+
+More importantly, recovery timeframes have dropped. “The best recent example is a Windows update messed up a manufacturing line, and the error wasn’t realized for a few weeks. In about 30 minutes, I rolled through four weeks of backups, updated the system, rebooted and tested a 350GB system. Restoring just one backup would have been a multi-hour process,” Goodall says.
+
+### 7) Hyperconvergence analytics
+
+HCI products come with a considerable amount of analytics software to monitor workloads and find resource constraints. The monitoring software is consolidated into a single dashboard view of system performance, including negatively impacted performance.
+
+Hastings recently had a problem with a Windows 7 migration, but the HCI model made it easy to get performance info. “It showed that workloads, depending on time of day, were running out of memory, and there was excessive CPU queuing and paging,” Lockhart says. “We had the entire [issue] written up in an hour. It was easy to determine where problems lie. It can take a lot longer without that single-pane-of-glass view.”
+
+### 8) Less time managing network, storage resources
+
+Goodall says he used to spend up to 50% of his time dealing with storage issues and backup matrixes. Now he spends maybe 20% of his time dealing with it and most of his time tackling and addressing legacy systems. And his apps are better performing under HCI. “We’ve had no issues with our SQL databases; if anything, we’ve seen huge performance gain due to the move to full SSDs [instead of hard disks] and the data dedupe, reducing reads and writes in the environment.”
+
+Join the Network World communities on [Facebook][8] and [LinkedIn][9] to comment on topics that are top of mind.
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3530072/eight-reasons-to-consider-hyperconverged-infrastructure-for-your-data-center.html
+
+作者:[Andy Patrizio][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/Andy-Patrizio/
+[b]: https://github.com/lujun9972
+[1]: https://www.networkworld.com/article/3207567/what-is-hyperconvergence.html?nsdr=true
+[2]: https://www.networkworld.com/article/3318683/making-the-right-hyperconvergence-choice-hci-hardware-or-software.html
+[3]: https://www.networkworld.com/article/3318683/making-the-right-hyperconvergence-choice-hci-hardware-or-software
+[4]: https://www.networkworld.com/article/3236875/embargo-10-of-the-worlds-fastest-supercomputers.html#slide1
+[5]: https://www.networkworld.com/article/3394296/nvme-over-fabrics-creates-data-center-storage-disruption.html
+[6]: https://www.networkworld.com/article/3398988/for-enterprise-storage-persistent-memory-is-here-to-stay.html
+[7]: https://www.networkworld.com/article/3440100/take-the-intelligent-route-with-consumption-based-storage.html?utm_source=IDG&utm_medium=promotions&utm_campaign=HPE21620&utm_content=sidebar ( Take the Intelligent Route with Consumption-Based Storage)
+[8]: https://www.facebook.com/NetworkWorld/
+[9]: https://www.linkedin.com/company/network-world
diff --git a/sources/talk/20200303 How to assess your organization-s technological maturity.md b/sources/talk/20200303 How to assess your organization-s technological maturity.md
new file mode 100644
index 0000000000..75c3cda6ff
--- /dev/null
+++ b/sources/talk/20200303 How to assess your organization-s technological maturity.md
@@ -0,0 +1,173 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How to assess your organization's technological maturity)
+[#]: via: (https://opensource.com/open-organization/20/3/communication-technology-worksheet)
+[#]: author: (Ron McFarland https://opensource.com/users/ron-mcfarland)
+
+How to assess your organization's technological maturity
+======
+Implementing new communications technologies can make your organization
+more open. Use this worksheet to determine whether your organization—and
+its people—are prepared.
+![Someone wearing a hardhat and carrying code ][1]
+
+New communication technologies can promote and improve [open organizational principles and practices][2]—both within a company and between customers and strategic partners, leading to greater sales and business opportunities.
+
+Previously, I've discussed how companies adopting new communication technologies tend to [fall into four basic categories][3] of investment and utilization. In this article, I'll demonstrate how someone might assess an organization's level of preparedness for technological innovations and the cultural changes it requires.
+
+### Becoming a superstar
+
+For the purpose of this exercise, imagine you're a salesperson working for a company that provides communication or information technology solutions to companies that need advanced information systems and would benefit by becoming "[communication superstars][3]." You'll likely want to impress upon your customers the benefits of becoming this type of user—benefits such as:
+
+ * Enhanced customer interaction: When _our_ customers' salespeople visit _their_ customers, they'll need to make the best impression they can to build some level of trust. Therefore—before offering any product—a salesperson must get a customer talking about his situation in order to discover his particular needs, concerns, and opportunities for growth. When the customer asks the salesperson questions about what he can do to address these issues, imagine our customer's salespeople being able to answer him in seconds with detailed information, instead of making the customer wait for hours, day, or even weeks for the answers. Such technologies can increase one's capacity to make proposals, lead to faster and wiser purchasing decisions, and maximize salesperson-customer interactions—all extremely important benefits.
+ * Better operations: In manufacturing especially, production bottlenecks can be a drain on in-process inventory costs, and alleviating those bottlenecks is critical. Knowing _exactly_ the situation (in-process inventory levels and processing speed, for example) of _every_ stage of a production line in real time can greatly [improve productivity][4].
+ * Development of new business strategies: With new communication technology expertise, a company could open up new markets and opportunities that would have historically been out of its reach.
+
+
+
+### **Let's do some research**
+
+Armed with knowledge of those benefits, again imagine you're a salesperson at an enterprise communication or information technology company. You meet a potential customer at an exhibition or business summit, and she describes the following situation to you:
+
+> "I'm the Operations Manager of a small, local transportation company that makes deliveries within and between several of the surrounding cities. We have a fleet of 30 trucks, all of various sizes and makes. I know the company's information system must to be improved; much of our communication is done through email attachments, texting, and mobile phone calls. We have no central information operating system."
+
+A large, public, national trucking company has set up in her area. She's studied this competitor and read several of its news releases and annual reports. She's learned the company has a centralized communications system, and that all its trucks have tracking technologies that monitor the location of every truck in operation. Trucks also feature sensors that monitor many vehicle operations, including average and specific engine RPM per route by vehicle and driver, and miles travelled in particular conditions (to determine fuel economy and maintenance schedules). An electronic parts delivery system connects this company's service operations with a network of dealers to reduce the time service technicians must wait for parts.
+
+This is what the small local trucking company must compete against. So its operations manager asks you, the IT company salesperson, what you can do to help.
+
+You decide that your first step is to conduct a survey to learn more about both the company's current communication technology system and the personnel's attitude toward this system in order to see what _could_ and _should_ be done to improve the situation. While there, you want to learn this trucking company's IT status _before_ making any recommendations.
+
+I've created a worksheet you might use to facilitate this conversation.
+
+### Taking the temperature
+
+The first part of the worksheet can help you develop a baseline assessment of an organization's readiness for technological change.
+
+#### Part 1: Baseline maturity relative to competitors
+
+Generally, if the customer scores between 10 and 42, then that customer needs more assistance adopting new communication technology, but this varies by industry. If the score is between 43 and 70, then (when compared to competitors the customer is likely already mature in its use of communication technologies.
+
+#### Part 2: Leaders' relationship to communication technologies
+
+Next, you need to assess the company leadership's relationship to technologies, associated processes, and cultural changes. So let's make those calculations in Part 2 of the worksheet.
+
+Here again, depending on the competitive environment, if the score is between 10 and 42, then the company is generally _not_ completely utilizing the communication technology it has. If the score is between 43 and 70, then generally the company puts the communication technology it has to good, creative use.
+
+Organizational leaders must lead the conversation about using more advanced communication systems in the organization. Therefore management must establish training programs to teach everyone in the organization the skills required to _use_ that technology (a step often forgotten or poorly implemented).
+
+#### Part 3: Awareness of challenges and opportunities
+
+We now need to help the organization think more strategically about its use of communication technologies to implement open processes and open culture. We'll do this with Part 3 of the worksheet.
+
+If an organization scores higher than 15, the company understands the communication technology landscape fairly well. If the score is between 9 and 15, the organization needs to isolate its weakest areas and remedy them. A score of less than 9 indicates that the organization should consider conducting new awareness exercises and/or communication technology discovery programs.
+
+#### Part 4: Technological mastery relative to competitors
+
+Next, we need to better understand the trucking company's current strategic assets and its level of technological mastery relative to competitors. We'll do that with Part 4 of the worksheet.
+
+An organization that scores above 16 in this section likely knows where it stands and what its innovation trajectory is in comparison to competitors. A score of 7 to 16 means the organization needs to build alignment around a viable renewal path. A score of less than 7 might mean the organization should conduct a communication technology maturity assessment and update its best practices.
+
+#### Part 5: Ability to articulate technological vision
+
+Now let's explore how well the organization's senior leaders can articulate a vision for the role communication technology will play in the company's future. That's Part 5 of the worksheet.
+
+If the organization scores over 24, then its members likely believe its executives are aligned on a technological vision (and are considering competitors). A score of 14 to 24 should prompt us to isolate the root causes of the concerns and work with the team to remedy them. Anything less than 14 should spur a structured senior executive alignment initiative.
+
+Questions like these can clarify the extent to which employees must be involved in communication technology investment decision-making and utilization. Front-line members typically know what's necessary, what's available, and what the organization should introduce.
+
+### From vision to action
+
+I've seen first-hand that in situations like these, purchasing technologies is only half the problem. Getting people to buy into the system and use it to full capacity are far bigger challenges.
+
+In this section, we'll assess the organization's ability to translate technological vision into action.
+
+#### Part 6: Ability to translate vision to action
+
+First, let's see how the company is currently converting its vision into an action plan relative to competitors. We'll return to the worksheet, specifically Part 6.
+
+A company scoring more than 17 points likely has a robust plan and evaluation system in place, and is focused on engaging people in executing technological adoption efforts relative to competitors. Organizations scoring 7 to 17 should review the action plan and milestone checklist weekly for content and alignment. Those scoring less than 7 should conduct a full review of its milestone checklist and action plan processes.
+
+#### Part 7: Supervision strategies
+
+Few plans succeed without proper supervision, so you'll want to assess the organization's plans to oversee change management efforts. We'll use the trusty worksheet—this time, Part 7.
+
+Did the company score something greater than 15? Then its supervision model is in good shape. Maybe 8 to 15? It should check its governance principles and/or program leadership. Less than 8? Time to rework (or design for the first time) its supervision principles.
+
+#### Part 8: Funding strategy for implementation
+
+Of course, organizational initiatives like these require funding. So you'll want to assess the organization's financial commitment to technological change. Once again, let's use our worksheet (Part 8 this time).
+
+Scoring more than 16 points means the company's funding for new communication technologies is strong. Scoring 8 to 16 means the company should work to ensure that the company portfolio, funding, and business strategy are better aligned. Anything less than 8 means company needs to rework its investment and funding strategy for new technologies.
+
+#### Part 9: Clarity and promotion of vision
+
+Organizational leaders should constantly be clarifying and advocating plans to adopt new technologies. How are they doing? Let's review Part 9 of our worksheet.
+
+If the company scores over 17, then it's likely doing a good job of marketing its ambitions. If it scores somewhere between 7 and 17, it should isolate dimensions of its messaging that need refinement and work with the team to remedy them. If it scores less than 7, it should consider developing a specific program to convey the company's ambition more broadly.
+
+#### Part 10: Ability to build and sustain engagement
+
+Changes to technological systems and processes don't happen automatically. People need to invest in them, and leaders need to sustain their engagement in the organizational changes. Not everyone will buy in (as I've [written previously][5]). We can assess how well the organization is doing this with Part 10 of the worksheet.
+
+A score over 23 indicates that the company is doing a good job building momentum while introducing communication technologies. A score of 12 to 23 means that organization might need to isolate some part of the process that's not proceeding satisfactorily and remedy that component. Less than 12? The company needs to design and conduct a full engagement program.
+
+### Organizational considerations
+
+This final section assesses specific _organizational_ capacities—that is, the organization's culture, its structure, and its processes. Becoming more open by adopting new communication technologies is only possible if the organization itself is flexible and willing to change.
+
+#### Part 11: Organizational culture
+
+Is the organizational environment amenable to the kinds of changes necessary for effectively adopting new communication activities? We'll assess that in Part 11 of our worksheet.
+
+An organization scoring more than 16 points is already shifting its organizational behaviors and culture ahead of competitors. One scoring between 7 and 16 points should investigate root causes of concerns about cultural changes and work with the team to remedy problems. An organization scoring less than 7 should begin working to shift its culture around communication practices and expectations.
+
+#### Part 12: Organizational structure
+
+Does the organization's current structure allow it to sustain communication technology innovations? Use Part 12 of the worksheet to gather an initial impression.
+
+Scoring over 16 means the company possesses the basic structural capabilities necessary for sustained, steady, technical changes. Scoring between 8 and 16 means the company has only begun implementing projects aimed at developing necessary structural capabilities, but more effort is needed. And a score of less than 8 indicates that the company needs to consider specific programs for improving basic structural capabilities.
+
+#### Part 13: Reward and incentive structures
+
+Are the organization's reward and incentive structures aligned with the organization's goals for introducing and adopting new communication technologies? Let's look at the worksheet one last time.
+
+A score over 14 indicates that the company's current reward structures are aligned with its communication technology objectives. A score between 6 and 14 tells us that the organization should build stronger consensus around a viable reward strategy aligned to communication technology renewal. And a score of less than 6 should prompt leadership to implement specific reward structures that accomplish its communication technology adoption goals.
+
+### Post-survey debrief
+
+After collecting those data, you're now in a position to ask how your information technology company can help your potential customer in four areas:
+
+ 1. Data gathering and company strategy analytics
+ 2. Social media, internet utilization, and interaction internally
+ 3. Telecommunication utilization within company (to avoid excess and unnecessary traveling for meetings, etc.)
+ 4. Automation technology utilization within the company
+
+
+
+You're also able to inquire within your company (among solution architects, for example) who we potentially should partner with if need be in order to achieve this transportation company's goals in these four areas."
+
+In these kinds of strategic partnerships, open organization principles—especially transparency, inclusivity, collaboration, and community—come alive. One person cannot do this kind of work alone.
+
+I've seen first-hand that in situations like these, purchasing technologies is only _half the problem._ Getting people to _buy into the system_ and _use it to full capacity_ are far bigger challenges. These challenges are cultural, not technological. Being a "communication superstar" means being great in both those areas—both the communication technology itself, as well as the culture and process expertise necesasry for actual utilization.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/open-organization/20/3/communication-technology-worksheet
+
+作者:[Ron McFarland][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/ron-mcfarland
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/build_structure_tech_program_code_construction.png?itok=nVsiLuag (Someone wearing a hardhat and carrying code )
+[2]: https://opensource.com/open-organization/resources/open-org-definition
+[3]: https://opensource.com/open-organization/20/1/communication-technology-superstars
+[4]: https://www.slideshare.net/RonMcFarland1/improving-processes-65115172?qid=b0a0fde3-62c6-4538-88c8-1bfd70485cee&v=&b=&from_search=5
+[5]: https://opensource.com/open-organization/17/1/escape-the-cave
diff --git a/sources/talk/20200303 Key Takeaways from Cisco-s Annual Internet Report.md b/sources/talk/20200303 Key Takeaways from Cisco-s Annual Internet Report.md
new file mode 100644
index 0000000000..d450597913
--- /dev/null
+++ b/sources/talk/20200303 Key Takeaways from Cisco-s Annual Internet Report.md
@@ -0,0 +1,78 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Key Takeaways from Cisco’s Annual Internet Report)
+[#]: via: (https://www.networkworld.com/article/3529989/key-takeaways-from-cisco-s-annual-internet-report.html)
+[#]: author: (Zeus Kerravala https://www.networkworld.com/author/Zeus-Kerravala/)
+
+Key Takeaways from Cisco’s Annual Internet Report
+======
+Businesses need to be ready for the massive wave of devices and bandwidth that are coming in the next vide years
+Natalya Burova / Getty Images
+
+By 2023, two-thirds of the world’s population will have Internet access—that’s 5.3 billion total Internet users, compared to 3.9 billion in 2018. The number of devices and connections will also skyrocket. There will be 3.6 networked devices per capita by 2023, whereas in 2018, there were 2.4 networked devices per capita.
+
+These findings come from Cisco’s _[Annual Internet Report (2018 – 2023) ][1]_(AIR) - previously known as Visual Network Index (VNI), which assesses the digital transformation across different business segments and their adoption of networking technologies, including fixed broadband, Wi-Fi, and mobile (3G, 4G, 5G).
+
+[[Get regularly scheduled insights by signing up for Network World newsletters.]][2]
+
+The report described an increased demand for new or enhanced applications that boost workforce productivity or improve customer experiences. In today’s mobile world, users expect their devices (and networks) to deliver on all fronts: quality, ease of use, and seamless connectivity.
+
+[Cisco][3]
+
+The report can be useful as companies plan out their network strategies. One of the aspects of the VNI that Cisco carried over to AIR is an [online tool][4] that lets people slice and dice the information by country, device or other factors. They also included an [“Internet readiness” tool ][5]that explores how prepared different regions are for the coming wave of devices and need for bandwidth.
+
+**More network automation is needed**
+
+To meet growing demand for enhanced apps, enterprises need automated network monitoring and optimization, andt that can be achieved with software-defined wide area networking (SD-WAN). Software-driven networks create more flexible infrastructures that can adapt to changing traffic requirements, which becomes necessary as more enterprises move to hybrid clouds, the report says.
+
+Policy-based automation and Intent-Based Networking (IBN) are just as important when it comes to building agile, portable, and scalable networks. IBN, as the name implies, captures business intent through analytics and machine learning. One trend Cisco observed in its report is how business WAN traffic flow patterns are becoming more software-based and hybrid in nature, creating a need for IBN solutions, the report says.
+
+[][6]
+
+**SD-WAN is core to network success**
+
+SD-WAN is important to the network edge, which brings computing, storage, and networking resources closer to users and devices. Cisco found many use cases driving the need for greater edge-computing capabilities. One of them is finding ways to control data from the billions of Internet of Things (IoT) endpoints being added to the network edge.
+
+Out of the 29.3 billion networked devices in use by 2023, about half will support various IoT applications, per Cisco’s report. As for machine-to-machine (M2M) communication, there will be 14.7 billion connections by 2023. Consumers will hold the biggest share (74%) of total devices and connections, with businesses claiming approximately 26%. However, the consumer share will grow at a slower rate than business.
+
+How will enterprises manage to secure all networked devices and data? Cisco recommends creating a security policy that strikes a balance between data protection and ease of use. In other words, networks will have to be intelligent enough to grant access to the right users without putting them through a difficult authentication process.
+
+**Network managers still struggle to lower operational costs**
+
+Network managers continue to struggle with rising operational costs, as the explosion of devices and data outpaces IT resources. Cisco found nearly 95% of network changes are still performed manually, resulting in operational costs that outweigh network costs. That’s where IT automation can help, enabled by SDN, intelligent network-edge enhancements, and unified domain controls.
+
+In addition to exploring business-specific networking needs, Cisco outlined some trends in consumer and small-to-medium business (SMB) markets. Here are the key takeaways:
+
+ * **Next-generation applications**—built with artificial intelligence (AI) and machine learning—will create complex requirements and new business models. Mobile applications, specifically, will drive future consumer, SMB, and enterprise needs, with 299.1 billion mobile apps downloaded worldwide by 2023.
+ * **Mixed devices and connections** are enabling myriad M2M apps. Connected-home, video-surveillance, connected appliances, and tracking apps will make up 48% of M2M connections by 2023. Connected-car apps will be the fastest-growing category, with connected cities coming in second.
+ * **Accelerating broadband speeds** will affect traffic growth and use of high-bandwidth content and applications. Average broadband speeds will more than double globally from 45.9 Mbps (in 2018) to 110.4 Mbps (in 2023). Fiber-to-the-home (FTTH), high-speed DSL, and cable broadband adoption will contribute to the growth.
+ * **Wi-Fi will gain momentum** as devices and IoT connections increase. By 2023, the number of public Wi-Fi hotspots will grow to 628 million, up from 169 million in 2018. Wi-Fi 6 promises to boost speeds by up to 30%, compared to the current generation. More importantly, next-gen Wi-Fi will significantly improve real-time communications and high-definition video, impacting both consumer and business sectors.
+
+
+
+Join the Network World communities on [Facebook][7] and [LinkedIn][8] to comment on topics that are top of mind.
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3529989/key-takeaways-from-cisco-s-annual-internet-report.html
+
+作者:[Zeus Kerravala][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/Zeus-Kerravala/
+[b]: https://github.com/lujun9972
+[1]: http://www.cisco.com/go/ciscoair
+[2]: https://www.networkworld.com/newsletters/signup.html
+[3]: https://www.cisco.com/c/en/us/solutions/collateral/executive-perspectives/annual-internet-report/white-paper-c11-741490.html
+[4]: https://www.cisco.com/c/en/us/solutions/executive-perspectives/annual-internet-report/air-highlights.html
+[5]: https://www.cisco.com/c/en/us/solutions/service-provider/cloud-readiness-tool/index.html
+[6]: https://www.networkworld.com/article/3440100/take-the-intelligent-route-with-consumption-based-storage.html?utm_source=IDG&utm_medium=promotions&utm_campaign=HPE21620&utm_content=sidebar ( Take the Intelligent Route with Consumption-Based Storage)
+[7]: https://www.facebook.com/NetworkWorld/
+[8]: https://www.linkedin.com/company/network-world
diff --git a/sources/talk/20200303 Most-used libraries, open source adoption, and more industry trends.md b/sources/talk/20200303 Most-used libraries, open source adoption, and more industry trends.md
new file mode 100644
index 0000000000..769f4f550e
--- /dev/null
+++ b/sources/talk/20200303 Most-used libraries, open source adoption, and more industry trends.md
@@ -0,0 +1,61 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Most-used libraries, open source adoption, and more industry trends)
+[#]: via: (https://opensource.com/article/20/3/libraries-5G-more-industry-trends)
+[#]: author: (Tim Hildred https://opensource.com/users/thildred)
+
+Most-used libraries, open source adoption, and more industry trends
+======
+A weekly look at open source community and industry trends.
+![Person standing in front of a giant computer screen with numbers, data][1]
+
+As part of my role as a senior product marketing manager at an enterprise software company with an open source development model, I publish a regular update about open source community, market, and industry trends for product marketers, managers, and other influencers. Here are five of my and their favorite articles from that update.
+
+## [Most-used libraries revealed – plus 10 things developers should be doing to keep their code secure][2]
+
+> “The report begins to give us an inventory of the most important shared software and potential vulnerabilities and is the first step to understand more about these projects so that we can create tools and standards that results in trust and transparency in software," explained Jim Zemlin, executive director at the Linux Foundation, in a statement.
+
+**The impact**: Importantly, there is also a great list of packages for backdoors here.
+
+## [Survey: Open source adoption, quality gains][3]
+
+> Overall, the survey finds there has been [a marked shift away from proprietary software][4]. Only 42% said that more than half of the software they use today is proprietary, down from 55% a year ago. Two years from now only 32% said they expect proprietary software to account for more than half their portfolio. On average, respondents said 36% of their organization’s software is open source, which in two years is expected to increase to 44% in two years. A total of 77% said they would increase usage of open source software over the next 12 months.
+
+**The impact**: There is a clear virtuous cycle of companies getting more comfortable with open source and more open source software being created. If there isn't already, there will be a rule 34 about open source software.
+
+## [5G must go cloud-native from edge to core][5]
+
+> A containerised core will be the heart of cloud-native 5G networks. Managing and scaling networking apps in containers using a modular microservices approach will help service providers to dynamically orchestrate and grow service capacity across a distributed architecture.
+
+**The impact**: When you're building something complicated and reliable, you really can't look past starting with open source software. Unless you want to be in a foot race against "a Kawasaki" (that's a motorbike, right?).
+
+## [High-performance object storage, Kubernetes, + why you can't containerize a storage appliance][6]
+
+> True multi-tenancy isn’t possible unless the storage system is extremely lightweight and able to be packaged with the application stack. If the storage system takes too many resources or contains too many APIs, it won’t be possible to pack many tenants on the same infrastructure.
+
+**The impact**: The title of this post is a challenge to someone much more skilled and knowledgable than I.
+
+_I hope you enjoyed this list and come back next week for more open source community, market, and industry trends._
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/libraries-5G-more-industry-trends
+
+作者:[Tim Hildred][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/thildred
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/data_metrics_analytics_desktop_laptop.png?itok=9QXd7AUr (Person standing in front of a giant computer screen with numbers, data)
+[2]: https://www.theregister.co.uk/2020/02/20/linux_foundation_report/
+[3]: https://devops.com/surevey-sees-open-source-adoption-quality-gains/
+[4]: https://devops.com/devops-deeper-dive-devops-accelerates-open-source-innovation-pace/
+[5]: https://www.5gradar.com/features/5g-must-go-cloud-native-from-edge-to-core
+[6]: https://blog.min.io/high-performance-object-storage-with-kubernetes/
diff --git a/sources/talk/20200304 Seawater, humidity inspire new ways to generate power.md b/sources/talk/20200304 Seawater, humidity inspire new ways to generate power.md
new file mode 100644
index 0000000000..7e2dc5927f
--- /dev/null
+++ b/sources/talk/20200304 Seawater, humidity inspire new ways to generate power.md
@@ -0,0 +1,79 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Seawater, humidity inspire new ways to generate power)
+[#]: via: (https://www.networkworld.com/article/3529893/seawater-humidity-inspire-new-ways-to-generate-power.html)
+[#]: author: (Patrick Nelson https://www.networkworld.com/author/Patrick-Nelson/)
+
+Seawater, humidity inspire new ways to generate power
+======
+Researchers around the globe are working on new ways to generate huge amounts of power that will be needed for the shift to a data-driven society.
+Getty Imags
+
+The possiblity of a future power-availability crunch – spurred in part by a global increase in data usage – is driving researchers to get creative with a slew of new and modified ways to generate and store energy.
+
+Ongoing projects include the use of seawater for batteries; grabbing ambient humidity; massive water storage systems for hydropower; and solar panels that work at night. Here are some details:
+
+### Batteries based on seawater
+
+Seawater will provide "super-batteries," says the University of Southern Denmark. Researchers there have been studying how to use sodium, which is abundant in seawater, as an alternative to lithium in batteries.
+
+[[Get regularly scheduled insights by signing up for Network World newsletters.]][1]
+
+"Sodium is a very readily available resource," the school says in a [press release][2], and it can be easily extracted from seawater. Lithium, on the other hand, is a limited resource that's mined only in a few places in the world, says research leader Dorthe Bomholdt Ravnsbæk of the department of physics, chemistry and pharmacy at the university. Batteries based on seawater would also alleviate the need for cobalt, which is used in lithium cells. The team in Denmark (working with Massachusetts Institute of Technology) believes it has come up with a new electrode material, based on manganese, that will make the seawater battery ultimately viable.
+
+### Using ambient moisture to generate power
+
+Humidity captured with bio-electronics could end up being a viable power source for sensors, say some scientists.
+
+"Harvesting energy from the environment offers the promise of clean power for self-sustained systems," notes University of Massachusetts researchers [in an article published in Nature][3]. However, known technologies often have restrictive environmental requirements – solar panels that must be mounted outside, for example – that limit their energy-producing potential.
+
+Moisture harvesting with thin-film, protein nanowires doesn't have restrictive environmental requirements. Sustained voltages of about half a volt can be obtained from moisture present in normal, ambient air. "Connecting several devices linearly scales up the voltage and current to power electronics," the Amherst group claims. "Our results demonstrate the feasibility of a continuous energy-harvesting strategy that is less restricted by location or environmental conditions than other sustainable approaches."
+
+[][4]
+
+### Seasonally pumped hydropower storage
+
+On a larger scale, inland water storage could solve renewable power issues, say scientists at the International Institute for Applied Systems Analysis.
+
+One big problem collecting power from the environment, as opposed to using fossil fuels, is where to store the on-the-fly electricity being generated. The Austrian organization believes that hydropower systems should be used to contain renewable energy. It's cheap, for starters. In addition, seasonal pumped hydropower storage (SPHS) is better than wind or solar, the group claims, because it not only generates the power in real time as it’s needed, but also isn't affected by variations— a windy day isn't required, for example.
+
+SPHS operates by pumping water into dammed, river-adjacent reservoirs when water flow is high but power demand is low. Water is then allowed to flow out of the reservoir, through turbines—similar to hydroelectric—when energy demand increases. Electricity is thus created. The group, in a [press release][5] related to a study just released, says the technique is highly economical, even including required land purchases, excavation and tunneling.
+
+### Nighttime, anti-solar cells
+
+Contrary to popular belief, photovoltaic solar panels don't actually need full sun to function. Cloud cover allows some to work just fine, just not as well. Nighttime photovoltaic, however, is something more radical:
+
+The earth should be used as a heat source, and the night sky a heat sink, say Jeremy Munday and Tristan Deppe of the department of electrical and computer engineering at University of California, Davis. They shared their idea for nighttime photovoltaic cells in an [abstract of a paper][6] published by American Chemical Society's ACS Photonics.
+
+What they are suggesting is using thermoradiative photovoltaics, where deep space radiative cooling ([which I’ve written about before][7]) is combined with photovoltaics. Current is created as infrared light – or heat, in other words – is radiated into extremely cold, deep space.
+
+"Similar to the way a normal solar cell works, but in reverse," Munday says of their anti-solar panel concept, quoted in a [UC Davis news article][8].
+
+Join the Network World communities on [Facebook][9] and [LinkedIn][10] to comment on topics that are top of mind.
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3529893/seawater-humidity-inspire-new-ways-to-generate-power.html
+
+作者:[Patrick Nelson][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/Patrick-Nelson/
+[b]: https://github.com/lujun9972
+[1]: https://www.networkworld.com/newsletters/signup.html
+[2]: https://www.sdu.dk/en/nyheder/Forskningsnyheder/skal_fremtidens_superbatterier_laves_af_havvand
+[3]: https://www.nature.com/articles/s41586-020-2010-9
+[4]: https://www.networkworld.com/article/3440100/take-the-intelligent-route-with-consumption-based-storage.html?utm_source=IDG&utm_medium=promotions&utm_campaign=HPE21620&utm_content=sidebar ( Take the Intelligent Route with Consumption-Based Storage)
+[5]: https://iiasa.ac.at/web/home/about/news/200219-seasonal-pumped-storage.html
+[6]: https://pubs.acs.org/toc/apchd5/7/1
+[7]: https://www.networkworld.com/article/3222850/space-radiated-cooling-cuts-power-use-21.html
+[8]: https://www.ucdavis.edu/news/anti-solar-cells-photovoltaic-cell-works-night
+[9]: https://www.facebook.com/NetworkWorld/
+[10]: https://www.linkedin.com/company/network-world
diff --git a/sources/talk/20200305 Chinese auto giant Geely plans a private satellite network to support autonomous vehicles.md b/sources/talk/20200305 Chinese auto giant Geely plans a private satellite network to support autonomous vehicles.md
new file mode 100644
index 0000000000..8bf990573e
--- /dev/null
+++ b/sources/talk/20200305 Chinese auto giant Geely plans a private satellite network to support autonomous vehicles.md
@@ -0,0 +1,61 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Chinese auto giant Geely plans a private satellite network to support autonomous vehicles)
+[#]: via: (https://www.networkworld.com/article/3530336/chinese-auto-giant-geely-plans-a-private-satellite-network-to-support-autonomous-vehicles.html)
+[#]: author: (Patrick Nelson https://www.networkworld.com/author/Patrick-Nelson/)
+
+Chinese auto giant Geely plans a private satellite network to support autonomous vehicles
+======
+Geely is developing a satellite network to provide high-bandwidth wireless needed by on-board applications in self-driving vehicles.
+Olivier Le Moal / Getty Images
+
+What does a large automaker that’s morphing into a mobile-technology company and heavily investing in autonomous vehicles need to add to its ecosystem? Probably connectivity, and that’s likely why Chinese car giant Geely says it will be building its own satellite data network.
+
+A need for “highly accurate, autonomous driving solutions,” is part of what’s driving the strategy, the company says in a [press release][1]. Geely – the largest car maker in China and whose assets include Volvo and a stake in Lotus – has begun building a test facility in Taizhou City where it will develop satellite models, the company says.
+
+[[Get regularly scheduled insights by signing up for Network World newsletters.]][2]
+
+“The creation of a truly smart, three-dimensional mobility ecosystem,” as the company describes its Geespace project, will include precise navigation, cloud computing and high-speed Internet functions. Geely is investing $326 million in the project [according to Reuters][3], citing a statement from the company.
+
+Over-the-air updating of vehicle software is a principal reason data networks will become prevalent in automobile technology. Historically, car companies haven’t worried much about the speedy updating of end-user’s systems, in part because they’ve liked getting customers back into the dealership to upsell service options and pitch new cars. A leisurely software patch while the customer hangs around drinking warm coffee and watching daytime soaps suits that purpose. However, autonomous cars are a different story: The safety of self-driving cars can’t tolerate software vulnerabilities.
+
+Control over vehicle positioning also comes into play. Knowing where the car is and where obstacles are is more important than in traditional vehicles. Lane-change and accident avoidance, for example, are autonomous-vehicle features that require high levels of accuracy.
+
+“The Geespace low-orbit satellite network will offer much higher centimeter-accurate precision,” Geely says, comparing its proposed constellation with the U.S. government-owned Global Positioning System.
+
+Data processing, artificial intelligence and infotainment onboard the vehicles all need fat networks, too. Former Intel CEO Brian Krzanich [said at a talk I attended a few years ago][4] that he thought cars would soon create 4,000 GB of data per hour of driving because of the number of sensors, such as cameras, that they’ll be equipped with.
+
+[][5]
+
+The Geely private satellite network is the first of its kind for an industrial use and joins [a trend in private wireless networking][6]. Private, terrestrial 5G networks and private LTE networks allow companies to control their own data and uptime, rather than relying on service providers. Mercedes-Benz is reportedly working on a private 5G network for privacy and security.
+
+“As vehicles become more connected and integrated into the Internet of Things ecosystem, the demand for data has grown exponentially,” Geely says.
+
+Geely will begin launching the Geespace satellites by the end of 2020.
+
+Join the Network World communities on [Facebook][7] and [LinkedIn][8] to comment on topics that are top of mind.
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3530336/chinese-auto-giant-geely-plans-a-private-satellite-network-to-support-autonomous-vehicles.html
+
+作者:[Patrick Nelson][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/Patrick-Nelson/
+[b]: https://github.com/lujun9972
+[1]: http://zgh.com/media-center/news/2020-03-03-1/?lang=en
+[2]: https://www.networkworld.com/newsletters/signup.html
+[3]: https://www.reuters.com/article/geely-china-satellite-autonomous/chinas-geely-invests-326-mln-to-build-satellites-for-autonomous-cars-idUSL4N2AV45H
+[4]: https://www.networkworld.com/article/3147892/one-autonomous-car-will-use-4000-gb-of-dataday.html
+[5]: https://www.networkworld.com/article/3440100/take-the-intelligent-route-with-consumption-based-storage.html?utm_source=IDG&utm_medium=promotions&utm_campaign=HPE21620&utm_content=sidebar ( Take the Intelligent Route with Consumption-Based Storage)
+[6]: https://www.networkworld.com/article/3319176/private-5g-networks-are-coming.html
+[7]: https://www.facebook.com/NetworkWorld/
+[8]: https://www.linkedin.com/company/network-world
diff --git a/sources/talk/20200305 Report- Most IoT transactions are not secure.md b/sources/talk/20200305 Report- Most IoT transactions are not secure.md
new file mode 100644
index 0000000000..96a2add2d7
--- /dev/null
+++ b/sources/talk/20200305 Report- Most IoT transactions are not secure.md
@@ -0,0 +1,61 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Report: Most IoT transactions are not secure)
+[#]: via: (https://www.networkworld.com/article/3530476/report-most-iot-transactions-are-not-secure.html)
+[#]: author: (Andy Patrizio https://www.networkworld.com/author/Andy-Patrizio/)
+
+Report: Most IoT transactions are not secure
+======
+Data gathered by security provider Zscaler shows that not only are most internet-of-things transactions unsecured, they are also unauthorized as IoT creeps in as shadow-IT devices.
+Iot
+
+The majority of [Internet of Things (IoT)][1] transactions don’t use even basic security, and there is a great deal of unauthorized IoT taking place inside the perimeter of enterprise firewalls thanks to shadow IT, a new study finds.
+
+Security vendor Zscaler analyzed nearly 500 million IoT transactions from more than 2,000 organizations over a two-week period. [The survey][2] found 553 different IoT devices from more than 200 different manufacturers, many of which had their security turned off.
+
+[[Get regularly scheduled insights by signing up for Network World newsletters.]][3]
+
+The study was done on Zscaler’s own Internet Access security service. It found the rate of IoT growth to be explosive: When it first started monitoring IoT traffic in May 2019, IoT traffic generated by its enterprise customer base was 56 million IoT transactions per month. By February 2020, that number had soared to 33 million transactions _per day_, or one billion IoT transactions per month, a 1,500% increase.
+
+Zscaler is a bit generous in what it defines as enterprise IoT devices, from devices such as data-collection terminals, digital signage media players, industrial control devices, medical devices, to decidedly non-business devices like digital home assistants, TV set-top boxes, IP cameras, smart home devices, smart TVs, smart watches and even automotive multimedia systems.
+
+“What this tells us is that employees inside the office might be checking their nanny cam over the corporate network. Or using their Apple Watch to look at email. Or working from home, connected to the enterprise network, and periodically checking the home security system or accessing media devices,” the company said in its report.
+
+Which is typical, to be honest, and let (s)he who is without sin cast the first stone in that regard. What’s troubling is that roughly 83% of IoT-based transactions are happening over plaintext channels, while only 17% are using [SSL][4]. The use of plaintext is risky, opening traffic to packet sniffing, eavesdropping, man-in-the-middle attacks and other exploits.
+
+And there are a lot of exploits. Zscaler said it detects about 14,000 IoT-based malware exploits per month, a seven-fold increase over the previous year.
+
+“Folks can keep their smart watches, smart closets, and whatever else they think is making them smart. Banning devices is not going to be the answer here. The answer is changing up the narrative on how we think about IoT devices from a security and risk standpoint, and what expectations we put on manufacturers to increase the security posture of these devices,” wrote Deepen Desai, Zscaler’s vice president of security research in a [blog post][5].
+
+Desai said the solution is “taking a [zero-trust][6] mentality.” It may be a buzzword but, “it’s about security people not trusting any person or device to touch the network—that is, until you know who the user is, what the device is, and whether that user and device are allowed to access the applications they’re trying to reach.”
+
+Naturally Zscaler sells such a solution, but he makes a valid point. This is an ages-old problem I have seen time and again; a hot new technology comes along, everyone rushes to embrace it, then they think about securing it later. IoT is no different.
+
+Whatever your device, at least go into the settings and turn on SSL.
+
+Join the Network World communities on [Facebook][7] and [LinkedIn][8] to comment on topics that are top of mind.
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3530476/report-most-iot-transactions-are-not-secure.html
+
+作者:[Andy Patrizio][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/Andy-Patrizio/
+[b]: https://github.com/lujun9972
+[1]: https://www.networkworld.com/article/3207535/what-is-iot-the-internet-of-things-explained.html
+[2]: https://info.zscaler.com/resources-industry-iot-in-the-enterprise
+[3]: https://www.networkworld.com/newsletters/signup.html
+[4]: https://www.networkworld.com/article/2303073/lan-wan-what-is-transport-layer-security-protocol.html
+[5]: https://www.zscaler.com/blogs/corporate/shining-light-shadow-iot-protect-your-organization
+[6]: https://www.networkworld.com/article/3487720/the-vpn-is-dying-long-live-zero-trust.html
+[7]: https://www.facebook.com/NetworkWorld/
+[8]: https://www.linkedin.com/company/network-world
diff --git a/sources/talk/20200306 How I learned about burnout the hard way.md b/sources/talk/20200306 How I learned about burnout the hard way.md
new file mode 100644
index 0000000000..cce3324e7e
--- /dev/null
+++ b/sources/talk/20200306 How I learned about burnout the hard way.md
@@ -0,0 +1,111 @@
+[#]: collector: (lujun9972)
+[#]: translator: (chuan-325)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How I learned about burnout the hard way)
+[#]: via: (https://opensource.com/article/20/3/burnout)
+[#]: author: (Jason Hibbets https://opensource.com/users/jhibbets)
+
+How I learned about burnout the hard way
+======
+Burnout can happen to anyone. Here are the 3 things I wish I knew before
+I burned out.
+![Light bulb][1]
+
+In early 2017, I was mentally in a bad spot. It was the perfect storm of stress, the kind that no one asks for, but you deal with the hand you're dealt. Work was piling up to a point where I couldn't process all the things that were expected of me. I was training for spring half-marathons, which should have been stress relief, but I was putting too much pressure on myself to perform at a high level. And then on top of the everyday family obligations, a surgery in our household turned us into a one-car family and seriously added to the mounting pressure on me to provide and take care of the family.
+
+Then I broke.
+
+It wasn't one thing. It was the culmination of things. And it hit me from the blind side, unexpected. I never thought I would be a victim of burnout. I was aware of it and thoughtful about the community I was managing. But "not me," I thought to myself, "I've got this under control." I remember thinking that something was wrong; something was off. But I couldn't quite put my finger on the source.
+
+I distinctly remember the day where I cried at work, crumbling under the pressure that I was putting on myself. I consider myself a high performer in the office environment. I push myself to exceed the goals that my team co-creates because I want that success. I want the feeling that comes with it. But this experience was different. This wasn't a healthy win for my team or me. I felt like I let everyone down, including myself.
+
+I was attending South by Southwest in Austin, Texas, where I was [presenting my first Ignite Talk][2] on applying open source principles to government—a talk that was well received by the audience. I remember practicing, and practicing, and practicing more the day before and the morning of my talk. I got that high that comes after delivering a great talk. I had a book signing at the City of Raleigh's Economic Development booth during the event, which was another emotional boost. Life was good. Upon reflection, that's when I started noticing signs of my burnout.
+
+I didn't have much of an appetite. I was tired all the time. I was sleeping in, and not because of jet lag. I was exercising but wasn't getting the endorphins I was used to. And I wasn't motivated to do the work that I normally love to do. I was very blah and meh about getting work done or hanging out with people I love. These are all signs of depression and burnout.
+
+After the trip, I scheduled my annual physical and talked to my doctor about my situation, who recommended I see a psychologist. I sat on the couch and talked things out. I was diagnosed with severe anxiety, which was enough for me to know that I didn't want to know what true depression felt like.
+
+I learned my lesson the hard way. I'd like to share my experience so that you can recognize the signs and avoid going down this path. And before we move on, I must say that it's perfectly fine to ask for help. Ask a trusted co-worker or friend for help or guidance. We're human, and we need to help each other through the ups and the downs.
+
+### Three things to know about burnout
+
+Work burnout is a form of depression where you are not motivated to do the things that are expected of you at your job. It's not the occasional slacking off or spring fever because the weather is nice. It's a buildup of emotional stress where you don't want to do what is asked of you at work. There are numerous factors that can lead to burnout.
+
+#### Know the signs of burnout
+
+Lesson number one about burnout is to know the signs. I mentioned some of the things I was experiencing, but there are many others. I remember one thing that was extremely abnormal for me (because I'm so social) is that I started to separate myself from my usual team activities and people.
+
+ * Hey Jason, want to grab lunch with us? Nope, I'm too busy.
+ * Hey Jason, Matt's in town, want to join us for happy hour? No. I've got work to do.
+
+
+
+This is totally unlike me. I would normally have said yes to both those opportunities. According to the [Mayo Clinic][3], here are a few things to ask yourself if you think you are experiencing burnout:
+
+ * Do you drag yourself to work?
+ * Do you have trouble getting started with work?
+ * Are you cynical or critical at work?
+ * Have you become irritable or impatient with co-workers or customers?
+ * Do you lack the energy to be productive?
+ * Do you find it hard to concentrate?
+ * Do you lack satisfaction from your achievements?
+ * Do you feel disillusioned about your work?
+ * Are you using food, drugs, or alcohol to feel better or to simply not feel?
+ * Have your sleep habits changed?
+ * Are you troubled by unexplained headaches, stomach or bowel problems, or other physical complaints?
+
+
+
+You can check your own burnout risk at [BurnoutIndex.org][4], an anonymous online questionnaire created in response to the [high level of burnout][5] in the tech industry.
+
+#### Prevent burnout
+
+The second lesson is to identify ways [to prevent burnout][6]. First, take time away from your job and plan time to unplug and unwind. This means planning vacations, staycations, or other time away from work. It's sometimes hard to unplug like this with the pressures and obligations we put on ourselves.
+
+There are three different levels of paid time off (PTO):
+
+ 1. **Best way to unplug:** I'm totally cut-off, not logging in, not checking email.
+ 2. **Decent way to unplug:** I'm kind of checking in, but not as responsive as normal.
+ 3. **Meh way to unplug:** I'm available if you need me, I'll monitor email, but I'm away from normal office life.
+
+
+
+Your situation will dictate which of these levels of time off will work for you. In my experience, you need at least two total check-outs a year. I typically have a blend of all three throughout the year, but since 2017, I have taken at least three week-long vacations each year to completely escape. It's working so far!
+
+#### Manage stress
+
+The third and final lesson is to manage stress effectively. My first go-to for stress management is exercise. I'm addicted to it. I work out pretty much every single day. And I like to mix it up: Cardio, weight lifting, swimming, running, cycling, surfing, and high-intensity interval training (HIIT) are staples in my exercise routine. I used to focus solely on running four to six half marathons a year, but I recently switched to triathlons. The multidisciplinary aspect of the activity has brought more joy and different challenges to my life.
+
+Another way to reduce stress is to manage your time better. Time is our most precious resource. You've got to choose how you want to spend your time. Family, work, self, social? It's up to you. Find ways to work more efficiently, more effectively, and make sure that you put yourself first. It may sound selfish, but as I've learned from the airplane preflight safety videos, "you need to put your mask on first before helping others."
+
+### Conclusion
+
+Burnout can lead to fatigue, excessive stress, sadness, anger, irritability, insomnia, alcohol or substance misuse, heart disease, and other medical conditions—all things that are not good for humans or for your team at work. I hope you can use these tips to put yourself first, reduce stress, and prevent burnout.
+
+* * *
+
+_Jason Hibbets will present "[10 things I wish I knew before experiencing burnout][7]" at [SCaLE 18x][8], March 5–8, 2020, in Pasadena, Calif. This article is a preview for the talk and a way to share a bit of his experience._
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/burnout
+
+作者:[Jason Hibbets][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/jhibbets
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/bulb-light-energy-power-idea.png?itok=zTEEmTZB (Light bulb)
+[2]: https://schedule.sxsw.com/2017/events/PP96070
+[3]: https://www.mayoclinic.org/healthy-lifestyle/adult-health/in-depth/burnout/art-20046642
+[4]: https://burnoutindex.org/
+[5]: https://opensource.com/article/19/11/burnout-open-source-communities
+[6]: https://www.redhat.com/sysadmin/tips-avoiding-burnout
+[7]: https://www.socallinuxexpo.org/scale/18x/presentations/10-things-i-wish-i-knew-experiencing-burnout
+[8]: https://www.socallinuxexpo.org/scale/18x/
diff --git a/sources/talk/20200306 What is Linux and Why There are 100-s of Linux Distributions.md b/sources/talk/20200306 What is Linux and Why There are 100-s of Linux Distributions.md
new file mode 100644
index 0000000000..be6a45e211
--- /dev/null
+++ b/sources/talk/20200306 What is Linux and Why There are 100-s of Linux Distributions.md
@@ -0,0 +1,193 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (What is Linux and Why There are 100’s of Linux Distributions?)
+[#]: via: (https://itsfoss.com/what-is-linux/)
+[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
+
+What is Linux and Why There are 100’s of Linux Distributions?
+======
+
+When you are just starting with Linux, it’s easy to get overwhelmed.
+
+You probably know only Windows and now you want to use Linux because you read that [Linux is better than Windows][1] as it is more secure and you don’t have to buy a license to use Linux.
+
+But then when you go about downloading and installing Linux, you learn that Linux is not a single entity. There are [Ubuntu][2], [Fedora][3], [Linux Mint][4], elementary and hundreds of such ‘Linux variants’. The trouble is that some of them look just like the other.
+
+If that’s the case, why are there multiple of those Linux operating systems? And then you also learn that Linux is just a kernel not an operating system.
+
+![Too Many Linux!][5]
+
+It gets messy. And you may feel like pulling out your hair. For a person who has a receding hairline, I would like you to keep your hair intact by explaining things in a way you could easily understand.
+
+I am going to take an analogy and explain why Linux is just a kernel, why there are hundreds of Linux and why, despite looking similar, they are different.
+
+The explanation here may not be considered good enough for an answer in an exam or interview but it should give you a better understanding of the topic.
+
+Apology in advance!
+
+My analogy may not be entirely correct from mechanical point of view as well. I am not knowledgeable about engines, cars and other related mechanical stuff.
+But in my experience, I have noticed that this analogy helps people clearly understand the concept of Linux and operating system.
+Also, I have used the term Linux OS instead of Linux distribution deliberately so that newcomers don’t start wondering about distribution.
+
+### Linux is just a kernel
+
+_**Linux is not an operating system, it’s just a kernel.**_
+
+The statement is entirely true. But how do you understand it. If you look into books, you’ll find Linux kernel structure described like this:
+
+![Linux Kernel Structure][6]
+
+There is absolutely correct, however, let’s take a different approach. Think of operating systems as vehicles, any kind of vehicle be it motorbikes, cars or trucks.
+
+What is at the core of a vehicle? An engine.
+
+Think of kernel as the engine. It’s an essential part of the vehicle and you cannot use a vehicle without the engine.
+
+![The Operating System Analogy][7]
+
+But you cannot drive an engine, can you? You need a lot of other stuff to interact with the engine and drive the vehicle. You need wheels, steering, gears, clutch, brakes and more to drive a vehicle on top of that engine.
+
+Similarly, you cannot use a kernel on its own. You need lots of tool to interact with the kernel and use the operating system. These stuff could be shell, commands, graphical interface (also called desktop environments) etc.
+
+This makes sense, right? Now that you understand this analogy, let’s take it further so that you understand the rest of it.
+
+Windows and other operating systems have kernel too
+
+Kernel is not something exclusive to Linux. You may not have realized but Windows, macOS and other operating systems have a kernel underneath as well.
+Microsoft Windows operating systems are based on [Windows NT kernel][8]. Apple’s macOS is based on the [XNU kernel][9].
+
+### Think of operating systems as vehicles
+
+Think of Microsoft as an automobile company that makes a general purpose car (Windows operating system) that is hugely popular and dominates the car market. They use their own patented engine that no one else can use. But these ‘Microsoft cars’ do not offer scope of customization. You cannot modify the engine on your own.
+
+Now come to ‘Apple automobile’. They offer shiny looking, luxury cars at an expensive price. If you got a problem, they have a premium support system where they might just replace the car.
+
+Now comes Linux. Remember, Linux is just an engine (kernel). But this ‘Linux engine’ is not patented and thus anyone is free to modify and build cars (desktop operating system), bikes (small embed system in your toys, tvs etc), trucks (servers) or jet-planes ([supercomputers][10]) on top of it. In real world, no such engine exists but accept it for the sake of this analogy.
+
+![][11]
+
+ * kernel = engine
+ * Linux kernel = specific type of engine
+ * desktop operating systems = cars
+ * server operating systems = heavy trucks
+ * embed systems = motor-bikes
+ * desktop environment = body of the vehicle along with interiors (dashboard and all)
+ * themes and icons = paint job, rim job and other customization
+ * applications = accessories you put for specific purpose (like music system)
+
+
+
+### Why there are so many Linux OS/distributions? Why some look similar?
+
+Why there are so many cars? Because there are several vehicle manufacturers using the ‘Linux engine’ and each of them have so many cars of different type and for different purposes.
+
+Since ‘Linux engine’ is free to use and modify, anyone can use it to build a vehicle on top of it.
+
+This is why Ubuntu, Debian, Fedora, SUSE, [Manjaro][12] and many other **Linux-based operating systems (also called Linux distributions or Linux distros)** exist.
+
+You might also have noticed that these Linux operating systems offer different variants but they look similar. I mean look at Fedora’s default GNOME version and Debian’s GNOME version. They do look the same, don’t they?
+
+![Fedora GNOME vs Debian GNOME: Virtually No Visual Difference][13]
+
+The component that gives the look and feel in a Linux OS is called [desktop environment][14]. In our analogy here, you can think of it as a combination of outer body and matching interiors. This is what provides the look and feel to your vehicle, does it not?
+
+It’s from the exterior that you can identify the cars into category of sedan, SUV, hatchback, station wagon, convertible, minivan, van, compact car, 4×4 etc.
+
+But these ‘type of cars’ are not exclusive to a single automobile company. Ford offers SUV, compact cars, vans etc and so do other companies like General Motors, Toyota.
+
+![Vehicles of same type look similar even if they are from different automobile companies][15]
+
+Similarly, distributions (Linux OSes) like Fedora, Ubuntu, Debian, Manjaro etc also offer different variants in the form of GNOME, KDE, Cinnamon, MATE and other [desktop environments][16].
+
+Ford’s SUV may look similar to Toyota’s or Renault’s SUV. Fedora’s GNOME version may look similar to Manjaro or Debian’s GNOME version.
+
+#### Some type of cars consume more fuel, some desktop environments need more RAM
+
+You probably understand the ‘usefulness’ of different types of cars. Compact cars are good for driving in the cities, vans are good for long trip with family, 4×4 are good for adventures in jungles and other rough terrain. A SUV may look good and feel comfortable for sitting but it consumes more fuel than a compact car that might not be comfortable to sit in.
+
+Similarly, desktop environments (GNOME, MATE, KDE, Xfce etc) also serve some purpose other than just providing the looks to your Linux operating system.
+
+GNOME gives a modern looking desktop but it consumes more RAM and thus require that your computer has more than 4 GB of RAM. Xfce on the other hand may look old/vintage but it can run on systems with 1 GB of RAM.
+
+#### Difference between getting desktop environment from distribution and installing on your own
+
+As you start using Linux, you’ll also come across suggestions that you can easily install other desktop environments on your current system.
+
+Remember that Linux is a free world. You are free to modify the engine, customize the looks on your own, if you have the knowledge/experience or if you are an enthusiastic learner.
+
+Think of it as customizing cars. You may modify a Hundai i20 to look like Suzuki Swift Dzire. But it might not be the same as using a Swift Dzire.
+
+When you are inside the i20 modified to look like Swiftz Dzire, you’ll find that it may not have the same experience from the inside. Dashboard is different, seats are different. You may also notice that the exterior doesn’t fit the same on i20’s body.
+
+The same goes for switching desktop environments. You will find that you don’t have the same set of apps in Ubuntu that you should be getting in Mint Cinnamon. Few apps will look out of place. Not to mention that you may find a few things broken, such as network manager indicator missing etc.
+
+Of course, you can put time, effort and skills to make Hundai i20 look as much like Swift Dzire as possible but you may feel like getting Suzuki Swift Dzire is a better idea in the first place.
+
+This is the reason why installing Ubuntu MATE is better than installing Ubuntu (GNOME version) and then [installing MATE desktop][17] on it.
+
+### Linux operating systems also differ in the way they handle applications
+
+Another major criteria on which the Linux operating systems differ from each other is the package management.
+
+Package management is basically how you get new software and updates in your systems. It’s up to your Linux distribution/OS to provide the security and maintenance updates. Your Linux OS also provides the means of installing new software on your system.
+
+Some Linux OS provides all the new software version immediately after their release while some take time to test them for your own good. Some Linux OS (like Ubuntu) provides easier way of installing a new software while you may find it complicated in some other Linux OS (like [Gentoo][18]).
+
+Keeping the line of our analogy, consider installing software as adding accessories to your vehicle.
+
+Suppose you have to install a music system in your car. You may have two options here. Your car is designed in such a way that you just insert the music player, you hear the click sound and you know it’s installed. The second option could be to get a screwdriver and then fix the music player on screws.
+
+Most people would prefer the hassle-free click lock installing system. Some people might take matter (and screwdriver) into their own hands.
+
+If an automobile company provides scope for installing lots of accessories in click-lock fashion in their cars, they will be preferred, won’t they?
+
+This is why Linux distributions like Ubuntu have a more users because they have a huge collection of software that can be easily installed in matter of clicks.
+
+### Conclusion
+
+Before I conclude this article, I’ll also like to talk about support that plays a significant role in choosing a Linux OS. For your car, you would like to have its official service center or other garages that service the automobile brand you own, don’t you? If the automobile company is popular, naturally, it will have more and more garages providing services.
+
+The same goes for Linux as well. For a popular Linux OS like Ubuntu, you have some official forums to seek support and a good number of websites and forums providing troubleshooting tips to fix your problem.
+
+Again, I know this is not a perfect analogy but this helps understand the things slightly better.
+
+If you are absolutely new to Linux, did this article made things clear for you or you are more confused than before?
+
+If you already know Linux, how would you explain Linux to someone from non-technical background?
+
+Your suggestions and feedback is welcome.
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/what-is-linux/
+
+作者:[Abhishek Prakash][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/abhishek/
+[b]: https://github.com/lujun9972
+[1]: https://itsfoss.com/linux-better-than-windows/
+[2]: https://ubuntu.com/
+[3]: https://getfedora.org/
+[4]: https://linuxmint.com/
+[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/too-many-linux-choices.png?ssl=1
+[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/Linux_Kernel_structure.png?ssl=1
+[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/operating_system_analogy.png?ssl=1
+[8]: https://en.wikipedia.org/wiki/Architecture_of_Windows_NT
+[9]: https://en.wikipedia.org/wiki/XNU
+[10]: https://itsfoss.com/linux-runs-top-supercomputers/
+[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/linux-kernel-as-engine.png?ssl=1
+[12]: https://manjaro.org/
+[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/fedora-gnome-vs-debian-gnome.jpg?ssl=1
+[14]: https://itsfoss.com/glossary/desktop-environment/
+[15]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/linux_suv_analogy.jpg?ssl=1
+[16]: https://itsfoss.com/best-linux-desktop-environments/
+[17]: https://itsfoss.com/install-mate-desktop-ubuntu/
+[18]: https://www.gentoo.org/
diff --git a/sources/talk/20200308 The De-Googled Android Fork is Making Good Progress.md b/sources/talk/20200308 The De-Googled Android Fork is Making Good Progress.md
new file mode 100644
index 0000000000..e5d1838cd3
--- /dev/null
+++ b/sources/talk/20200308 The De-Googled Android Fork is Making Good Progress.md
@@ -0,0 +1,115 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (The De-Googled Android Fork is Making Good Progress)
+[#]: via: (https://itsfoss.com/gael-duval-interview/)
+[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
+
+The De-Googled Android Fork is Making Good Progress
+======
+
+A couple years ago, we covered the [Eelo project][1]. If you remember, the Eelo project was started by [Gael Duval][2] who once created Mandrake Linux. The goal of the Eelo project was to remove all Google services from Android to give you an [alternate mobile operating system][3] that doesn’t track you and invade your privacy.
+
+A lot has happened to Eelo since then. It’s not called Eelo anymore, now it’s called /e/. So, what’s happening with this project? We talked to Gael Duval himself. Here’s what he shared with us.
+
+![][4]
+
+_**Why did you create this Eelo or /e/ project in the first place?**_
+
+**Gael:** In 2017, I realized that using Android and iPhone, Google and many mobile apps was not compatible with my personal privacy.
+
+A later study by a US University confirmed this: using an iPhone or and Android phone sends between 6 to 12 MB of personal data to Google servers, daily! And this doesn’t count mobile apps.
+
+So I looked for reasonable alternatives to iPhone and Android phones but didn’t find any. Either I found options for hobbyists, like Ubuntu Touch, that were not compatible with existing apps and not fully unGoogled either. Or there were alternative ROMs with all the Google fat inside, and no associated basic online services that could be used without tweaking the system.
+
+Therefore, an idea came to mind: why not fork Android, remove all the Google features, even low level, such as connectivity check, DNS…, replace default apps with more virtuous apps, add basic online services, and integrate all this into a consistent form that could be used by Mum and Dad and any people without tech or expert knowledge?
+
+_**How is it any different from other custom Android ROMs?**_
+
+**Gael:** It doesn’t send a bit of data to Google, and is and will be more and more privacy-focused.
+
+Low-level: we remove any Android feature that sends data to Google servers. Even the connectivity check when you start the smartphone! To my knowledge, there is not any other Android ROM that does this at the moment. We change default DNS settings and offer users an option to set the DNS of their choice. We change NTP (automatic time configuration) settings to the default NTP servers because there is no reason to use Google NTP servers actually. Then we remove Google services, and we replace with a software layout called microG that can still receive push notifications and have geolocation data for apps (using Mozilla geolocation service).
+
+Then we change the default apps by non-Google apps, including the maps applications, mail etc., most are open source applications and I can say that there is 99% probability that all will be open source before the end of this year.
+
+Then we add our own Android application installer, with close to 80 000 available applications at the moment.
+
+We provide a different web browser, which is a fork of Chromium, were all features that data to Google are removed, and were the default search engine is not Google…
+
+And we operate online services:
+
+ * search, using a meta-search system that we have improve for a better user experience
+ * online drive with encrypted data, calendar etc. using a modified version of NextCloud
+ * mail…
+
+
+
+And for we provide a unique identifier that can be used to access all those services, either on the web or from the /e/ OS system, by login once. Then you can sync all your data, calendar, email etc. between your smartphone and your personal /e/ cloud (it can also be self-hosted).
+The purpose of the project is to provide a normal, ready to use, and attractive “digital life” to users, without sending all your personal data to Google.
+
+_**If it is completely ‘ungoogled’, how do users install new apps? Do you have your own app store? If yes, how can we trust that these apps don’t spy on user data?**_
+
+**Gael:** Yes – we have our own application installer, with about 80 000 applications. And we analyse each application to unveil the number of trackers, and we display this information to our users, for each application. We are also adding Progressive Web Apps soon to this application installer.
+
+/e/ OS is about freedom of choice. We want the core system to be better, and then offer as many possible options to users, by informing them as much as possible. In short: they can still any application they need. Next step will be to offer a feature to actually block trackers used in applications.
+
+_**What is the target user base for /e/? Can an average Joey use it without much trouble?**_
+
+![][5]
+
+**Gael:** We started with tech-savvy users, and we’re expanding the user base to people with less knowledge. At the moment, our typical user base is a mix of tech-savvy users, who can flash a smartphone with /e/ OS and people who are very concerned with Google and their data privacy but have very limited technical knowledge. For those people we have some smartphones pre-installed with /e/ OS for sale, on high-grade refurbished hardware.
+
+We are also announcing this week an “/e/ easy installer” that will make the flashing process much more easier, by pluging the smartphone to a PC and launching a dedicated application that will make most of the job.
+
+Then, the next step will be to expand our target users to a more global market, once we find the good partners. But clearly, there is a demand for something different than the Apple-Google worldwide market duopoly on the mobile.
+
+_**Initially the project was named eelo and it is called /e/ or [e foundation][6]. Personally, I find the name /e/ weird and it is not easily recognizable. Why did you change the project name?**_
+
+**Gael:** We have been “attacked” by a company called “eelloo”. They considered that “eelo” would interfere with their business. They are in the HR business solutions, but registered their trademark in all the classes related to mobile OS, smartphones etc. This is silly and a shame, but we had no money to defend us strongly at the time.
+
+However the/e/ name will be abandonned for something else quite soon.
+
+_**It’s been a couple of years since the initial launch. How do you see the adoption of /e/?**_
+
+**Gael:** We launched the first beta 18 months ago, and we have started to sell smartphones with /e/ a little more than 6 months ago. The adoption is growing a lot at the moment, we have to add terabytes of online storage regularly!
+
+Also with the /e/ installer arriving, and some official partnerships with some hardware mobile manufacturers in the pipe, this is going to accelerate a lot this year.
+
+However, this is not surprising, privacy concerns are rising both for individuals and corporations, and I think the rejection of Google is also trending.
+
+_**What are your future plans to grow /e/?**_
+
+**Gael:** The growth is very natural. There is a strong community of users who realize how unique our approach is. These guys are contributing, supporting us and talking a lot about the project.
+
+With the easy installer coming along and strategic partnerships with hardware makers, this is going to accelerate a lot.
+
+Also, and this is more personal, I think that there is a natural connection between /e/ OS, and the Linux world. OK, /e/ OS is based on Android, but it’s still a Linux kernel and it’s the same spirit, it’s Open Source… So I’d really like to have more natural integration between my /e/ smartphone and my Linux desktop. There should be some nice features added in this spirit in the next versions of /e/ OS.
+
+_**What can /e/ users and our readers do to help e foundation?**_
+
+**Gael:** Join us, talk about what we are doing, send your feedback, organize some meetups… Help improve the /e/ Wikipedia page which is very poor and doesn’t represent at all what we are actually doing.
+
+We also have a [permanent crowdfunding campaign where users can support the project financially][7], pay for the servers etc. And, in addition to giving back in term of open source product, we send cool stuff in return :)
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/gael-duval-interview/
+
+作者:[Abhishek Prakash][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/abhishek/
+[b]: https://github.com/lujun9972
+[1]: https://itsfoss.com/eelo-mobile-os/
+[2]: https://en.wikipedia.org/wiki/Ga%C3%ABl_Duval
+[3]: https://itsfoss.com/open-source-alternatives-android/
+[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/e-os-interview.jpg?ssl=1
+[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/e-foundation-smartphones.jpg?resize=800%2C590&ssl=1
+[6]: https://e.foundation/
+[7]: https://e.foundation/donate/
diff --git a/sources/talk/20200311 Data-center power consumption holds steady.md b/sources/talk/20200311 Data-center power consumption holds steady.md
new file mode 100644
index 0000000000..cfa6ba9fba
--- /dev/null
+++ b/sources/talk/20200311 Data-center power consumption holds steady.md
@@ -0,0 +1,60 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Data-center power consumption holds steady)
+[#]: via: (https://www.networkworld.com/article/3531316/data-center-power-consumption-holds-steady.html)
+[#]: author: (Andy Patrizio https://www.networkworld.com/author/Andy-Patrizio/)
+
+Data-center power consumption holds steady
+======
+While computing capacity has exploded in recent years, power consumption is growing more slowly thanks to greater energy efficiency.
+Google
+
+A predicted explosion in power consumption by data centers has not manifested thanks to advances in power efficiency and, ironically enough, the move to the cloud, according to a new report.
+
+The [study][1], published in the journal _Science_ last week, notes that while there has been an increase in global data-center energy consumption over the past decade, this growth is negligible compared with the rise of workloads and deployed hardware during that time.
+
+Data centers accounted for about 205 terawatt-hours of electricity usage in 2018, which is roughly 1% of all electricity consumption worldwide, according to the report. (That's well below the often-cited stat that data centers consume 2% of the world's electricity). The 205 terawatt-hours represent a 6% increase in total power consumption since 2010, but global data center compute instances rose by 550% over that same time period.
+
+**[ Now read: [What is quantum computing (and why enterprises should care)][2] ]**
+
+To drive that point home: Considerably more compute is being deployed, yet the amount of power consumed is holding steady.
+
+The paper cites a number of reasons for this. For starters, hardware power efficiency is vastly improved. The move to server virtualization has meant a six-fold increase in compute instances with only a 25% increase in server energy use. And a shift to faster and more energy-efficient port technologies has brought about a 10-fold increase in data center IP traffic with only a modest increase in the energy use of network devices.
+
+Even more interesting, the report claims the rise of and migration to hyperscalers has helped curtail power consumption.
+
+Hyperscale data centers and cloud data centers are generally more energy efficient than company-owned data centers because there is greater incentive for energy efficiency. The less power Amazon, Microsoft, Google, etc., have to buy, the more their bottom line grows. And hyperscalers are big on cheap, renewable energy, such as hydro and wind.
+
+[][3]
+
+So if a company trades its own old, inefficient data center for AWS or Google Cloud, they're reducing the overall power draw of data centers as a whole.
+
+"Total power consumption held steady as computing output has risen because of improvement efficiency of both IT and infrastructure equipment, and a shift from corporate data centers to more efficient cloud data centers (especially hyper scale)," said Jonathan Koomey, a Stanford professor and one of the authors of the research, in an email to me. He has spent years researching data center power and is an authority on the subject.
+
+"As always, the IT equipment progresses most quickly. In this article, we show that the peak output efficiency of computing doubled every 2.6 years after 2000. This doesn’t include the reduced idle power factored into the changes for servers we document," he added.
+
+Koomey notes that there is additional room for efficiency improvements to cover the next doubling of computing output over the next few years but was reluctant to make projections out too far. "We avoid projecting the future of IT because it changes so fast, and we are skeptical of those who think they can project IT electricity use 10-15 years hence," he said.
+
+Join the Network World communities on [Facebook][4] and [LinkedIn][5] to comment on topics that are top of mind.
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3531316/data-center-power-consumption-holds-steady.html
+
+作者:[Andy Patrizio][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/Andy-Patrizio/
+[b]: https://github.com/lujun9972
+[1]: https://science.sciencemag.org/content/367/6481/984
+[2]: https://www.networkworld.com/article/3275367/what-s-quantum-computing-and-why-enterprises-need-to-care.html
+[3]: https://www.networkworld.com/article/3440100/take-the-intelligent-route-with-consumption-based-storage.html?utm_source=IDG&utm_medium=promotions&utm_campaign=HPE21620&utm_content=sidebar ( Take the Intelligent Route with Consumption-Based Storage)
+[4]: https://www.facebook.com/NetworkWorld/
+[5]: https://www.linkedin.com/company/network-world
diff --git a/sources/talk/20200311 Setting yourself up for success while working remotely.md b/sources/talk/20200311 Setting yourself up for success while working remotely.md
new file mode 100644
index 0000000000..bbe6b3f513
--- /dev/null
+++ b/sources/talk/20200311 Setting yourself up for success while working remotely.md
@@ -0,0 +1,61 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Setting yourself up for success while working remotely)
+[#]: via: (https://opensource.com/article/20/3/remote-work)
+[#]: author: (Dawn Parzych https://opensource.com/users/dawnparzych)
+
+Setting yourself up for success while working remotely
+======
+Whether you are new to working remotely or are a seasoned veteran, here
+are tips to improve the experience.
+![Woman sitting in front of her computer][1]
+
+Remote work is not easy. While there are perks to being remote, it is a mind-shift and takes some getting used to. Talk to anybody that works remotely, and they will likely tell you some of the biggest challenges of remote work are _**feeling disconnected**_ and _**a loss of regime**_. Here are my tips gathered from 10 years as a remote worker on how to set yourself and your team up to work remotely successfully.
+
+### Environment and regime
+
+ 1. **"Commute" to and from work**. I'm not saying go to the extremes in this [_Audible commercial_][2], but I suggest leaving your home to go for a walk or a bike ride before you begin working. Do the same at the end of the day. I take my dog, Barley (pictured here), for a walk at the start and end of most days.![Here's my dog, Barley, who gets regular walks during my morning "commute"][3]
+ 2. **Get dressed.** Don't be tempted to work in your PJs, because this blurs the line between work and home. People sometimes say that being able to work in your pajamas is a perk of remote work, but studies show this isn't great advice. You don't need to put on a suit and tie, but do change out of your pajamas; otherwise, before you know it, you will have gone three days without changing your clothes. For more reasons why check out this article from [_Fast Company_][4].
+ 3. **Eat lunch away from your desk**. This is good advice even if you aren't working remotely.
+ 4. **Stick to a schedule**. It's easy to start working as soon as you wake up and continue late into the evening. Set a start time and an end time for your day and stick to it. When I stop work for the day, I try to close my office door. Configure your working hours in every app you use so others know when you are available. Don't use your work computer outside of working hours if you can.
+ 5. **Set up a dedicated work environment**, if possible. Try not to work from the kitchen table. This blurs the lines between home and work. My office (picture below) also has space for comfortable seating and desk seating to switch between the two.
+ 6. **Check-in with your team** or friends in the morning. Don't mistake this for a daily stand-up; this is more like saying _hi_ when you're getting coffee.
+ 7. **Sign-off at the end of the day**. This means both letting your team members know you are leaving and actually walking away from where you are working. Close the laptop. Turn off Slack notifications, etc.
+ 8. **Keep people posted** if you are leaving early or unavailable. It helps build trust.
+ 9. **Invest in a headset** if you will be doing a lot of calls. If there is more than one person in your household that is working remotely, they will thank you for this. It is no fun listening to somebody else's conference call.
+ 10. **Turn on your video** when on a video call to help you feel connected and stay engaged. When your video is disabled, it is easy to wander off and get distracted by Slack (or its [open source alternatives][5]), Twitter, or any other number of distractions.
+ 11. **Set up a weekly, casual remote chat**. At my company, we meet on Friday mornings via Zoom (or the open source alternative, [Jitsi][6]). This chat is open to remote and non-remote staff. It is an open call to talk about whatever is on our minds. Topics have ranged from music preferences to parenting challenges to what people are doing over the weekend.
+ 12. **Set-up chat-roulette **if one-on-one interaction is more your thing. There are applications on most chat platforms that randomly pairs two employees to chat and get to know one another.
+ 13. **Ask for help**. Chat with your colleagues if you're stuck, need encouragement, or need to vent. You are not alone. You are a member of a team. You can still grab a coffee or go for a walk with a teammate remotely.
+
+
+
+![Here’s my home office set up][7]
+
+Everybody is different. These tips work for me, I’d love to hear you share your advice below!
+
+Not all work-from-home gigs are created equal. There is a vast ocean between being a member of a...
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/remote-work
+
+作者:[Dawn Parzych][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/sites/default/files/styles/image-full-size/public/lead-images/OSDC_women_computing_2.png?itok=JPlR5aCA (Woman sitting in front of her computer)
+[2]: https://www.youtube.com/watch?v=oVCJhZhrJ04
+[3]: https://opensource.com/sites/default/files/resize/pictures/barleywalking_0-300x379.png (Here's my dog, Barley, who gets regular walks during my morning "commute")
+[4]: https://www.fastcompany.com/3064295/what-happened-when-i-dressed-up-to-work-from-home-for-a-week
+[5]: https://opensource.com/alternatives/slack
+[6]: https://meet.jit.si/
+[7]: https://opensource.com/sites/default/files/pictures/6151f75e-bbeb-4e64-a5ca-0bbe4e981054.jpeg (Here’s my home office set up)
diff --git a/sources/talk/20200312 Next wave of digital transformation requires better security, automation.md b/sources/talk/20200312 Next wave of digital transformation requires better security, automation.md
new file mode 100644
index 0000000000..d99b38c7b8
--- /dev/null
+++ b/sources/talk/20200312 Next wave of digital transformation requires better security, automation.md
@@ -0,0 +1,92 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Next wave of digital transformation requires better security, automation)
+[#]: via: (https://www.networkworld.com/article/3531448/next-wave-of-digital-transformation-requires-better-security-automation.html)
+[#]: author: (Zeus Kerravala https://www.networkworld.com/author/Zeus-Kerravala/)
+
+Next wave of digital transformation requires better security, automation
+======
+F5 report highlights the challenges of digital initiatives, including a struggle to secure multi-cloud environments and a lack of IT skills required to extend automation efforts.
+Loops7 / Getty Images
+
+Digital transformation is a top-of-mind priority for CIOs who want innovative ways to deploy applications and run IT operations. In today's digital economy, companies that don't depend on applications to support their business are rare. On the contrary, most companies have some kind of digital transformation initiative in place, which is driving the adoption of cloud-native architectures and application services.
+
+A new report from application delivery vendor F5 Networks finds businesses are entering the second phase of digital transformation by automating more parts of their networks. Based on a survey of nearly 2,600 senior leaders globally—from various industries, company sizes, and roles—the [_2020 State of Application Services Report_][1] uncovered five key trends shaping the application landscape.
+
+**READ MORE:** [Top 10 underused SD-WAN features][2]
+
+### 1\. Every company is undergoing a digital transformation
+
+Having conducted its annual survey for six years in a row, F5 consistently found IT optimization and business process optimization to be the top reported benefits for companies with digital transformation initiatives. At this point, most companies have mastered automation of individual tasks by digitizing IT and business processes—which the report classifies as phase one of digital transformation.
+
+Moving on to phase two, companies are shifting their focus to reducing complexity and supporting apps with a consistent set of services. External-facing apps make up a portion (45%) of an average company's portfolio and help generate revenue. Yet, the internal-facing ones—like productivity and operational apps—are vital to digitizing business processes.
+
+Modern, microservices/cloud-native apps now make up approximately 15% of a company's portfolio, compared to 11% for mainframe-hosted apps. This mix of new and older generation apps indicates that businesses are dealing with a diverse app portfolio. As more businesses adopt an application-centric mindset, they can start managing their app portfolio like a business asset.
+
+### 2\. Organizations struggle to secure multi-cloud environments
+
+Every company has different needs, which is why most choose the best cloud for their applications on a case-by-case basis, the report finds. Businesses are adopting cloud platforms at a high rate, with 27% planning to have more than half of their applications in the cloud by the end of 2020.
+
+For 87% of companies, multi-cloud is the preferred choice due to its flexibility. Multi-cloud typically includes a mix of infrastructure-as-a-service (IaaS) environments, so a company can choose to deploy multiple software-as-a-service (SaaS) or platform-as-a-service (PaaS) cloud services.
+
+[][3]
+
+However, multi-cloud environments pose challenges for businesses when it comes to maintaining security, policy, and compliance, according to the report's respondents. Companies are dealing with applications that reach hundreds to millions of end users—each one with its own security risk. Meanwhile, many don't have the expertise to protect the apps.
+
+A whopping 71% of companies surveyed by F5 reported a skills gap in security. Only 45% of companies are confident that they're able to secure apps in the public cloud, while 62% think they can protect apps in an on-premises data center. The most confident companies have consistency across multiple architectures and multiple infrastructures, ensuring security and performance of all apps in their portfolio.
+
+### 3\. Automation key to boosting efficiency
+
+Manual processes may have been the norm for legacy networks, but modern networks require automation. That's why most companies (73%) have embraced it.
+
+In this year's report, F5 observed more consistent use of automation in the deployment pipeline than in previous years. Automation of application infrastructure, network, application services, and security is nearly equal across the board at approximately 40% for survey respondents. (See also: [Enterprises being won over by speed, effectiveness of network automation][4])
+
+Interestingly, more companies are choosing open source and continuous integration/continuous delivery (CI/CD) tools for automation over proprietary vendor solutions. The report found there is a need for open ecosystems with the increasing use of CI/CD tools, as businesses search for ways to address problems that slow down automation. Companies said their biggest struggles are with skill gaps in enterprise IT, integrating toolsets across vendors and devices, and the cost of new tools.
+
+### 4\. Security app services are most widely deployed
+
+Modern networks require application services—a pool of services necessary to deploy, run, and secure apps across on-premises or multi-cloud environments. Today, 69% of companies are using 10 or more application services, such as ingress control and service discovery. Ingress control is a relatively new application service that has become essential to companies with high API call volumes. It's one of many examples of the growing adoption of microservices-based apps.
+
+Security services remain as the most widely deployed, with these in particular dominating the top five: SSL VPN and firewall services (81%); IPS/IDS, antivirus, and spam mitigation (77%); load balancing and DNS (68%); web application firewalls (WAF) and DDoS protection (each at 67%).
+
+Over the next 12 months, the evolution of cloud and modern app architectures will continue to shape application services. At the top of the list (41%) is software-defined wide-area networking ([SD-WAN][5]). SD-WAN enables software-based provisioning from the cloud to meet modern application demands. Early SD-WAN deployments focused on replacing costly multi-protocol label switching (MPLS), but there is now greater emphasis on security as a core requirement for SD-WAN.
+
+### 5\. DevOps picks up responsibility for app services
+
+Although IT operations is still primarily responsible for deploying app services, the report revealed a shift taking place from single-function to ops-oriented team structures—such SecOps and DevOps.
+
+The responsibility for securing, optimizing, and managing apps by DevOps teams is growing, fueled by cloud and container-native applications. Compared to just a few years ago, businesses have developed a preference for containers over virtual appliances for app services. Container preference grew from just 6% in 2017 to 18% in 2020, surpassing virtual machines (15%) and hardware (15%).
+
+Regardless of preference, the challenges of modern app architectures call for collaboration between teams. IT operations and DevOps don't have to be mutually exclusive and can work together to address those challenges.
+
+### What's Next?
+
+Senior leaders surveyed in the report see big data analytics coming into play in the next two to five years.
+
+Companies today only use a small portion of their data and aren't taking full advantage of it. In the third phase of the digital transformation, businesses can begin leveraging data captured by apps via artificial intelligence (AI)-powered analytics. The harnessed data can provide valuable insights to improve business processes.
+
+Join the Network World communities on [Facebook][6] and [LinkedIn][7] to comment on topics that are top of mind.
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3531448/next-wave-of-digital-transformation-requires-better-security-automation.html
+
+作者:[Zeus Kerravala][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/Zeus-Kerravala/
+[b]: https://github.com/lujun9972
+[1]: https://www.f5.com/state-of-application-services-report
+[2]: https://www.networkworld.com/article/3518992/top-10-underused-sd-wan-features.html
+[3]: https://www.networkworld.com/article/3440100/take-the-intelligent-route-with-consumption-based-storage.html?utm_source=IDG&utm_medium=promotions&utm_campaign=HPE21620&utm_content=sidebar ( Take the Intelligent Route with Consumption-Based Storage)
+[4]: https://www.networkworld.com/article/3530275/enterprises-being-won-over-by-speed-effectiveness-of-network-automation.html
+[5]: https://www.networkworld.com/article/3031279/sd-wan-what-it-is-and-why-you-ll-use-it-one-day.html
+[6]: https://www.facebook.com/NetworkWorld/
+[7]: https://www.linkedin.com/company/network-world
diff --git a/sources/talk/20200313 What is the internet backbone and how it works.md b/sources/talk/20200313 What is the internet backbone and how it works.md
new file mode 100644
index 0000000000..7a163fce7f
--- /dev/null
+++ b/sources/talk/20200313 What is the internet backbone and how it works.md
@@ -0,0 +1,73 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (What is the internet backbone and how it works)
+[#]: via: (https://www.networkworld.com/article/3532318/what-is-the-internet-backbone-and-how-it-works.html)
+[#]: author: (Tim Greene https://www.networkworld.com/author/Tim-Greene/)
+
+What is the internet backbone and how it works
+======
+Tier 1 internet service providers (ISP) mesh their high-speed fiber-optic networks together to create the internet backbone, which moves traffic efficiently among geographic regions.
+[Gerd Altmann][1] [(CC0)][2]
+
+The internet generates massive amounts of computer-to-computer traffic, and insuring all that traffic can be delivered anywhere in the world requires the aggregation of a vast array of high-speed networks collectively known as the internet backbone, but how does that work?
+
+### What is the internet backbone?
+
+Like any other network, the internet consists of access links that move traffic to high-bandwidth routers that move traffic from its source over the best available path toward its destination. This core is made up of individual high-speed fiber-optic networks that peer with each other to create the internet backbone.
+
+The individual core networks are privately owned by Tier 1 internet service providers (ISP), giant carriers whose networks are tied together. These providers include AT&T, CenturyLink, Cogent Communications, Deutsche Telekom, Global Telecom and Technology (GTT), NTT Communications, Sprint, Tata Communications, Telecom Italia Sparkle, Telia Carrier, and Verizon.
+
+[[Get regularly scheduled insights by signing up for Network World newsletters.]][3]
+
+By joining these long-haul networks together, Tier 1 ISPs create a single worldwide network that gives all of them access to the entire internet routing table so they can efficiently deliver traffic to its destination through a hierarchy of progressively more local ISPs.
+
+In addition to being physically connected, these backbone providers are held together by a shared network protocol, TCP/IP. They are actually two protocols, transport control protocol and internet protocol that set up connections between computers, insuring that the connections are reliable and formating messages into packets.
+
+### Internet exchange points (IXP) tie the backbone together
+
+Backbone ISPs connect their networks at peering points, neutrally owned locations with high-speed switches and routers that move traffic among the peers. These are often owned by third parties, sometimes non-profits, that facilitate unifying the backbone.
+
+Participating Tier 1 ISPs help fund the IXPs, but don’t charge each other for transporting traffic from the other Tier 1 ISPs in a relationship known as settlement-free peering. Such agreements eliminate potential financial disputes that might have the result of slowing down internet performance.
+
+[][4]
+
+### How fast is the backbone?
+
+The internet backbone is made up of the fastest routers, which can deliver 100Gbps trunk speeds. These routers are made by vendors including Cisco, Extreme, Huawei, Juniper, and Nokia, and use the border gateway protocol (BGP) to route traffic among themselves.
+
+### How traffic gets on the backbone
+
+Below the Tier 1 ISPs are smaller Tier 2 and Tier 3 ISPs.
+
+Tier 3 providers provide businesses and consumers with access to the internet. These providers have no access of their own to the internet backbone, so on their own would not be able to connect their customers to all of the billions of internet-attached computers.
+
+Buying access to Tier 1 providers is expensive. So often Tier 3 ISPs contract with Tier 2 (regional) ISPs that have their own networks that can deliver traffic to a limited geographic area but not to all internet-attached devices.
+
+In order to do that, Tier 2 ISPs contract with Tier 1 ISPs for access to the global backbone, and in that way make the entire internet accesssible to their customers.
+
+This arrangment makes it possible for traffic from a computer on one side of the world to connect to one on the other side. That traffic goes from a source computer to a Tier 3 ISP that routes it to a Tier 2 ISP that routes it to a Tier 1 backbone provider that routes it to the appropriate Tier 2 ISP that routes it to a Tier 3 access provider that delivers it to the destination computer.
+
+Join the Network World communities on [Facebook][5] and [LinkedIn][6] to comment on topics that are top of mind.
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3532318/what-is-the-internet-backbone-and-how-it-works.html
+
+作者:[Tim Greene][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/Tim-Greene/
+[b]: https://github.com/lujun9972
+[1]: https://pixabay.com/en/social-media-digitization-faces-3271592/
+[2]: https://creativecommons.org/publicdomain/zero/1.0/
+[3]: https://www.networkworld.com/newsletters/signup.html
+[4]: https://www.networkworld.com/article/3440100/take-the-intelligent-route-with-consumption-based-storage.html?utm_source=IDG&utm_medium=promotions&utm_campaign=HPE21620&utm_content=sidebar ( Take the Intelligent Route with Consumption-Based Storage)
+[5]: https://www.facebook.com/NetworkWorld/
+[6]: https://www.linkedin.com/company/network-world
diff --git a/sources/talk/20200316 As the networks evolve enterprises need to rethink network security.md b/sources/talk/20200316 As the networks evolve enterprises need to rethink network security.md
new file mode 100644
index 0000000000..4767aaafe1
--- /dev/null
+++ b/sources/talk/20200316 As the networks evolve enterprises need to rethink network security.md
@@ -0,0 +1,81 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (As the networks evolve enterprises need to rethink network security)
+[#]: via: (https://www.networkworld.com/article/3531929/as-the-network-evolves-enterprises-need-to-rethink-security.html)
+[#]: author: (Zeus Kerravala https://www.networkworld.com/author/Zeus-Kerravala/)
+
+As the networks evolve enterprises need to rethink network security
+======
+Q&A: John Maddison, executive vice president of products for network security vendor Fortinet, discusses how to deal with network security in the digital era.
+D3Damon / Getty Images
+
+_Digital innovation is disrupting businesses. Data and applications are at the hub of new business models, and data needs to travel across the extended network at increasingly high speeds without interruption. To make this possible, organizations are radically redesigning their networks by adopting multi-cloud environments, building hyperscale data centers, retooling their campuses, and designing new connectivity systems for their next-gen branch offices. Networks are faster than ever before, more agile and software-driven. They're also increasingly difficult to secure. To understand the challenges and how security needs to change, I recently talked with John Maddison, executive vice president of products for network security vendor Fortinet._
+
+**ZK: As the speed and scale of data escalate, how do the challenges to secure it change?**
+
+JM: Security platforms were designed to provide things like enhanced visibility, control, and performance by monitoring and managing the perimeter. But the traditional perimeter has shifted from being a very closely monitored, single access point to a highly dynamic and flexible environment that has not only expanded outward but inward, into the core of the network as well.
+
+**[ Also see [What to consider when deploying a next generation firewall][1]. | Get regularly scheduled insights by [signing up for Network World newsletters][2]. ]**
+
+**READ MORE:** [The VPN is dying, long live zero trust][3]
+
+Today's perimeter not only includes multiple access points, the campus, the WAN, and the cloud, but also IoT, mobile, and virtual devices that are generating data, communicating with data centers and manufacturing floors, and literally creating thousands of new edges inside an organization. And with this expanded perimeter, there are a lot more places for attacks to get in. To address this new attack surface, security has to move from being a standalone perimeter solution to being fully integrated into the network.
+
+This convergence of security and networking needs to cover SD-WAN, VPN, Wi-Fi controllers, switching infrastructures, and data center environments – something we call security-driven networking. As we see it, security-driven networking is an essential approach for ensuring that security and networking are integrated together into a single system so that whenever the networking infrastructure evolves or expands, security automatically adapts as an integrated part of that environment. And it needs to do this by providing organizations with a new suite of security solutions, including network segmentation, dynamic multi-cloud controls, and [zero-trust network access][3]. And because of the speed of digital operations and the sophistication of today's attacks, this new network-centric security strategy also needs to be augmented with AI-driven security operations.
+
+The perimeter security devices that have been on the market weren't really built to run as part of the internal network, and when you put them there, they become bottlenecks. Customers don't put these traditional security devices in the middle of their networks because they just can't run fast enough. But the result is an open network environment that can become a playground for criminals that manage to breach perimeter defenses. It's why the dwell time for network malware is over six months.
+
+**[ [Prepare to become a Certified Information Security Systems Professional with this comprehensive online course from PluralSight. Now offering a 10-day free trial!][4] ]**
+
+As you combine networking applications, networking functionality, and security applications together to address this challenge, you absolutely need a different performance architecture. This can't be achieved using the traditional hardware most security platforms rely on.
+
+**ZK: Why can't traditional security devices secure the internal network?**
+
+JM: They simply aren't fast enough. And the ones that come close are prohibitively expensive… For example, internal segmentation not only enables organizations to see and separate all of the devices on their network but also dynamically create horizontal segments that support and secure applications and automated workflows that need to travel across the extended network. Inside the network, you're running at 100 gigs, 400 gigs, that sort of thing. But the interface for a lot of security systems today is just 10 gigs. Even with multiple ports, the device can't handle much more than that without having to spend a fortune… In order to handle today's capacity and performance demands, security needs to be done at network speeds that most security solutions cannot support without specialized content processors.
+
+**ZK: Hyperscale data centers have been growing steadily. What sort of additional security challenges do these environments face?**
+
+JM: Hyperscale architectures are being used to move and process massive amounts of data. A lot of the times, research centers will need to send a payload of over 10 gigabytes – one packet that's 10 gigabytes – to support advanced rendering and modeling projects. Most firewalls today cannot process these large payloads, also known as elephant flows. Instead, they often compromise on their security to let them flow through. Other hyperscale environment examples include financial organizations that need to process transactions with sub-second latency or online gaming providers that need to support massive numbers of connections per second while maintaining high user experience. … [Traditional security platforms] will never be able to secure hyperscale environments, or even worse, the next generation of ultra-fast converged networks that rely on hyperscale and hyperconnectivity to run things like smart cities or smart infrastructures, until they fundamentally change their hardware.
+
+**ZK: Do these approaches introduce new risks or increase the existing risk for these organizations?**
+
+JM: They do both. As the attack surface expands, existing risks often get multiplied across the network. We actually see more exploits in the wild targeting older vulnerabilities than new ones. But cybercriminals are also building new tools designed to exploit cloud environments and modern data centers. They are targeting mobile devices and exploiting IoT vulnerabilities. Some of these attacks are simply revisions of older, tried and true exploits. But many are new and highly sophisticated. We are also seeing new attacks that use machine learning and rely on AI enhancements to better bypass security and evade detection.
+
+To address this challenge, security platforms need to be broad, integrated, and automated.
+
+Broad security platforms come in a variety of form factors so they can be deployed everywhere across the expanding network. Physical hardware enhancements, such as our [security processing units], enable security platforms to be effectively deployed inside high-performance networks, including hyperscale data centers and SD-WAN environments. And virtualized versions need to support private cloud environments as well as all major cloud providers through thorough cloud-native integration.
+
+Next, these security platforms need to be integrated. The security components built into a security platform need to work together as a single solution – not the sort of loose affiliation most platforms provide – to enable extremely fast threat intelligence collection, correlation, and response. That security platform also needs to support common standards and APIs so third-party tools can be added and supported. And finally, these platforms need to be able to work together, regardless of their location or form factor, to create a single, unified security fabric. It's important to note that many cloud providers have developed their own custom hardware, such as Google's TPU, Amazon's Inferentia, and Microsoft's Corsica, to accelerate cloud functions. As a result, hardware acceleration on physical security platforms is essential to ensure consistent performance for data moving between physical and cloud environments
+
+And finally, security platforms need to be automated. Support for automated workflows and AI-enhanced security operations can significantly accelerate the speed of threat detection, analysis, and response. But like other processing-intensive functions, such as decrypting traffic for deep inspection, these functions also need specialized and purpose-built processors or they will become innovation-killing bottlenecks.
+
+**ZK: What's next for network security?**
+
+JM: This is just the start. As networking functions begin to converge even further, creating the next generation of smart environments – smart buildings, smart cities, and smart critical infrastructures – the lack of viable security tools capable of inspecting and protecting these hyperfast, hyperconnected, and hyper-scalable environments will seriously impact our digital economy and way of life.
+
+Security vendors need to understand this challenge and begin investing now in developing advanced hardware and security-driven networking technologies. Organizations aren't waiting for vendors to catch up so they can secure their networks of tomorrow. Their networks are being left exposed right now because the software-based security solutions they have in place are just not adequate. And it's up to the security industry to step up and solve this challenge.
+
+Join the Network World communities on [Facebook][5] and [LinkedIn][6] to comment on topics that are top of mind.
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3531929/as-the-network-evolves-enterprises-need-to-rethink-security.html
+
+作者:[Zeus Kerravala][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/Zeus-Kerravala/
+[b]: https://github.com/lujun9972
+[1]: https://www.networkworld.com/article/3236448/lan-wan/what-to-consider-when-deploying-a-next-generation-firewall.html
+[2]: https://www.networkworld.com/newsletters/signup.html
+[3]: https://www.networkworld.com/article/3487720/the-vpn-is-dying-long-live-zero-trust.html
+[4]: https://pluralsight.pxf.io/c/321564/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fpaths%2Fcertified-information-systems-security-professional-cisspr
+[5]: https://www.facebook.com/NetworkWorld/
+[6]: https://www.linkedin.com/company/network-world
diff --git a/sources/talk/20200316 How to be the right person for DevOps.md b/sources/talk/20200316 How to be the right person for DevOps.md
new file mode 100644
index 0000000000..02cdf8bedb
--- /dev/null
+++ b/sources/talk/20200316 How to be the right person for DevOps.md
@@ -0,0 +1,108 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How to be the right person for DevOps)
+[#]: via: (https://opensource.com/article/20/3/devops-relationships)
+[#]: author: (Josh Atwell https://opensource.com/users/joshatwell)
+
+How to be the right person for DevOps
+======
+Creating healthy relationships is the essential ingredient in DevOps
+success.
+![Team meeting][1]
+
+In my kitchen, we have a sign that reads "Marriage is more than finding the right person. It is being the right person." It serves as a great reminder of the individual responsibility everyone has in any healthy relationship. As organizations adopt [DevOps][2] as a model of developing and delivering value to customers, the impact of healthy relationships is extremely important for success.
+
+![Marriage sign][3]
+
+Historically, the relationship between development and operations teams has been unhealthy. Poor communication, limited empathy, and a history of mistrust make merging these teams into a tighter operating model challenging, to say the least. This is not entirely unfair to either side.
+
+Developers have long been frustrated by lead times and processes put in place by the operations organization. They just want to work, and they often see operations as an anchor on the ship of progress.
+
+Operations professionals have long been frustrated by the impatience and lack of clear requirements that come from development teams. They are often confused about why those teams are not able to use the available services and processes. They see developers as a liability to their ability to maintain stable services for customers and the business.
+
+A lingering gap here is that each side has been focused on protecting its own perspective. They emphasize how the other team is not being what _they_ need, and they never question whether they, too, could be doing something different.
+
+In DevOps, all sides must frame their role in the organization based on how they add value to others.
+
+There are a few things that everyone, including managers and leaders, can do right away to become a better contributor and partner in their DevOps relationships.
+
+### Communicate
+
+Most professionals in an organization adopting DevOps find themselves needing to work closely with new people, ones they have had limited exposure to in the past. It is important for everyone to take time to get to know their new teammates and learn more about their concerns, their interests, and also their preferred communication style.
+
+Successful communication in new relationships is often built on simply listening more and talking less. Our natural tendency is to talk about ourselves. Most people love sharing what they know best. However, it is extremely important to make more room to listen.
+
+Hearing someone is not the same as listening to them. I'm confident that we have all been in the situation where someone expresses a concern that we do not entirely internalize. Also, merely hearing does not encourage people to share–or to share as completely as they should.
+
+![Stick figures hearing][4]
+
+It is important to listen actively. Repeat what you hear, and seek validation that what you repeat is what they wanted you to understand. Once you understand their concern, it is important to make your initial response a selfless one. Even if you can't completely solve the problem, demonstrate sympathy and help the person move towards a solution.
+
+![Stick figures listening][5]
+
+### Selflessness
+
+Another key relationship challenge as organizations adopt DevOps is developing a perspective of selflessness. In DevOps, most people are responsible for delivering value to a wide variety of other people. Each person should begin by considering how their actions and work impact other people.
+
+This service mindset carries forward when you become more sensitive to when others are in need and then dedicate time in your schedule specifically for the purpose of helping them. This can be as simple as creating a small improvement in a process or helping to troubleshoot an issue. A positive side effect is that this effort will provide you more opportunities to work with others and develop deeper trust.
+
+It is also important not to hoard knowledge—either technical or institutional—especially when people ask questions or seek help. Maintain the mindset that there are no stupid questions.
+
+![Stick figure apologizing][6]
+
+Finally, selflessness includes being trustworthy. It is difficult to maintain a healthy relationship when there is no trust. Be honest and transparent. In IT, this is often seen as a liability, but in DevOps it is a requirement for success.
+
+### Self-care
+
+In order to be a strong contributor to a relationship, it is necessary to maintain a sense of self. Our individuality provides the diversity a relationship needs to grow. Make sure you maintain and share your interests with others. Be more than just the work you do. Apply your interests to your work.
+
+You are no good to others if you are not good to yourself. Healthy relationships are stronger with healthy people. Make sure you take time to enjoy your interests and recharge. Take your vacation and leave work behind!
+
+![Stick figure relaxing][7]
+
+I am also a strong advocate for mental health days. Sometimes our mental health is not sufficient to work effectively. You're not as effective when you are physically ill, and you're not as effective when your head is not 100%. Work with your manager and your team to support each other to maintain good mental health.
+
+Mental health is improved by learning. Invest in yourself and expand your knowledge. DevOps ideally needs "t-shaped" people who have depth on a topic and also broader system knowledge. Work to increase your depth, but balance that by learning new things about your environment. This knowledge can come from your teammates and create operational sympathy.
+
+![Stick figure with open arms][8]
+
+Finally, healthy relationships are not all work and no play. Take time to acknowledge the successes of others. If you know your team, you likely know how individuals prefer to receive praise. Respect those preferences, but always strive to praise vocally where possible.
+
+![Stick figures celebrating][9]
+
+Make sure to celebrate these successes as a team. All work and no play makes everyone dull. Celebrate milestones together as a team, and then articulate and target the next objectives.
+
+### Be the right person
+
+DevOps requires more from every individual, and its success is directly tied to the health of relationships. Each member of the organization should apply these techniques to grow and improve themselves. A focus on being the right person for the team will build stronger bonds and make the organization better equipped to reach its goals.
+
+* * *
+
+_This article is based on [a talk][10] Josh Atwell gave at All Things Open 2019._
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/devops-relationships
+
+作者:[Josh Atwell][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/joshatwell
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/meeting-team-listen-communicate.png?itok=KEBP6vZ_ (Team meeting)
+[2]: https://opensource.com/tags/devops
+[3]: https://opensource.com/sites/default/files/uploads/marriage.png (Marriage sign)
+[4]: https://opensource.com/sites/default/files/uploads/hearing.png (Stick figures hearing)
+[5]: https://opensource.com/sites/default/files/uploads/listening.png (Stick figures listening)
+[6]: https://opensource.com/sites/default/files/uploads/apologize.png (Stick figure apologizing)
+[7]: https://opensource.com/sites/default/files/uploads/relax.png (Stick figure relaxing)
+[8]: https://opensource.com/sites/default/files/uploads/open_0.png (Stick figure with open arms)
+[9]: https://opensource.com/sites/default/files/uploads/celebrate.png (Stick figures celebrating)
+[10]: https://opensource.com/article/20/1/devops-empathy
diff --git a/sources/talk/20200316 OpenStreetMap- A Community-Driven Google Maps Alternative.md b/sources/talk/20200316 OpenStreetMap- A Community-Driven Google Maps Alternative.md
new file mode 100644
index 0000000000..123b5f003f
--- /dev/null
+++ b/sources/talk/20200316 OpenStreetMap- A Community-Driven Google Maps Alternative.md
@@ -0,0 +1,93 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (OpenStreetMap: A Community-Driven Google Maps Alternative)
+[#]: via: (https://itsfoss.com/openstreetmap/)
+[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
+
+OpenStreetMap: A Community-Driven Google Maps Alternative
+======
+
+_**Brief: OpenStreetMap is a community-driven map – which is a potential alternative to Google Maps. Learn more about this open source project.**_
+
+[OpenStreetMap][1] (OSM) is a free editable map of the world. Anyone can contribute, edit, and make changes to the OpenStreetMap to improve it.
+
+![][2]
+
+You need to sign up for an account first – in order to be able to edit or add information to the OpenStreetMap. To view the map, you wouldn’t need an account.
+
+Even though it’s a free-to-use map under an [open data license][3], you cannot use the map API to build another service on top of it for commercial purpose.
+
+So, you can download the map data to use it and host it yourself while mentioning the credits to OSM. You can learn more about its [API usage policy][4] and [copyright][5] information on its official website to learn more.
+
+In this article, we shall take a brief look at how it works and what kind of projects use OpenStreetMaps as the source of their map data.
+
+### OpenStreetMap: Overview
+
+![][6]
+
+OpenStreetMap is a good alternative to Google Maps. You might not get the same level of information as Google Maps- but for basic navigation and traveling, OpenStreetMap is sufficient.
+
+Just like any other map, you will be able to switch between multiple layers in the map, get to know your location, and easily search for places.
+
+You may not find all the latest information for the businesses, shops, and restaurants nearby. But, for basic navigation, it’s more than enough.
+
+OpenStreetMap can be usually accessed through a web browser on both desktop and mobile by visiting the [OpenStreetMap site][7]. It does not have an official Android/iOS app yet.
+
+However, there are a variety of applications available that utilize OpenStreetMap at its core. So, if you want to utilize OpenStreetMap on a smartphone, you can take a look at some of the popular open-source Google Maps alternatives:
+
+ * [OsmAnd][8]
+ * [MAPS.ME][9]
+
+
+
+**MAPS.ME** and **OsmAnd** are two open-source applications for Android and iOS that utilize OpenStreetMap data to provide a rich user experience with a bunch of useful information and features added to it.
+
+You can also opt for other proprietary options if you wish, like [Magic Earth][10].
+
+In either case, you can take a look at the extensive list of applications on their official wiki page for [Android][11] and [iOS][12].
+
+### Using OpenStreetMap On Linux
+
+![][13]
+
+The easiest way to use OpenStreetMap on Linux is to use it in a web browser. If you use GNOME desktop environment, you can install GNOME Maps which is built on top of OpenStreetMap.
+
+There are also several software (that are mostly obsolete) that utilize OpenStreetMap on Linux for specific purposes. You can check out the list of available packages in their [official wiki list][14].
+
+### Wrapping Up
+
+OpenStreetMap may not be the best source for navigation for end users but its open source model allows it to be used freely. This means that many services can be built using OpenStreetMap. For example, [ÖPNVKarte][15] uses OpenStreetMap to display worldwide public transport facilities on a uniform map so that you don’t have to browse individual operator’s websites.
+
+What do you think about OpenStreetMap? Can you use it as a Google Maps alternative? Feel free to share your thoughts in the comments below.
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/openstreetmap/
+
+作者:[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://www.openstreetmap.org/
+[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/openstreetmap.jpg?ssl=1
+[3]: https://opendatacommons.org/licenses/odbl/
+[4]: https://operations.osmfoundation.org/policies/api/
+[5]: https://www.openstreetmap.org/copyright
+[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/open-street-map-2.jpg?ssl=1
+[7]: https://www.openstreetmap.org
+[8]: https://play.google.com/store/apps/details?id=net.osmand
+[9]: https://play.google.com/store/apps/details?id=com.mapswithme.maps.pro
+[10]: https://www.magicearth.com/
+[11]: https://wiki.openstreetmap.org/wiki/Android#OpenStreetMap_applications
+[12]: https://wiki.openstreetmap.org/wiki/Apple_iOS
+[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/open-street-map-1.jpg?ssl=1
+[14]: https://wiki.openstreetmap.org/wiki/Linux
+[15]: http://xn--pnvkarte-m4a.de/
diff --git a/sources/talk/20200317 -AI everywhere- IoT chips coming from Arm.md b/sources/talk/20200317 -AI everywhere- IoT chips coming from Arm.md
new file mode 100644
index 0000000000..a5e61bce6d
--- /dev/null
+++ b/sources/talk/20200317 -AI everywhere- IoT chips coming from Arm.md
@@ -0,0 +1,61 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: ('AI everywhere' IoT chips coming from Arm)
+[#]: via: (https://www.networkworld.com/article/3532094/ai-everywhere-iot-chips-coming-from-arm.html)
+[#]: author: (Patrick Nelson https://www.networkworld.com/author/Patrick-Nelson/)
+
+'AI everywhere' IoT chips coming from Arm
+======
+Two new microprocessors from Arm promise to miniaturize artificial intelligence.
+Healthcare
+
+Silicon microchip maker Arm is working on a new semiconductor design that it says will enable machine learning, at scale, on small sensor devices. Arm has completed testing of the technology and expects to bring it to market next year.
+
+Artificial intelligence, implemented locally on "billions and ultimately trillions" of devices is coming, the company says in a [press release][1]. Arm Holdings, owned by Japanese conglomerate Softbank, says its partners have shipped more than 160 billion Arm-based chips to date, and that 45 million of its microprocessor designs are being placed within electronics every day.
+
+The new machine-learning silicon will include micro neural processing units (microNPU) that can be used to identify speech patterns and perform other AI tasks. Importantly, the processing is accomplished on-device and in smaller form factors than have so far been available. The chips don't need the cloud or any network.
+
+[RELATED: Auto parts supplier has big plans for its nascent IoT effort][2]
+
+Arm, which historically has been behind mobile smartphone microchips, is aiming this design – the Cortex M55 processor, paired with the Ethos-U55, Arm's first microNPU – at Internet of Things instead.
+
+"Enabling AI everywhere requires device makers and developers to deliver machine learning locally on billions, and ultimately trillions of devices," said Dipti Vachani, senior vice president and general manager of Arm's automotive and IoT areas, in a statement. "With these additions to our AI platform, no device is left behind as on-device ML on the tiniest devices will be the new normal, unleashing the potential of AI securely across a vast range of life-changing applications."
+
+Arm wants to take advantage of the autonomous nature of chip-based number crunching, as opposed to doing it in the cloud. Privacy-conscious (and regulated) healthcare is an example of a vertical that might like the idea of localized processing.
+
+Functioning AI without cloud dependence isn't entirely new. Intel's [Neural Compute Stick 2][3], a $69 self-contained computer vision and deep learning development kit, doesn't need it, for example.
+
+**[ [Get certified as an Apple Technical Coordinator with this seven-part online course from PluralSight.][4] ]**
+
+Arm is also going for power savings with its new AI technology. Not requiring a data network can mean longer battery life for the sensor— only the calculated results need to be sent, rather than every bit. Much of the time, raw sensor data is irrelevant and can be discarded. Arm's new endpoint ML technologies are going to help microcontroller developers "accelerate edge inference in devices limited by size and power," said Geoff Lees, senior vice president of edge processing at IoT semiconductor company [NXP][5], in the announcement.
+
+Enabling machine learning in power-constrained settings and eliminating the need for network connectivity mean the sensor can be placed where there isn't a hardy power supply. Latency advantages and cost advantages also can come into play.
+
+"These devices can run neural network models on batteries for years, and deliver low-latency inference directly on the device," said Ian Nappier, product manager of TensorFlow Lite for Microcontrollers at Google, in a statement to Arm. [TensorFlow][6] is an open-source machine learning platform that's been used for detecting respiratory diseases, among other things.
+
+Join the Network World communities on [Facebook][7] and [LinkedIn][8] to comment on topics that are top of mind.
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3532094/ai-everywhere-iot-chips-coming-from-arm.html
+
+作者:[Patrick Nelson][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/Patrick-Nelson/
+[b]: https://github.com/lujun9972
+[1]: https://www.arm.com/company/news/2020/02/new-ai-technology-from-arm
+[2]: https://www.networkworld.com/article/3098084/internet-of-things/auto-parts-supplier-has-big-plans-for-its-nascent-iot-effort.html#tk.nww-fsb
+[3]: https://store.intelrealsense.com/buy-intel-neural-compute-stick-2.html
+[4]: https://pluralsight.pxf.io/c/321564/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fpaths%2Fapple-certified-technical-trainer-10-11
+[5]: https://www.nxp.com/company/our-company/about-nxp:ABOUT-NXP
+[6]: https://www.tensorflow.org/
+[7]: https://www.facebook.com/NetworkWorld/
+[8]: https://www.linkedin.com/company/network-world
diff --git a/sources/talk/20200319 Electronics should sweat to cool down, say researchers.md b/sources/talk/20200319 Electronics should sweat to cool down, say researchers.md
new file mode 100644
index 0000000000..ae2bce3e22
--- /dev/null
+++ b/sources/talk/20200319 Electronics should sweat to cool down, say researchers.md
@@ -0,0 +1,61 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Electronics should sweat to cool down, say researchers)
+[#]: via: (https://www.networkworld.com/article/3532827/electronics-should-sweat-to-cool-down-say-researchers.html)
+[#]: author: (Patrick Nelson https://www.networkworld.com/author/Patrick-Nelson/)
+
+Electronics should sweat to cool down, say researchers
+======
+Scientists think that in much the same way the human body releases perspiration to cool down, special materials might release water to draw heat from electronics.
+rclassenlayouts / Aleksei Derin / Getty Images
+
+Computing devices should sweat when they get too hot, say scientists at Shanghai Jiao Tong University in China, where they have developed a materials application they claim will cool down devices more efficiently and in smaller form-factors than existing fans.
+
+It’s “a coating for electronics that releases water vapor to dissipate heat from running devices,” the team explain in a news release. “Mammals sweat to regulate body temperature,” so should electronics, they believe.
+
+[[Get regularly scheduled insights by signing up for Network World newsletters.]][1]
+
+The group’s focus has been on studying porous materials that can absorb moisture from the environment and then release water vapor when warmed. MIL-101(Cr) checks the boxes, they say. The material is a metal organic framework, or MOF, which is a sorbent, a material that stores large amounts of water. The higher the water capacity one has, the greater the dissipation of heat when it's warmed.
+
+MOF projects have been attempted before. “Researchers have tried to use MOFs to extract water from the desert air,” says refrigeration-engineering scientist Ruzhu Wang, who is senior author of a paper on the university’s work that has just been [published in Joule][2].
+
+Their proof-of-concept test involved applying a micrometers-thin coating of MIL-101(Cr) to metallic substrates that resulted in temperature drops of up to 8.6 degrees Celsius for 25 minutes, according to the abstract for their paper.
+
+That’s “a significant improvement compared to that of traditional PCMs,” they say. Phase change materials (PCM) include waxes and fatty acids that are used in electronics and melt to absorb heat. They are used in smartphones, but the solid-to-liquid transition doesn’t exchange all that much energy.
+
+“In contrast, the liquid-vapor transition of water can exchange 10 times the energy compared to that of PCM solid-liquid transition.” Plus the material used recovers almost immediately to start sweating again, just like a mammal.
+
+[][3]
+
+Shanghai Jiao Tong University isn’t the only school looking into sweat for future tech. Cornell University says it wants to get robots to sweat to bring their temperature below ambient. Researchers there say they have built a 3D-printed, sweating robot muscle. It [manages its own temperature][4], and they think it will one day let robots run for extended periods without overheating.
+
+Soft robots, which are the kind preferred by many developers for their flexibility, hold more heat than metal ones. As in electronic devices such as smartphones and IoT sensors, fans aren’t ideal because they take up too much space. That’s why new materials applications are being studied.
+
+The Cornell robot group uses light to cure resin into shapes that control the flow of heat. A base layer “smart sponge” made of poly-N-isopropylacrylamide retains water and squeezes it through fabricated, dilated pores when heated. The pores then close automatically when cooled.
+
+“Just when it seemed like robots couldn’t get any cooler,” the group says.
+
+Join the Network World communities on [Facebook][5] and [LinkedIn][6] to comment on topics that are top of mind.
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3532827/electronics-should-sweat-to-cool-down-say-researchers.html
+
+作者:[Patrick Nelson][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/Patrick-Nelson/
+[b]: https://github.com/lujun9972
+[1]: https://www.networkworld.com/newsletters/signup.html
+[2]: https://www.cell.com/joule/fulltext/S2542-4351(19)30590-2
+[3]: https://www.networkworld.com/blog/itaas-and-the-corporate-storage-technology/?utm_source=IDG&utm_medium=promotions&utm_campaign=HPE22140&utm_content=sidebar (ITAAS and Corporate Storage Strategy)
+[4]: https://news.cornell.edu/stories/2020/01/researchers-create-3d-printed-sweating-robot-muscle
+[5]: https://www.facebook.com/NetworkWorld/
+[6]: https://www.linkedin.com/company/network-world
diff --git a/sources/talk/20200320 Cisco warns of five SD-WAN security weaknesses.md b/sources/talk/20200320 Cisco warns of five SD-WAN security weaknesses.md
new file mode 100644
index 0000000000..6055b6c53b
--- /dev/null
+++ b/sources/talk/20200320 Cisco warns of five SD-WAN security weaknesses.md
@@ -0,0 +1,74 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Cisco warns of five SD-WAN security weaknesses)
+[#]: via: (https://www.networkworld.com/article/3533550/cisco-warns-of-five-sd-wan-security-weaknesses.html)
+[#]: author: (Michael Cooney https://www.networkworld.com/author/Michael-Cooney/)
+
+Cisco warns of five SD-WAN security weaknesses
+======
+Cisco warnings include three high-impact SD-WAN vulnerabilities
+[Jaredd Craig][1] [(CC0)][2]
+
+Cisco has issued five warnings about security weaknesses in its [SD-WAN][3] offerings, three of them on the high-end of the vulnerability scale.
+
+The worst problem is with the command-line interface (CLI) of its [SD-WAN][4] Solution software where a weakness could let a local attacker inject arbitrary commands that are executed with root privileges, Cisco [wrote.][5]
+
+[[Get regularly scheduled insights by signing up for Network World newsletters.]][6]
+
+An attacker could exploit this vulnerability – which has a 7.8 out if 10 on the Common Vulnerability Scoring System – by authenticating to the device and submitting crafted input to the CLI utility. The attacker must be authenticated to access the CLI utility. The vulnerability is due to insufficient input validation, Cisco wrote.
+
+Another high warning problem lets an authenticated, local attacker elevate privileges to root on the underlying operating system. An attacker could exploit this vulnerability by sending a crafted request to an affected system. A successful exploit could allow the attacker to gain root-level privileges, Cisco [wrote][7]. The vulnerability is due to insufficient input validation.
+
+The third high-level vulnerability in the SD-WAN Solution software could let an attacker cause a buffer overflow on an affected device. An attacker could exploit this vulnerability by sending crafted traffic to an affected device. A successful exploit could allow the attacker to gain access to information that they are not authorized to access and make changes to the system that they are not authorized to make, Cisco [wrote][8].
+
+The vulnerabilities affect a number of Cisco products if they are running a Cisco SD-WAN Solution software release earlier than Release 19.2.2: vBond Orchestrator Software, vEdge 100-5000 Series Routers, vManage Network Management System and vSmart Controller Software.
+
+Cisco said there were no workarounds for any of the vulnerabilities and it suggested users accept automatic software updates to allay exploit risks. There are [software fixes for the problems][9] as well.
+
+**[ [Prepare to become a Certified Information Security Systems Professional with this comprehensive online course from PluralSight. Now offering a 10-day free trial!][10] ]**
+
+All three of the high-level warnings were reported to Cisco by the Orange Group, Cisco said.
+
+The other two SD-WAN Solution software warnings – with medium threat levels -- include a one that allows a cross-site scripting (XSS) attack against the web-based management interface of the vManage software and SQL injection threat.
+
+The [XXS vulnerability][11] is due to insufficient validation of user-supplied input by the web-based management interface. An attacker could exploit this vulnerability by persuading a user of the interface to click a crafted link. A successful exploit could allow the attacker to execute arbitrary script code in the context of the interface or to access sensitive, browser-based information.
+
+The SQL vulnerability exists because the web UI improperly validates SQL values. An attacker could exploit this vulnerability by authenticating to the application and sending malicious SQL queries to an affected system. A successful exploit could let the attacker modify values on, or return values from, the underlying database as well as the operating system, Cisco [wrote][12].
+
+Cisco recognized Julien Legras and Thomas Etrillard of Synacktiv for reporting the problems.
+
+The company said release 19.2.2 of the [Cisco SD-WAN Solution][13] contains fixes for all five vulnerabilities.
+
+Join the Network World communities on [Facebook][14] and [LinkedIn][15] to comment on topics that are top of mind.
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3533550/cisco-warns-of-five-sd-wan-security-weaknesses.html
+
+作者:[Michael Cooney][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/Michael-Cooney/
+[b]: https://github.com/lujun9972
+[1]: https://unsplash.com/photos/T15gG5nA9Xk
+[2]: https://creativecommons.org/publicdomain/zero/1.0/
+[3]: https://www.networkworld.com/article/3031279/sd-wan-what-it-is-and-why-you-ll-use-it-one-day.html
+[4]: https://www.networkworld.com/article/3527194/multicloud-security-integration-drive-massive-sd-wan-adoption.html
+[5]: https://tools.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-sdwclici-cvrQpH9v
+[6]: https://www.networkworld.com/newsletters/signup.html
+[7]: https://tools.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-sdwpresc-ySJGvE9
+[8]: https://tools.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-sdwanbo-QKcABnS2
+[9]: https://software.cisco.com/download/home
+[10]: https://pluralsight.pxf.io/c/321564/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fpaths%2Fcertified-information-systems-security-professional-cisspr
+[11]: https://tools.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-20200318-vmanage-xss
+[12]: https://tools.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-20200318-vmanage-cypher-inject
+[13]: https://www.cisco.com/c/en/us/solutions/enterprise-networks/sd-wan/index.html#~benefits
+[14]: https://www.facebook.com/NetworkWorld/
+[15]: https://www.linkedin.com/company/network-world
diff --git a/sources/talk/20200320 How technical debt is risking your security.md b/sources/talk/20200320 How technical debt is risking your security.md
new file mode 100644
index 0000000000..899696c7d3
--- /dev/null
+++ b/sources/talk/20200320 How technical debt is risking your security.md
@@ -0,0 +1,85 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How technical debt is risking your security)
+[#]: via: (https://opensource.com/article/20/3/remove-security-debt)
+[#]: author: (Sam Bocetta https://opensource.com/users/sambocetta)
+
+How technical debt is risking your security
+======
+A few security fixes now will help lighten the load of future developers
+using your software.
+![A lock on the side of a building][1]
+
+Everyone knows they shouldn't take shortcuts, especially in their work, and yet everyone does. Sometimes it doesn't matter, but when it comes to code development, though, it definitely does.
+
+As any experienced programmer knows, building your code the quick and dirty way soon leads to problems down the line. These issues might not be disastrous, but they incur a small penalty every time you want to develop your code further.
+
+This is the basic idea behind [technical debt][2], a term first coined by well-known programmer Ward Cunningham. Technical debt is a metaphor that explains the long-term burden developers and software teams incur when taking shortcuts, and has become a popular way to think about the extra effort that we have to do in future development because of the quick and dirty design choice.
+
+"Security Debt" is an extension of this idea, and in this article, we'll take a look at what the term means, why it is a problem, and what you can do about it.
+
+### What is security debt?
+
+To get an idea of how security debt works, we have to consider the software development lifecycle. Today, it's very rare for developers to start with a blank page, even for a new piece of software. At the very least, most programmers will start a new project with open source code copied from online repositories.
+
+They will then adapt and change this code to make their project. While they are doing this, there will be many points where they notice a security vulnerability. Something as simple as an error establishing a database connection can be an indication that systems are not playing well together, and that someone has taken a fast and dirty approach.
+
+Then they have two options: they can either take an in-depth look at the code they are working with, and fix the issue at a fundamental level, or they can quickly paste extra code over the top that gets around the problem in a quick, inefficient way.
+
+Given the demands of today's development environment, most developers choose the second route, and we can't blame them. The problem is that the next person who looks at the code is going to have to spend longer working out how it operates.
+
+Time, as we all know, is money. Because of this, each time software needs to be changed, there will be a small cost to make it secure due to previous developers taking shortcuts. This is security debt.
+
+### How security debt threatens your software
+
+There was a time when security debt was not a huge problem, at least not in the open source community. A decade ago, open source components had lifetimes measured in years and were freely available to everyone.
+
+This meant that security issues in legacy code got fixed. Today, the increased speed of the development lifecycle and the increasingly censored internet means that developers can no longer trust third party code to the degree they used to.
+
+This has led to a considerable increase in security debt for developers using open source components. Veracode's latest [State of Software Security (SOSS)][3] report found that security issues in open source software take about a month longer to be fixed than those in software that is sourced internally. Insourced software recorded the highest fix rates, but even software sourced from external contractors gets fixed faster, by about two weeks, than open source software.
+
+The ultimate outcome of this – and one that the term "security debt" captures very well – is that most companies currently face security vulnerabilities throughout their entire software stack, and these are accumulating faster than they are fixed. In other words, developers have maxed out their security debt credit card, and are drowning in the debt they've incurred. This is particularly concerning when you consider that total household debt [reached nearly $14 trillion][4] in the United States alone in 2019.
+
+### How to avoid security debt
+
+Avoiding a build-up of security debt requires that developers take a different approach to security than the one that is prevalent in the industry at the moment. Proven methods such as zero-knowledge cloud encryption, VPNs to promote online anonymity, and network intrusion prevention software are great, but they may also not be enough.
+
+In fact, there might have been some developers who were scratching their heads during our definition of security debt above: how many of us think about the next poor soul who will have to check our code for security flaws?
+
+Changing that way of thinking is key to preventing a build-up of security debt. Developers should take the time to thoroughly [check their software for security vulnerabilities][5], not just during development, but after the release as well. Fix any errors now, rather than waiting for security holes to build up.
+
+If that instruction sounds familiar, then well done. A continuity approach to software development is a critical component of [layering security through DevOps][6], and one of the pillars of the emerging discipline of DevSecOps. Along with [chaos engineering][7], these approaches seek to integrate security into development, testing, and assessment processes, and thereby prevent a build-up of security debt.
+
+Just like a credit card, the key to avoiding security debt getting out of control is to avoid the temptation to take shortcuts in the first place. That's easier said than done, of course, but one of the key lessons from recent data breaches is that legacy systems that many developers assume are secure are just as full of shortcuts as recently written code.
+
+### Measure twice, cut once
+
+Since [security by default hasn't arrived yet][8], we must all try and do things properly in the future. Taking the fast, dirty approach might mean that you get to leave the office early, but ultimately that decision will come back to bite you.
+
+If you finish early anyway, well done: you can use the time to read [our best articles on security][9] and check whether your code is as secure as you think it is.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/remove-security-debt
+
+作者:[Sam Bocetta][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/sambocetta
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/BUSINESS_3reasons.png?itok=k6F3-BqA (A lock on the side of a building)
+[2]: https://opensource.com/article/17/10/why-i-love-technical-debt
+[3]: https://www.veracode.com/state-of-software-security-report
+[4]: https://thetokenist.io/financial-statistics/
+[5]: https://opensource.com/article/17/6/3-security-musts-software-developers
+[6]: https://opensource.com/article/19/9/layered-security-devops
+[7]: https://www.infoq.com/articles/chaos-engineering-security-networking/
+[8]: https://opensource.com/article/20/1/confidential-computing
+[9]: https://opensource.com/article/19/12/security-resources
diff --git a/sources/talk/20200321 3 metrics to measure your open source community health.md b/sources/talk/20200321 3 metrics to measure your open source community health.md
new file mode 100644
index 0000000000..57e3f7ae5f
--- /dev/null
+++ b/sources/talk/20200321 3 metrics to measure your open source community health.md
@@ -0,0 +1,110 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (3 metrics to measure your open source community health)
+[#]: via: (https://opensource.com/article/20/3/community-metrics)
+[#]: author: (Kevin Xu https://opensource.com/users/kevin-xu)
+
+3 metrics to measure your open source community health
+======
+Community building is critical to the success of any open source
+project. Here's how to evaluate your community's health and strengthen
+it.
+![Green graph of measurements][1]
+
+Community building is table stakes in the success of any open source project. Even outside of open source, community is considered a competitive advantage for businesses in many industries—from retail, to gaming, to fitness. (For a deeper dive, see "[When community becomes your competitive advantage][2]" in the _Harvard Business Review_.)
+
+However, open source community building—especially offline activities—is notoriously hard to measure, track, and analyze. While we've all been to our fair share of meetups, conferences, and "summits" (and probably hosted a few of them ourselves), were they worth it? Did the community meaningfully grow? Was printing all those stickers and swags worth the money? Did we collect and track the right numbers to measure progress?
+
+To develop a better framework for measuring community, we can look to a different industry for guidance and fresh ideas: political campaigns.
+
+### My metrics start with politics
+
+I started my career in political campaigns in the US as a field organizer (aka a low-level staffer) for then-candidate Senator Obama in 2008. Thinking back, a field organizer's job is basically community building in a specifically assigned geographical area that your campaign needs to win. My day consisted of calling supporters to do volunteer activities, hosting events to gather supporters, bringing in guest speakers (called "surrogates" in politics) to events, and selling the vision and plan of our candidate (essentially our "product").
+
+Another big chunk of my day was doing data entry. We logged everything: interactions on phone conversations with voters, contact rates, event attendance, volunteer recruitment rates, volunteer show-up rates, and myriad other numbers to constantly measure our effectiveness.
+
+Regardless of your misgivings about politics in general or specific politicians, the winning campaigns that lead to political victories are all giant community-building exercises that are data-driven, meticulously measured, and constantly optimized. They are well-oiled community-building machines.
+
+When I entered the world of open source a few years ago, the community-building part felt familiar and natural. What surprised me was how little community building as an operation is quantified and measured—especially with offline activities.
+
+### Three metrics to track
+
+Taking a page from the best-run political campaigns I've seen, here are the three most important metrics for an open source community to track and optimize:
+
+ * Number of **community ambassadors**
+ * Number of **return attendees** (people who attend your activities two times or more)
+ * Rate of **churned attendees** (the percentage of people who attend your activities only once or say they will come but don't show up)
+
+
+
+If you're curious, the corresponding terms on a political campaign for these three metrics are typically community captains, super volunteers, and flake rate.
+
+#### Community ambassadors
+
+A "community ambassador" is a user or enthusiast of your project who is willing to _consistently_ host local meetups or activities where she or he lives. Growing the number of community ambassadors and supporting them with resources and guidance are core to your community's strength and scale. You can probably hire for these if you have a lot of funding, but pure volunteers speak more to your project's allure.
+
+These ambassadors should be your best friends, where you understand inside and out why they are motivated to evangelize your project in front of both peers and strangers. Their feedback on your project is also valuable and should be a critical part of your development roadmap and process. You can strategically cultivate ambassadors in different tech hubs geographically around the world, so your project can count on someone with local knowledge to reach and serve users of different business cultures with different needs. The beauty of open source is that it's global by default; take advantage of it!
+
+Some cities are arguably more of a developer hub than others. Some to consider are Amsterdam, Austin, Bangalore, Beijing, Berlin, Hangzhou, Istanbul, London, NYC, Paris, Seattle, Seoul, Shenzhen, Singapore, São Paulo, San Francisco-Bay Area, Vancouver, Tel Aviv, Tokyo, and Toronto (listed alphabetically and based on feedback I got through social media. Please add a comment if I missed any!). An example of this is the [Cloud Native Ambassadors program][3] of the Cloud Native Computing Foundation.
+
+#### Return attendees
+
+The number of return attendees is crucial to measuring the usefulness or stickiness of your community activities. Tracking return attendees is how you can draw a meaningful line between "the curious" and "the serious."
+
+Trying to grow this number should be an obvious goal. However, that's not the only goal. This is the group whose motivation you want to understand the clearest. This is the group that reflects your project's user persona. This is the group that can probably give you the most valuable feedback. This is the group that will become your future community ambassadors.
+
+Putting it differently, this is your [1,000 true fans][4] (if you can keep them).
+
+Having hosted and attended my fair share of these community meetups, my observation is that most people attend to be educated on a technical topic, look for tools to solve problems at work, or network for their next job opportunity. What they are not looking for is being "marketed to."
+
+There is a growing trend of developer community events becoming marketing events, especially when companies are flush with funding or have a strong marketing department that wants to "control the message." I find this trend troubling because it undermines community building.
+
+Thus, be laser-focused on technical education. If a developer community gets taken over by marketing campaigns, your return-attendees metric won't be pretty.
+
+#### Churned attendees rate
+
+Tracking churned attendees is the flipside of the returned-attendees coin, so I won't belabor the point. These are the people that join once and then disappear or who show interest but don't show up. They are important because they tell you what isn't working and for whom, which is more actionable than just counting the people who show up.
+
+One note of caution: Be brutally honest when measuring this number, and don't fool yourself (or others). On its own, if someone signs up but doesn't show up, it doesn't mean much. Similarly, if someone shows up once and never comes back, it doesn't mean much. Routinely sit down and assess _why_ someone isn't showing up, so you can re-evaluate and refine your community program and activities. Don't build the wrong incentives into your community-building operation to reward the wrong metric.
+
+### Value of in-person connections
+
+I purposely focused this post on measuring offline community activities because online activities are inherently more trackable and intuitive to digital-native open source creators.
+
+Offline community activities are essential to any project's journey to reaching traction and prominence. I have yet to see a successful project that does not have a sizable offline presence, regardless of its online popularity.
+
+Why is this the case? Why can't an open source community, usually born online, just stay and grow online?
+
+Because technology choice is ultimately a human decision; therefore, face-to-face interaction is an irreplaceable element of new technology adoption. No one wants to be the guinea pig. No one wants to be the first. The most effective way to not feel like the first is to literally _see_ other human beings trying out or being interested in the same thing.
+
+Being in the same room as other developers, learning about the same project, and doing that regularly is the most effective way to build trust for a project. And with trust comes traction.
+
+### These three metrics work
+
+There are other things you _can_ track, but more data does not necessarily mean clearer insight. Focusing your energy on these three metrics will make the most impact on your community-building operation. An open source community where the _number of ambassadors and return attendees are trending up_ and the _churned attendees rate is trending down_ is one that's healthy and growing in the right way.
+
+* * *
+
+_This article originally appeared on_ _[COSS Media][5]_ _and is republished with permission._
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/community-metrics
+
+作者:[Kevin Xu][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/kevin-xu
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/metrics_lead-steps-measure.png?itok=DG7rFZPk (Green graph of measurements)
+[2]: https://hbr.org/2020/01/when-community-becomes-your-competitive-advantage
+[3]: https://www.cncf.io/people/ambassadors/
+[4]: https://kk.org/thetechnium/1000-true-fans/
+[5]: https://coss.media/how-to-measure-community-building/
diff --git a/sources/talk/20200321 Coronavirus challenges capacity, but core networks are holding up.md b/sources/talk/20200321 Coronavirus challenges capacity, but core networks are holding up.md
new file mode 100644
index 0000000000..918ca93df3
--- /dev/null
+++ b/sources/talk/20200321 Coronavirus challenges capacity, but core networks are holding up.md
@@ -0,0 +1,107 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Coronavirus challenges capacity, but core networks are holding up)
+[#]: via: (https://www.networkworld.com/article/3533438/coronavirus-challenges-capacity-but-core-networks-are-holding-up.html)
+[#]: author: (Michael Cooney https://www.networkworld.com/author/Michael-Cooney/)
+
+Coronavirus challenges capacity, but core networks are holding up
+======
+COVID-19 has sent thousands of employees to work from home, placing untold stress on remote-access networks.
+Cicilie Arcurs / Getty Images
+
+As the coronavirus continues to spread and more people work from home, the impact of the increased traffic on networks in the US so far seems to be minimal.
+
+No doubt that web, VPN and data usage is growing dramatically with the [influx of remote workers][1]. For example, Verizon said it has seen a 34% increase in VPN traffic from March 10 to 17. It has also seen a 75% increase in gaming traffic, and web traffic increased by just under 20% in that time period, according to Verizon.
+
+[[Get regularly scheduled insights by signing up for Network World newsletters.]][2]
+
+Verizon said its fiber optic and wireless networks “have been able to meet the shifting demands of customers and continue to perform well. In small pockets where there has been a significant increase in usage, our engineers have quickly added capacity to meet customers’ demand.”
+
+“As we see more and more individuals work from home and students engage in online learning, it is a natural byproduct that we would see an increase in web traffic and access to VPN. And as more entertainment options are cancelled in communities across the US, an increase in video traffic and online gaming is not surprising,” said Kyle Malady, Chief Technology Officer for Verizon in a [statement][3]. “We expect these peak hour percentages to fluctuate, so our engineers are continuing to closely monitor network usage patterns 24x7 and stand ready to adjust resources as changing demands arise."
+
+As of March 16, AT&T said that its network continues to perform well. “In cities where the coronavirus has had the biggest impact, we are seeing fewer spikes in wireless usage around particular cell towers or particular times of day because more people are working from home rather than commuting to work and fewer people are gathering in large crowds at specific locations.”
+
+In Europe, Vodaphone say it has seen an 50% increase in data traffic in some markets.
+
+“COVID-19 is already having a significant impact on our services and placing a greater demand on our network,” the company said in a statement. “Our technology teams throughout Europe have been focusing on capacity across our networks to make sure they are resilient and can absorb any new usage patterns arising as more people start working from home.”
+
+[][4]
+
+In Europe there have also been indications of problems.
+
+Ireland-based [Spearline][5], which monitors international phone numbers for connectivity and audio quality, said this week that Italy's landline connection rate continues to be volatile with as much as a 10% failure rate and audio quality is running approximately 4% below normal levels.
+
+Other Spearline research says:
+
+ * Spain saw a drop in connection rates to 98.5% on March 16, but it is improving again.
+ * France saw a dip in connection rates approaching 5% on March17. Good quality has been maintained overall, though periodic slippage has been observed.
+ * Germany saw a 1.7% connection-failure rate March 17. Good quality has been maintained, though periodic slippage has been observed.
+
+
+
+Such problems are not showing up in the US at this point, Spearline said.
+
+“The US is Spearline's most tested market with test calls over three main sectors being enterprise, unified communications and carrier. To date, there has been no significant impact on either the connection rates or the audio quality on calls throughout the US,” said Matthew Lawlor, co-founder and chief technical officer at Spearline.
+
+The future impact is the real unknown of course, Lawlor said.
+
+“There are many potential issues which have happened in other countries which may have a similar impact on US infrastructure. For example, in many countries there have been hardware issues where engineers are unable to get physical access to resolve the issue,” Lawlor said. “While rerouting calls may help resolve issues it does put more pressure on other segments of your network.”
+
+On March 19, one week after the CDC declarated the virus as pandemic, data analytics and broadband vendor OpenVault wrote:
+
+ * Subscribers’ average usage from 9 a.m. to 5 p.m. has risen to 6.3 GB, 41.4% higher than the January figure of 4.4 GB.
+ * During the same period, peak-hour (6 p.m. to 11 p.m.) usage has risen 17.2% from 5.0 GB per subscriber in January to 5.87 GB in March.
+ * Overall daily usage has grown from 12.19 GB to 15.46 GB, an increase of 26.8%.
+
+
+
+Based on the current rate of growth, OpenVault projected that consumption for March will reach nearly 400 GB per subscriber, an increase of almost 11% over the previous monthly record of 361 GB, established in January. In addition, OpenVault projects a new coronavirus-influenced run rate of 460 GB per subscriber per month going forward. OpenVault’s research is based on the usage of more than 1 million broadband subscribers through the United States, the company said.
+
+“Broadband clearly is keeping the hearts of business, education and entertainment beating during this crisis,” said Mark Trudeau, CEO and founder of OpenVault in a [statement][6]. “Networks built for peak-hours consumption so far are easily handling the rise in nine-to-five business-hours usage. We’ve had concerns about peak hours consumption given the increase in streaming entertainment and the trend toward temporary cessation of bandwidth caps, but operator networks seem to be handling the additional traffic without impacting customer experiences.”
+
+Increased use of conferencing apps may affect their availability for reasons other than network capacity. For example, according to Thousand Eyes, users around the globe were unable to connect to their Zoom meetings for approximately 20 minutes on Friday due to failed DNS resolution.
+
+Others too are monitoring data traffic looking for warning signs of slowdowns. “Traffic towards video conferencing, streaming services and news, e-commerce websites has surged. We've seen growth in traffic from residential broadband networks, and a slowing of traffic from businesses and universities," wrote Louis Poinsignon a network engineer with CloudFlare in a [blog][7] about Internet traffic patterns. He noted that on March 13 when the US announced a state of emergency, CloudFlare’s US data centers served 20% more traffic than usual.
+
+Poinsignon noted that [Internet Exchange Points][8], where Internet service providers and content providers can exchange data directly (rather than via a third party) have also seen spikes in traffic. For example, Amsterdam ([AMS-IX][9]), London ([LINX][10]) and Frankfurt ([DE-CIX][11]), a 10-20% increase was seen around March 9.
+
+“Even though from time to time individual services, such as a web site or an app, have outages, the core of the Internet is robust,” Poinsignon wrote. “Traffic is shifting from corporate and university networks to residential broadband, but the Internet was designed for change.”
+
+In related news:
+
+ * Netflix said it would reduce streaming quality in Europe for at least the next 30 days to prevent the internet collapsing under the strain of unprecedented usage due to the coronavirus pandemic. "We estimate that this will reduce Netflix traffic on European networks by around 25% while also ensuring a good quality service for our members," Netflix said.
+ * DISH announced that it is providing 20 MHz of AWS-4 (Band 66) and all of its 700 MHz spectrum to AT&T at no cost for 60 days. Last week, DISH began lending its complete 600 MHz portfolio of spectrum to T-Mobile. With these two agreements, DISH has activated most of its spectrum portfolio to enhance national wireless capacity as the nation confronts the COVID-19 crisis.
+
+
+
+Join the Network World communities on [Facebook][12] and [LinkedIn][13] to comment on topics that are top of mind.
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3533438/coronavirus-challenges-capacity-but-core-networks-are-holding-up.html
+
+作者:[Michael Cooney][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/Michael-Cooney/
+[b]: https://github.com/lujun9972
+[1]: https://www.networkworld.com/article/3532440/coronavirus-challenges-remote-networking.html
+[2]: https://www.networkworld.com/newsletters/signup.html
+[3]: https://www.verizon.com/about/news/how-americans-are-spending-their-time-temporary-new-normal
+[4]: https://www.networkworld.com/blog/itaas-and-the-corporate-storage-technology/?utm_source=IDG&utm_medium=promotions&utm_campaign=HPE22140&utm_content=sidebar (ITAAS and Corporate Storage Strategy)
+[5]: https://www.spearline.com/
+[6]: http://openvault.com/covid-19-impact-driving-business-hours-broadband-consumption-up-41/
+[7]: https://blog.cloudflare.com/on-the-shoulders-of-giants-recent-changes-in-internet-traffic/
+[8]: https://en.wikipedia.org/wiki/Internet_exchange_point
+[9]: https://www.ams-ix.net/ams/documentation/total-stats
+[10]: https://portal.linx.net/stats/lans
+[11]: https://www.de-cix.net/en/locations/germany/frankfurt/statistics
+[12]: https://www.facebook.com/NetworkWorld/
+[13]: https://www.linkedin.com/company/network-world
diff --git a/sources/tech/20180306 Exploring free and open web fonts.md b/sources/tech/20180306 Exploring free and open web fonts.md
deleted file mode 100644
index 533286ca2c..0000000000
--- a/sources/tech/20180306 Exploring free and open web fonts.md
+++ /dev/null
@@ -1,70 +0,0 @@
-Exploring free and open web fonts
-======
-
-![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/osdc-lead-docdish-yellow-typewriter-keys.png?itok=0sPgIdMG)
-
-There is no question that the face of the web has been transformed in recent years by open source fonts. Prior to 2010, the only typefaces you were likely to see in a web browser were the generic "web safe" [core fonts][1] from Microsoft. But that year saw the start of several revolutions: the introduction of the Web Open Font Format ([WOFF][2]), which offered an open standard for efficiently delivering font files over HTTP, and the launch of web-font services like [Google Fonts][3] and the [Open Font Library][4]—both of which offered web publishers access to a large collection of fonts, for free, available under open licenses.
-
-It is hard to overstate the positive impact of these events on web typography. But it can be all too easy to equate the successes of open web fonts with open source typography as a whole and conclude that the challenges are behind us, the puzzles solved. That is not the case, so if you care about type, the good news is there are a lot of opportunities to get involved in improvement.
-
-For starters, it's critical to understand that Google Fonts and Open Font Library offer a specialized service—delivering fonts in web pages—and they don't implement solutions for other use cases. That is not a shortcoming on the services' side; it simply means that we have to develop other solutions.
-
-There are a number of problems to solve. Probably the most obvious example is the awkwardness of installing fonts on a desktop Linux machine for use in other applications. You can download any of the web fonts offered by either service, but all you will get is a generic ZIP file with some TTF or OTF binaries inside and a plaintext license file. What happens next is up to you to guess.
-
-Most users learn quickly that the "right" step is to manually copy those font binaries into any one of a handful of special directories on their hard drive. But that just makes the files visible to the operating system; it doesn't offer much in the way of a user experience. Again, this is not a flaw with the web-font service; rather it's evidence of the point where the service stops and more work needs to be done on the other side.
-
-A big improvement from the user's perspective would be for the OS or the desktop environment to be smarter at this "just downloaded" stage. Not only would it install the font files to the right location but, more importantly, it could add important metadata that the user will want to access when selecting a font to use in a project.
-
-What this additional information consists of and how it is presented to the user is tied to another challenge: Managing a font collection on Linux is noticeably less pleasant than on other operating systems. Periodically, font manager applications appear (see [GTK+ Font Manager][5] for one of the most recent examples), but they rarely catch on. I've been thinking a lot about where I think they come up short; one core factor is they have limited themselves to displaying only the information embedded in the font binary: basic character-set coverage, weight/width/slope settings, embedded license and copyright statements, etc.
-
-But a lot of decisions go into the process of selecting a font for a job besides what's in this embedded data. Serious font users—like information designers, journal article authors, or book designers—make their font-selection decisions in the context of each document's requirements and needs. That includes license information, naturally, but it includes much more, like information about the designer and the foundry, stylistic trends, or details about how the font works in use.
-
-For example, if your document includes both English and Arabic text, you probably want a font where the Latin and Arabic glyphs were designed together by someone experienced with the two scripts. Otherwise, you'll waste a ton of time making tiny adjustments to the font sizes and line spacing trying to get the two languages to mix well. You may have learned from experience that certain designers or vendors are better at multi-script design than others. Or it might be relevant to your project that today's fashion magazines almost exclusively use "[Didone][6]"-style typefaces, a name that refers to super-high-contrast styles pioneered by [Firmin Didot][7] and [Giambattista Bodoni][8] around 200 years ago. It just happens to be the trend.
-
-But none of those terms (Didone, Didot, or Bodoni) are likely to show up in the binary's embedded data, nor is easy to tell whether the Latin and Arabic fit together or anything else about the typeface's back history. That information might appear in supplementary material like a type specimen or font documentation—if any exists.
-
-A specimen is a designed document (often a PDF) that shows the font in use and includes background information; it frequently serves a dual role as a marketing piece and a sample to look at when choosing a font. The considered design of a specimen showcases how the font functions in practice and in a manner that an automatically generated character table simply cannot. Documentation may include some other vital information, like how to activate the font's OpenType features, what mathematical or archaic forms it provides, or how it varies stylistically across supported languages. Making this sort of material available to the user in the font-management application would go a long way towards helping users find the fonts that fit their projects' needs.
-
-Of course, if we're going to consider a font manager that can handle documentation and specimens, we also have to take a hard look at what comes with the font packages provided by distributions. Linux users start with a few fonts automatically installed, and repository-provided packages are the only font source most users have besides downloading the generic ZIP archive. Those packages tend to be pretty bare-bones. Commercial fonts generally include specimens, documentation, and other support items, whereas open source fonts usually do not.
-
-There are some excellent examples of open fonts that do provide quality specimens and documentation (see [SIL Gentium][9] and [Bungee][10] for two distinctly different but valid approaches), but they rarely (if ever) make their way into the downstream packaging chain. We plainly can do better.
-
-There are some technical obstacles to offering a richer user experience for interacting with the fonts on your system. For one thing, the [AppStream][11] metadata standard defines a few [parameters][12] specific to font files, but so far includes nothing that would cover specimens, designer and foundry information, and other relevant details. For another, the [SPDX][13] (Software Package Data Exchange) format does not cover many of the software licenses (and license variants) used to distribute fonts.
-
-Finally, as any audiophile will tell you, a music player that does not let you edit and augment the ID3 tags in your MP3 collection is going to get frustrating quickly. You want to fix errors in the tags, you want to add things like notes and album art—essentially, you want to polish your library. You would want to do the same to keep your local font library in a pleasant-to-use state.
-
-But editing the embedded data in a font file has been taboo because fonts tend to get embedded and attached to other documents. If you monkey with the fields in a font binary, then redistribute it with your presentation slides, anyone who downloads those slides can end up with bad metadata through no fault of their own. So anyone making improvements to the font-management experience will have to figure out how to strategically wrangle repeated changes to the embedded and external font metadata.
-
-In addition to the technical angle, enriching the font-management experience is also a design challenge. As I said above, good specimens and well-written documentation exist for several open fonts. But there are many more packages missing both, and there are a lot of older font packages that are no longer being maintained. That probably means the only way that most open font packages are going to get specimens or documentation is for the community to create them.
-
-Perhaps that's a tall order. But the open source design community is bigger than it has ever been, and it is a highly motivated segment of the overall free and open source software movement. So who knows; maybe this time next year finding, downloading, and using fonts on a desktop Linux system will be an entirely different experience.
-
-One train of thought on the typography challenges of modern Linux users includes packaging, document design, and maybe even a few new software components for desktop environments. There are other trains to consider, too. The commonality is that where the web-font service ends, matters get more difficult.
-
-The best news, from my perspective, is that there are more people interested in this topic than ever before. For that, I think we have the higher profile that open fonts have received from big web-font services like Google Fonts and Open Font Library to thank.
-
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/3/webfonts
-
-作者:[Nathan Willis][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/n8willis
-[1]:https://en.wikipedia.org/wiki/Core_fonts_for_the_Web
-[2]:https://en.wikipedia.org/wiki/Web_Open_Font_Format
-[3]:https://fonts.google.com/
-[4]:https://fontlibrary.org/
-[5]:https://fontmanager.github.io/
-[6]:https://en.wikipedia.org/wiki/Didone_(typography)
-[7]:https://en.wikipedia.org/wiki/Firmin_Didot
-[8]:https://en.wikipedia.org/wiki/Giambattista_Bodoni
-[9]:https://software.sil.org/gentium/
-[10]:https://djr.com/bungee/
-[11]:https://www.freedesktop.org/wiki/Distributions/AppStream/
-[12]:https://www.freedesktop.org/software/appstream/docs/sect-Metadata-Fonts.html
-[13]:https://spdx.org/
diff --git a/sources/tech/20180416 Cgo and Python.md b/sources/tech/20180416 Cgo and Python.md
index c78a820276..e5688d43c8 100644
--- a/sources/tech/20180416 Cgo and Python.md
+++ b/sources/tech/20180416 Cgo and Python.md
@@ -1,5 +1,4 @@
Cgo and Python
-[#] MonkeyDEcho translating
============================================================
![](https://datadog-prod.imgix.net/img/blog/engineering/cgo-and-python/cgo_python_hero.png?auto=format&w=1900&dpr=1)
diff --git a/sources/tech/20180522 Advanced use of the less text file viewer in Linux.md b/sources/tech/20180522 Advanced use of the less text file viewer in Linux.md
deleted file mode 100644
index 9d8ea93869..0000000000
--- a/sources/tech/20180522 Advanced use of the less text file viewer in Linux.md
+++ /dev/null
@@ -1,119 +0,0 @@
-Translating by MjSeven
-
-Advanced use of the less text file viewer in Linux
-======
-
-![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/osdc_terminals_0.png?itok=XwIRERsn)
-
-I recently read Scott Nesbitt's article "[Using less to view text files at the Linux command line][1]" and was inspired to share additional tips and tricks I use with `less`.
-
-### LESS env var
-
-If you have an environment variable `LESS` defined (e.g., in your `.bashrc`), `less` treats it as a list of options, as if passed on the command line.
-
-I use this:
-```
-LESS='-C -M -I -j 10 -# 4'
-
-```
-
-These mean:
-
- * `-C` – Make full-screen reprints faster by not scrolling from the bottom.
- * `-M` – Show more information from the last (status) line. You can customize the information shown with `-PM`, but I usually do not bother.
- * `-I` – Ignore letter case (upper/lower) in searches.
- * `-j 10` – Show search results in line 10 of the terminal, instead of the first line. This way you have 10 lines of context each time you press `n` (or `N`) to jump to the next (or previous) match.
- * `-# 4` – Jump four characters to the right or left when pressing the Right or Left arrow key. The default is to jump half of the screen, which I usually find to be too much. Generally speaking, `less` seems to be (at least partially) optimized to the environment it was initially developed in, with slow modems and low-bandwidth internet connections, when it made sense to jump half a screen.
-
-
-
-### PAGER env var
-
-Many programs show information using the command set in the `PAGER` environment variable (if it's set). So, you can set `PAGER=less` in your `.bashrc` and have your program run `less`. Check the man page environ(7) (`man 7 environ`) for other such variables.
-
-### -S
-
-`-S` tells `less` to chop long lines instead of wrapping them. I rarely find a need for this unless (and until) I've started viewing a file. Fortunately, you can type all command-line options inside `less` as if they were keyboard commands. So, if I want to chop long lines while I'm already in a file, I can simply type `-S`.
-
-The command-line optiontellsto chop long lines instead of wrapping them. I rarely find a need for this unless (and until) I've started viewing a file. Fortunately, you can type all command-line options insideas if they were keyboard commands. So, if I want to chop long lines while I'm already in a file, I can simply type
-
-Here's an example I use a lot:
-```
- su - postgres
-
- export PAGER=less # Because I didn't bother editing postgres' .bashrc on all the machines I use it on
-
- psql
-
-```
-
-Sometimes when I later view the output of a `SELECT` command with a very wide output, I type `-S` so it will be formatted nicely. If it jumps too far when I press the Right arrow to see more (because I didn't set `-#`), I can type `-#8`, then each Right arrow press will move eight characters to the right.
-
-Sometimes after typing `-S` too many times, I exit psql and run it again after entering:
-```
-export LESS=-S
-
-```
-
-### F
-
-The command `F` makes `less` work like `tail -f`—waiting until more data is added to the file before showing it. One advantage this has over `tail -f` is that highlighting search matches still works. So you can enter `less /var/log/logfile`, search for something—which will highlight all occurrences of it (unless you used `-g`)—and then press `F`. When more data is written to the log, `less` will show it and highlight the new matches.
-
-After you press `F`, you can press `Ctrl+C` to stop it from looking for new data (this will not kill it); go back into the file to see older stuff, search for other things, etc.; and then press `F` again to look at more new data.
-
-### Searching
-
-Searches use the system's regexp library, and this usually means you can use extended regular expressions. In particular, searching for `one|two|three` will find and highlight all occurrences of one, two, or three.
-
-Another pattern I use a lot, especially with wide log lines (e.g., ones that span more than one terminal line), is `.*something.*`, which highlights the entire line. This pattern makes it much easier to see where a line starts and finishes. I also combine these, such as: `.*one thing.*|.*another thing.*`, or `key: .*|.*marker.*` to see the contents of `key` (e.g., in a log file with a dump of some dictionary/hash) and highlight relevant marker lines (so I have a context), or even, if I know the value is surrounded by quotes:
-```
-key: '[^']*'|.*marker.*
-
-```
-
-`less` maintains a history of your search items and saves them to disk for future invocations. When you press `/` (or `?`), you can go through this history with the Up or Down arrow (as well as do basic line editing).
-
-I stumbled upon what seems to be a very useful feature when skimming through the `less` man page while writing this article: skipping uninteresting lines with `&!pattern`. For example, while looking for something in `/var/log/messages`, I used to iterate through this list of commands:
-```
- cat /var/log/messages | egrep -v 'systemd: Started Session' | less
-
- cat /var/log/messages | egrep -v 'systemd: Started Session|systemd: Starting Session' | less
-
- cat /var/log/messages | egrep -v 'systemd: Started Session|systemd: Starting Session|User Slice' | less
-
- cat /var/log/messages | egrep -v 'systemd: Started Session|systemd: Starting Session|User Slice|dbus' | less
-
- cat /var/log/messages | egrep -v 'systemd: Started Session|systemd: Starting Session|User Slice|dbus|PackageKit Daemon' | less
-
-```
-
-But now I know how to do the same thing within `less`. For example, I can type `&!systemd: Started Session`, then decide I want to get rid of `systemd: Starting Session`, so I add it by typing `&!` and use the Up arrow to get the previous search from the history. Then I type `|systemd: Starting Session` and press `Enter`, continuing to add more items the same way until I filter out enough to see the more interesting stuff.
-
-### =
-
-The command `=` shows more information about the file and location, even more than `-M`. If the file is very long, and calculating `=` takes too long, you can press `Ctrl+C` and it will stop trying.
-
-If the content you're viewing is from a pipe rather than a file, `=` (and `-M`) will not show what it does not know, including the number of lines and bytes in the file. To see that data, if you know that `command` will finish quickly, you can jump to the end with `G`, and then `less` will start showing that information.
-
-If you press `G` and the command writing to the pipe takes longer than expected, you can press `Ctrl+C`, and the command will be killed. Pressing `Ctrl+C` will kill it even if you didn't press `G`, so be careful not to press `Ctrl+C` accidentally if you don't intend to kill it. For this reason, if the command does something (that is, it's not only showing information), it's usually safer to write its output to a file and view the file in a separate terminal, instead of using a pipe.
-
-### Why you need less
-
-`less` is a very powerful program, and contrary to newer contenders in this space, such as `most` and `moar`, you are likely to find it on almost all the systems you use, just like `vi`. So, even if you use GUI viewers or editors, it's worth investing some time going through the `less` man page, at least to get a feeling of what's available. This way, when you need to do something that might be covered by existing functionality, you'll know to search the manual page or the internet to find what you need.
-
-For more information, visit the [less home page][2]. The site has a nice FAQ with more tips and tricks.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/5/advanced-use-less-text-file-viewer
-
-作者:[Yedidyah Bar David][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/didib
-[1]:http://opensource.com/article/18/4/using-less-view-text-files-command-line
-[2]:http://www.greenwoodsoftware.com/less/
diff --git a/sources/tech/20181105 5 Minimal Web Browsers for Linux.md b/sources/tech/20181105 5 Minimal Web Browsers for Linux.md
deleted file mode 100644
index 34c0c1e18e..0000000000
--- a/sources/tech/20181105 5 Minimal Web Browsers for Linux.md
+++ /dev/null
@@ -1,171 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: (MonkeyDEcho )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: subject: (5 Minimal Web Browsers for Linux)
-[#]: via: (https://www.linux.com/blog/intro-to-linux/2018/11/5-minimal-web-browsers-linux)
-[#]: author: (Jack Wallen https://www.linux.com/users/jlwallen)
-[#]: url: ( )
-
-5 Minimal Web Browsers for Linux
-======
-linux上的五种微型浏览器
-======
-
-![](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/minimal.jpg?itok=ifA0Y3pV)
-
-There are so many reasons to enjoy the Linux desktop. One reason I often state up front is the almost unlimited number of choices to be found at almost every conceivable level. From how you interact with the operating system (via a desktop interface), to how daemons run, to what tools you use, you have a multitude of options.
-有太多理由去选择使用linux系统。很重要的一个理由是,我们可以按照我们自己的想法去选择想要的。从操作系统的交互方式(桌面系统)到守护系统的运行方式,在到使用的工具,你用更多的选择。
-
-The same thing goes for web browsers. You can use anything from open source favorites, such as [Firefox][1] and [Chromium][2], or closed sourced industry darlings like [Vivaldi][3] and [Chrome][4]. Those options are full-fledged browsers with every possible bell and whistle you’ll ever need. For some, these feature-rich browsers are perfect for everyday needs.
-web浏览器也是如此。你可以使用开源的[火狐][1],[Chromium][2];或者未开源的[Vivaldi][3],[Chrome][4]。这些功能强大的浏览器有你需要的各种功能。对于某些人,这些功能完备的浏览器是日常必需的。
-
-There are those, however, who prefer using a web browser without all the frills. In fact, there are many reasons why you might prefer a minimal browser over a standard browser. For some, it’s about browser security, while others look at a web browser as a single-function tool (as opposed to a one-stop shop application). Still others might be running low-powered machines that cannot handle the requirements of, say, Firefox or Chrome. Regardless of the reason, Linux has you covered.
-但是,有些人更喜欢没有冗余功能的纯粹的浏览器。实际上,有很多原因导致你会选择微型的浏览器而不选择上述功能完备的浏览器。对于某些人来说,与浏览器的安全有关;而有些人则将浏览器当作一种简单的工具(而不是一站式商店应用程序);还有一些可能运行在低功率的计算机上,这些计算机无法满足火狐,chrome浏览器的运行要求。无论出于何种原因,在linux系统上都可以满足你的要求。
-
-Let’s take a look at five of the minimal browsers that can be installed on Linux. I’ll be demonstrating these browsers on the Elementary OS platform, but each of these browsers are available to nearly every distribution in the known Linuxverse. Let’s dive in.
-让我们看一下可以在linux上安装运行的五种微型浏览器。我将在 Elementary 的操作系统平台上演示这些浏览器,在已知的linux发型版中几乎每个版本都可以使用这些浏览器。让我们一起来看一下吧!
-
-### GNOME Web
-
-GNOME Web (codename Epiphany, which means [“a usually sudden manifestation or perception of the essential nature or meaning of something”][5]) is the default web browser for Elementary OS, but it can be installed from the standard repositories. (Note, however, that the recommended installation of Epiphany is via Flatpak or Snap). If you choose to install via the standard package manager, issue a command such as sudo apt-get install epiphany-browser -y for successful installation.
-GNOME web (Epiphany 含义:[顿悟][5])是Elementary系统默认的web浏览器,也可以从标准存储库中安装。(注意,建议通过使用 Flatpak 或者 Snap 工具安装),如果你想选择标准软件包管理器进行安装,请执行 ```sudo apt-get install epiphany-browser -y``` 命令成功安装。
-
-Epiphany uses the WebKit rendering engine, which is the same engine used in Apple’s Safari browser. Couple that rendering engine with the fact that Epiphany has very little in terms of bloat to get in the way, you will enjoy very fast page-rendering speeds. Epiphany development follows strict adherence to the following guidelines:
-
- * Simplicity - Feature bloat and user interface clutter are considered evil.
-
- * Standards compliance - No non-standard features will ever be introduced to the codebase.
-
- * Software freedom - Epiphany will always be released under a license that respects freedom.
-
- * Human interface - Epiphany follows the [GNOME Human Interface Guidelines][6].
-
- * Minimal preferences - Preferences are only added when they make sense and after careful consideration.
-
- * Target audience - Non-technical users are the primary target audience (which helps to define the types of features that are included).
-
-
-
-
-GNOME Web is as clean and simple a web browser as you’ll find (Figure 1).
-
-![GNOME Web][8]
-
-Figure 1: The GNOME Web browser displaying a minimal amount of preferences for the user.
-
-[Used with permission][9]
-
-The GNOME Web manifesto reads:
-
-A web browser is more than an application: it is a way of thinking, a way of seeing the world. Epiphany's principles are simplicity, standards compliance, and software freedom.
-
-### Netsurf
-
-The [Netsurf][10] minimal web browser opens almost faster than you can release the mouse button. Netsurf uses its own layout and rendering engine (designed completely from scratch), which is rather hit and miss in its rendering (Figure 2).
-
-![](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/minimalbrowsers_2.jpg?itok=KhGhIKlj)
-
-Although you might find Netsurf to suffer from rendering issues on certain sites, understand the Hubbub HTML parser is following the work-in-progress HTML5 specification, so there will be issues popup now and then. To ease those rendering headaches, Netsurf does include HTTPS support, web page thumbnailing, URL completion, scale view, bookmarks, full-screen mode, keyboard shorts, and no particular GUI toolkit requirements. That last bit is important, especially when you switch from one desktop to another.
-
-For those curious as to the requirements for Netsurf, the browser can run on a machine as slow as a 30Mhz ARM 6 computer with 16MB of RAM. That’s impressive, by today’s standard.
-
-### QupZilla
-
-If you’re looking for a minimal browser that uses the Qt Framework and the QtWebKit rendering engine, [QupZilla][11] might be exactly what you’re looking for. QupZilla does include all the standard features and functions you’d expect from a web browser, such as bookmarks, history, sidebar, tabs, RSS feeds, ad blocking, flash blocking, and CA Certificates management. Even with those features, QupZilla still manages to remain a very fast lightweight web browser. Other features include: Fast startup, speed dial homepage, built-in screenshot tool, browser themes, and more.
-One feature that should appeal to average users is that QupZilla has a more standard preferences tools than found in many lightweight browsers (Figure 3). So, if going too far outside the lines isn’t your style, but you still want something lighter weight, QupZilla is the browser for you.
-
-![QupZilla][13]
-
-Figure 3: The QupZilla preferences tool.
-
-[Used with permission][9]
-
-### Otter Browser
-
-Otter Browser is a free, open source attempt to recreate the closed-source offerings found in the Opera Browser. Otter Browser uses the WebKit rendering engine and has an interface that should be immediately familiar with any user. Although lightweight, Otter Browser does include full-blown features such as:
-
- * Passwords manager
-
- * Add-on manager
-
- * Content blocking
-
- * Spell checking
-
- * Customizable GUI
-
- * URL completion
-
- * Speed dial (Figure 4)
-
- * Bookmarks and various related features
-
- * Mouse gestures
-
- * User style sheets
-
- * Built-in Note tool
-
-
-![Otter][15]
-
-Figure 4: The Otter Browser Speed Dial tab.
-
-[Used with permission][9]
-
-Otter Browser can be run on nearly any Linux distribution from an [AppImage][16], so there’s no installation required. Just download the AppImage file, give the file executable permissions (with the command chmod u+x otter-browser-*.AppImage), and then launch the app with the command ./otter-browser*.AppImage.
-
-Otter Browser does an outstanding job of rendering websites and could function as your go-to minimal browser with ease.
-
-### Lynx
-
-Let’s get really minimal. When I first started using Linux, back in ‘97, one of the web browsers I often turned to was a text-only take on the app called [Lynx][17]. It should come as no surprise that Lynx is still around and available for installation from the standard repositories. As you might expect, Lynx works from the terminal window and doesn’t display pretty pictures or render much in the way of advanced features (Figure 5). In fact, Lynx is as bare-bones a browser as you will find available. Because of how bare-bones this web browser is, it’s not recommended for everyone. But if you happen to have a gui-less web server and you have a need to be able to read the occasional website, Lynx can be a real lifesaver.
-
-![Lynx][19]
-
-Figure 5: The Lynx browser rendering the Linux.com page.
-
-[Used with permission][9]
-
-I have also found Lynx an invaluable tool when troubleshooting certain aspects of a website (or if some feature on a website is preventing me from viewing the content in a regular browser). Another good reason to use Lynx is when you only want to view the content (and not the extraneous elements).
-
-### Plenty More Where This Came From
-
-There are plenty more minimal browsers than this. But the list presented here should get you started down the path of minimalism. One (or more) of these browsers are sure to fill that need, whether you’re running it on a low-powered machine or not.
-
-Learn more about Linux through the free ["Introduction to Linux" ][20]course from The Linux Foundation and edX.
-
---------------------------------------------------------------------------------
-
-via: https://www.linux.com/blog/intro-to-linux/2018/11/5-minimal-web-browsers-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://www.mozilla.org/en-US/firefox/new/
-[2]: https://www.chromium.org/
-[3]: https://vivaldi.com/
-[4]: https://www.google.com/chrome/
-[5]: https://www.merriam-webster.com/dictionary/epiphany
-[6]: https://developer.gnome.org/hig/stable/
-[7]: /files/images/minimalbrowsers1jpg
-[8]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/minimalbrowsers_1.jpg?itok=Q7wZLF8B (GNOME Web)
-[9]: /licenses/category/used-permission
-[10]: https://www.netsurf-browser.org/
-[11]: https://qupzilla.com/
-[12]: /files/images/minimalbrowsers3jpg
-[13]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/minimalbrowsers_3.jpg?itok=O8iMALWO (QupZilla)
-[14]: /files/images/minimalbrowsers4jpg
-[15]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/minimalbrowsers_4.jpg?itok=5bCa0z-e (Otter)
-[16]: https://sourceforge.net/projects/otter-browser/files/
-[17]: https://lynx.browser.org/
-[18]: /files/images/minimalbrowsers5jpg
-[19]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/minimalbrowsers_5.jpg?itok=p_Lmiuxh (Lynx)
-[20]: https://training.linuxfoundation.org/linux-courses/system-administration-training/introduction-to-linux
diff --git a/sources/tech/20190116 Best Audio Editors For Linux.md b/sources/tech/20190116 Best Audio Editors For Linux.md
index d588c886e2..3b14f5b366 100644
--- a/sources/tech/20190116 Best Audio Editors For Linux.md
+++ b/sources/tech/20190116 Best Audio Editors For Linux.md
@@ -1,5 +1,5 @@
[#]: collector: (lujun9972)
-[#]: translator: ( )
+[#]: translator: (MFGJT)
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
diff --git a/sources/tech/20190422 9 ways to save the planet.md b/sources/tech/20190422 9 ways to save the planet.md
deleted file mode 100644
index d3301006cc..0000000000
--- a/sources/tech/20190422 9 ways to save the planet.md
+++ /dev/null
@@ -1,96 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (9 ways to save the planet)
-[#]: via: (https://opensource.com/article/19/4/save-planet)
-[#]: author: (Jen Wike Huger https://opensource.com/users/jen-wike/users/alanfdoss/users/jmpearce)
-
-9 ways to save the planet
-======
-These ideas have an open source twist.
-![][1]
-
-What can be done to help save the planet? The question can seem depressing at a time when it feels like an individual's contribution isn't enough. But, who are we Earth dwellers if not for a collection of individuals? So, I asked our writer community to share ways that open source software or hardware can be used to make a difference. Here's what I heard back.
-
-### 9 ways to save the planet with an open source twist
-
-**1.** **Disable the blinking cursor in your terminal.**
-
-It might sound silly, but the trivial, blinking cursor can cause up to [2 watts per hour of extra power consumption][2]. To disable it, go to Terminal Settings: Edit > Preferences > Cursor > Cursor blinking > Disabled.
-
-_Recommended by Mars Toktonaliev_
-
-**2\. Reduce your consumption of animal products and processed foods.**
-
-One way to do this is to add these open source apps to your phone: Daily Dozen, OpenFoodFacts, OpenVegeMap, and Food Restrictions. These apps will help you eat a healthy, plant-based diet, find vegan- and vegetarian-friendly restaurants, and communicate your dietary needs to others, even if they do not speak the same language. To learn more about these apps read [_4 open source apps to support eating a plant-based diet_][3].
-
-_Recommendation by Joshua Allen Holm_
-
-**3\. Recycle old computers.**
-
-How? With Linux, of course. Pay it forward by giving creating a new computer for someone who can't one and keep a computer out of the landfill. Here's how we do it at [The Asian Penguins][4].
-
-_Recommendation by Stu Keroff_
-
-**4\. Turn off devices when you're not using them.**
-
-Use "smart power strips" that have a "master" outlet and several "controlled" outlets. Plug your PC into the master outlet, and when you turn on the computer, your monitor, printer, and anything else plugged into the controlled outlets turns on too. A simpler, low-tech solution is a power strip with a timer. That's what I use at home. You can use switches on the timer to set a handy schedule to turn the power on and off at specific times. Automatically turn off your network printer when no one is at home. Or for my six-year-old laptop, extend the life of the battery with a schedule to alternate when it's running from wall power (outlet is on) and when it's running from the battery (outlet is off).
-
-_Recommended by Jim Hall_
-
-**5\. Reduce the use of your HVAC system.**
-
-Sunlight shining through windows adds a lot of heat to your home during the summer. Use Home Assistant to [automatically adjust][5] window blinds and awnings [based on the time of day][6], or even based on the angle of the sun.
-
-_Recommended by Michael Hrivnak_
-
-**6\. Turn your thermostat off or to a lower setting while you're away.**
-
-If your home thermostat has an "Away" feature, activating it on your way out the door is easy to forget. With a touch of automation, any connected thermostat can begin automatically saving energy while you're not home. [Stataway][7] is one such project that uses your phone's GPS coordinates to determine when it should set your thermostat to "Home" or "Away".
-
-_Recommended by Michael Hrivnak_
-
-**7\. Save computing power for later.**
-
-I have an idea: Create a script that can read the power output from an alternative energy array (wind and solar) and begin turning on servers (taking them from a power-saving sleep mode to an active mode) in a computing cluster until the overload power is used (whatever excess is produced beyond what can be stored/buffered for later use). Then use the overload power during high-production times for compute-intensive projects like rendering. This process would be essentially free of cost because the power can't be buffered for other uses. I'm sure the monitoring, power management, and server array tools must exist to do this. Then, it's just an integration problem, making it all work together.
-
-_Recommended by Terry Hancock_
-
-**8\. Turn off exterior lights.**
-
-Light pollution affects more than 80% of the world's population, according to the [World Atlas of Artificial Night Sky Brightness][8], published (Creative Commons Attribution-NonCommercial 4.0) in 2016 in the open access journal _Science Advances_. Turning off exterior lights is a quick way to benefit wildlife, human health, our ability to enjoy the night sky, and of course energy consumption. Visit [darksky.org][9] for more ideas on how to reduce the impact of your exterior lighting.
-
-_Recommended by Michael Hrivnak_
-
-**9\. Reduce your CPU count.**
-
-For me, I remember I used to have a whole bunch of computers running in my basement as my IT playground/lab. I've become more conscious now of power consumption and so have really drastically reduced my CPU count. I like to take advantage of VMs, zones, containers... that type of technology a lot more these days. Also, I'm really glad that small form factor and SoC computers, such as the Raspberry Pi, exist because I can do a lot with one, such as run a DNS or Web server, without heating the room and running up my electricity bill.
-
-P.S. All of these computers are running Linux, FreeBSD, or Raspbian!
-
-_Recommended by Alan Formy-Duvall_
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/19/4/save-planet
-
-作者:[Jen Wike Huger ][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/jen-wike/users/alanfdoss/users/jmpearce
-[b]: https://github.com/lujun9972
-[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/pixelated-world.png?itok=fHjM6m53
-[2]: https://www.redhat.com/archives/fedora-devel-list/2009-January/msg02406.html
-[3]: https://opensource.com/article/19/4/apps-plant-based-diets
-[4]: https://opensource.com/article/19/2/asian-penguins-close-digital-divide
-[5]: https://www.home-assistant.io/docs/automation/trigger/#sun-trigger
-[6]: https://www.home-assistant.io/components/cover/
-[7]: https://github.com/mhrivnak/stataway
-[8]: http://advances.sciencemag.org/content/2/6/e1600377
-[9]: http://darksky.org/
diff --git a/sources/tech/20190503 Mirror your System Drive using Software RAID.md b/sources/tech/20190503 Mirror your System Drive using Software RAID.md
index e72f3a5722..ba62a2f21a 100644
--- a/sources/tech/20190503 Mirror your System Drive using Software RAID.md
+++ b/sources/tech/20190503 Mirror your System Drive using Software RAID.md
@@ -1,5 +1,5 @@
[#]: collector: (lujun9972)
-[#]: translator: (lixin555)
+[#]: translator: ( )
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
diff --git a/sources/tech/20190523 Run your blog on GitHub Pages with Python.md b/sources/tech/20190523 Run your blog on GitHub Pages with Python.md
index 1e3634a327..da6c13a20e 100644
--- a/sources/tech/20190523 Run your blog on GitHub Pages with Python.md
+++ b/sources/tech/20190523 Run your blog on GitHub Pages with Python.md
@@ -1,5 +1,5 @@
[#]: collector: (lujun9972)
-[#]: translator: ( )
+[#]: translator: (MjSeven)
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
diff --git a/sources/tech/20190527 How To Enable Or Disable SSH Access For A Particular User Or Group In Linux.md b/sources/tech/20190527 How To Enable Or Disable SSH Access For A Particular User Or Group In Linux.md
deleted file mode 100644
index 07cb009634..0000000000
--- a/sources/tech/20190527 How To Enable Or Disable SSH Access For A Particular User Or Group In Linux.md
+++ /dev/null
@@ -1,300 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: (way-ww)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (How To Enable Or Disable SSH Access For A Particular User Or Group In Linux?)
-[#]: via: (https://www.2daygeek.com/allow-deny-enable-disable-ssh-access-user-group-in-linux/)
-[#]: author: (2daygeek http://www.2daygeek.com/author/2daygeek/)
-
-How To Enable Or Disable SSH Access For A Particular User Or Group In Linux?
-======
-
-As per your organization standard policy, you may need to allow only the list of users that are allowed to access the Linux system.
-
-Or you may need to allow only few groups, which are allowed to access the Linux system.
-
-How to achieve this? What is the best way? How to achieve this in a simple way?
-
-Yes, there are many ways are available to perform this.
-
-However, we need to go with simple and easy method.
-
-If so, it can be done by making the necessary changes in `/etc/ssh/sshd_config` file.
-
-In this article we will show you, how to perform this in details.
-
-Why are we doing this? due to security reason. Navigate to the following URL to know more about **[openSSH][1]** usage.
-
-### What Is SSH?
-
-openssh stands for OpenBSD Secure Shell. Secure Shell (ssh) is a free open source networking tool which allow us to access remote system over an unsecured network using Secure Shell (SSH) protocol.
-
-It’s a client-server architecture. It handles user authentication, encryption, transferring files between computers and tunneling.
-
-These can be accomplished via traditional tools such as telnet or rcp, these are insecure and use transfer password in cleartext format while performing any action.
-
-### How To Allow A User To Access SSH In Linux?
-
-We can allow/enable the ssh access for a particular user or list of the users using the following method.
-
-If you would like to allow more than one user then you have to add the users with space in the same line.
-
-To do so, just append the following value into `/etc/ssh/sshd_config` file. In this example, we are going to allow ssh access for `user3`.
-
-```
-# echo "AllowUsers user3" >> /etc/ssh/sshd_config
-```
-
-You can double check this by running the following command.
-
-```
-# cat /etc/ssh/sshd_config | grep -i allowusers
-AllowUsers user3
-```
-
-That’s it. Just bounce the ssh service and see the magic.
-
-```
-# systemctl restart sshd
-
-# service restart sshd
-```
-
-Simple open a new terminal or session and try to access the Linux system with different user. Yes, `user2` isn’t allowed for SSH login and will be getting an error message as shown below.
-
-```
-# ssh [email protected]
-[email protected]'s password:
-Permission denied, please try again.
-```
-
-Output:
-
-```
-Mar 29 02:00:35 CentOS7 sshd[4900]: User user2 from 192.168.1.6 not allowed because not listed in AllowUsers
-Mar 29 02:00:35 CentOS7 sshd[4900]: input_userauth_request: invalid user user2 [preauth]
-Mar 29 02:00:40 CentOS7 unix_chkpwd[4902]: password check failed for user (user2)
-Mar 29 02:00:40 CentOS7 sshd[4900]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.1.6 user=user2
-Mar 29 02:00:43 CentOS7 sshd[4900]: Failed password for invalid user user2 from 192.168.1.6 port 42568 ssh2
-```
-
-At the same time `user3` is allowed to login into the system because it’s in allowed users list.
-
-```
-# ssh [email protected]
-[email protected]'s password:
-[[email protected] ~]$
-```
-
-Output:
-
-```
-Mar 29 02:01:13 CentOS7 sshd[4939]: Accepted password for user3 from 192.168.1.6 port 42590 ssh2
-Mar 29 02:01:13 CentOS7 sshd[4939]: pam_unix(sshd:session): session opened for user user3 by (uid=0)
-```
-
-### How To Deny Users To Access SSH In Linux?
-
-We can deny/disable the ssh access for a particular user or list of the users using the following method.
-
-If you would like to disable more than one user then you have to add the users with space in the same line.
-
-To do so, just append the following value into `/etc/ssh/sshd_config` file. In this example, we are going to disable ssh access for `user1`.
-
-```
-# echo "DenyUsers user1" >> /etc/ssh/sshd_config
-```
-
-You can double check this by running the following command.
-
-```
-# cat /etc/ssh/sshd_config | grep -i denyusers
-DenyUsers user1
-```
-
-That’s it. Just bounce the ssh service and see the magic.
-
-```
-# systemctl restart sshd
-
-# service restart sshd
-```
-
-Simple open a new terminal or session and try to access the Linux system with Deny user. Yes, `user1` is in denyusers list. So, you will be getting an error message as shown below when you are try to login.
-
-```
-# ssh [email protected]
-[email protected]'s password:
-Permission denied, please try again.
-```
-
-Output:
-
-```
-Mar 29 01:53:42 CentOS7 sshd[4753]: User user1 from 192.168.1.6 not allowed because listed in DenyUsers
-Mar 29 01:53:42 CentOS7 sshd[4753]: input_userauth_request: invalid user user1 [preauth]
-Mar 29 01:53:46 CentOS7 unix_chkpwd[4755]: password check failed for user (user1)
-Mar 29 01:53:46 CentOS7 sshd[4753]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.1.6 user=user1
-Mar 29 01:53:48 CentOS7 sshd[4753]: Failed password for invalid user user1 from 192.168.1.6 port 42522 ssh2
-```
-
-### How To Allow Groups To Access SSH In Linux?
-
-We can allow/enable the ssh access for a particular group or groups using the following method.
-
-If you would like to allow more than one group then you have to add the groups with space in the same line.
-
-To do so, just append the following value into `/etc/ssh/sshd_config` file. In this example, we are going to disable ssh access for `2g-admin` group.
-
-```
-# echo "AllowGroups 2g-admin" >> /etc/ssh/sshd_config
-```
-
-You can double check this by running the following command.
-
-```
-# cat /etc/ssh/sshd_config | grep -i allowgroups
-AllowGroups 2g-admin
-```
-
-Run the following command to know the list of the users are belongs to this group.
-
-```
-# getent group 2g-admin
-2g-admin:x:1005:user1,user2,user3
-```
-
-That’s it. Just bounce the ssh service and see the magic.
-
-```
-# systemctl restart sshd
-
-# service restart sshd
-```
-
-Yes, `user3` is allowed to login into the system because user3 is belongs to `2g-admin` group.
-
-```
-# ssh [email protected]
-[email protected]'s password:
-[[email protected] ~]$
-```
-
-Output:
-
-```
-Mar 29 02:10:21 CentOS7 sshd[5165]: Accepted password for user1 from 192.168.1.6 port 42640 ssh2
-Mar 29 02:10:22 CentOS7 sshd[5165]: pam_unix(sshd:session): session opened for user user1 by (uid=0)
-```
-
-Yes, `user2` is allowed to login into the system because user2 is belongs to `2g-admin` group.
-
-```
-# ssh [email protected]
-[email protected]'s password:
-[[email protected] ~]$
-```
-
-Output:
-
-```
-Mar 29 02:10:38 CentOS7 sshd[5225]: Accepted password for user2 from 192.168.1.6 port 42642 ssh2
-Mar 29 02:10:38 CentOS7 sshd[5225]: pam_unix(sshd:session): session opened for user user2 by (uid=0)
-```
-
-When you are try to login into the system with other users which are not part of this group then you will be getting an error message as shown below.
-
-```
-# ssh [email protected]
-[email protected]'s password:
-Permission denied, please try again.
-```
-
-Output:
-
-```
-Mar 29 02:12:36 CentOS7 sshd[5306]: User ladmin from 192.168.1.6 not allowed because none of user's groups are listed in AllowGroups
-Mar 29 02:12:36 CentOS7 sshd[5306]: input_userauth_request: invalid user ladmin [preauth]
-Mar 29 02:12:56 CentOS7 unix_chkpwd[5310]: password check failed for user (ladmin)
-Mar 29 02:12:56 CentOS7 sshd[5306]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.1.6 user=ladmin
-Mar 29 02:12:58 CentOS7 sshd[5306]: Failed password for invalid user ladmin from 192.168.1.6 port 42674 ssh2
-```
-
-### How To Deny Group To Access SSH In Linux?
-
-We can deny/disable the ssh access for a particular group or groups using the following method.
-
-If you would like to disable more than one group then you need to add the group with space in the same line.
-
-To do so, just append the following value into `/etc/ssh/sshd_config` file.
-
-```
-# echo "DenyGroups 2g-admin" >> /etc/ssh/sshd_config
-```
-
-You can double check this by running the following command.
-
-```
-# # cat /etc/ssh/sshd_config | grep -i denygroups
-DenyGroups 2g-admin
-
-# getent group 2g-admin
-2g-admin:x:1005:user1,user2,user3
-```
-
-That’s it. Just bounce the ssh service and see the magic.
-
-```
-# systemctl restart sshd
-
-# service restart sshd
-```
-
-Yes `user3` isn’t allowed to login into the system because it’s not part of `2g-admin` group. It’s in Denygroups.
-
-```
-# ssh [email protected]
-[email protected]'s password:
-Permission denied, please try again.
-```
-
-Output:
-
-```
-Mar 29 02:17:32 CentOS7 sshd[5400]: User user1 from 192.168.1.6 not allowed because a group is listed in DenyGroups
-Mar 29 02:17:32 CentOS7 sshd[5400]: input_userauth_request: invalid user user1 [preauth]
-Mar 29 02:17:38 CentOS7 unix_chkpwd[5402]: password check failed for user (user1)
-Mar 29 02:17:38 CentOS7 sshd[5400]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.1.6 user=user1
-Mar 29 02:17:41 CentOS7 sshd[5400]: Failed password for invalid user user1 from 192.168.1.6 port 42710 ssh2
-```
-
-Anyone can login into the system except `2g-admin` group. Hence, `ladmin` user is allowed to login into the system.
-
-```
-# ssh [email protected]
-[email protected]'s password:
-[[email protected] ~]$
-```
-
-Output:
-
-```
-Mar 29 02:19:13 CentOS7 sshd[5432]: Accepted password for ladmin from 192.168.1.6 port 42716 ssh2
-Mar 29 02:19:13 CentOS7 sshd[5432]: pam_unix(sshd:session): session opened for user ladmin by (uid=0)
-```
-
---------------------------------------------------------------------------------
-
-via: https://www.2daygeek.com/allow-deny-enable-disable-ssh-access-user-group-in-linux/
-
-作者:[2daygeek][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.2daygeek.com/author/2daygeek/
-[b]: https://github.com/lujun9972
-[1]: https://www.2daygeek.com/category/ssh-tutorials/
diff --git a/sources/tech/20190730 Using Python to explore Google-s Natural Language API.md b/sources/tech/20190730 Using Python to explore Google-s Natural Language API.md
index 304fd79e0a..b5f8611a1c 100644
--- a/sources/tech/20190730 Using Python to explore Google-s Natural Language API.md
+++ b/sources/tech/20190730 Using Python to explore Google-s Natural Language API.md
@@ -1,5 +1,5 @@
[#]: collector: (lujun9972)
-[#]: translator: (zhangxiangping)
+[#]: translator: ( )
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
@@ -264,7 +264,7 @@ via: https://opensource.com/article/19/7/python-google-natural-language-api
作者:[JR Oakes][a]
选题:[lujun9972][b]
-译者:[zhangxiangping](https://github.com/zhangxiangping)
+译者:[译者ID](https://github.com/译者ID)
校对:[校对者ID](https://github.com/校对者ID)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/sources/tech/20190731 How to structure a multi-file C program- Part 2.md b/sources/tech/20190731 How to structure a multi-file C program- Part 2.md
deleted file mode 100644
index 3f050b053b..0000000000
--- a/sources/tech/20190731 How to structure a multi-file C program- Part 2.md
+++ /dev/null
@@ -1,229 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: (mengxinayan)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (How to structure a multi-file C program: Part 2)
-[#]: via: (https://opensource.com/article/19/7/structure-multi-file-c-part-2)
-[#]: author: (Erik O'Shaughnessy https://opensource.com/users/jnyjny)
-
-How to structure a multi-file C program: Part 2
-======
-Dive deeper into the structure of a C program composed of multiple files
-in the second part of this article.
-![4 manilla folders, yellow, green, purple, blue][1]
-
-In [Part 1][2], I laid out the structure for a multi-file C program called [MeowMeow][3] that implements a toy [codec][4]. I also talked about the Unix philosophy of program design, laying out a number of empty files to start with a good structure from the very beginning. Lastly, I touched on what a Makefile is and what it can do for you. This article picks up where the other one left off and now I'll get to the actual implementation of our silly (but instructional) MeowMeow codec.
-
-The structure of the **main.c** file for **meow**/**unmeow** should be familiar to anyone who's read my article "[How to write a good C main function][5]." It has the following general outline:
-
-
-```
-/* main.c - MeowMeow, a stream encoder/decoder */
-
-/* 00 system includes */
-/* 01 project includes */
-/* 02 externs */
-/* 03 defines */
-/* 04 typedefs */
-/* 05 globals (but don't)*/
-/* 06 ancillary function prototypes if any */
-
-int main(int argc, char *argv[])
-{
- /* 07 variable declarations */
- /* 08 check argv[0] to see how the program was invoked */
- /* 09 process the command line options from the user */
- /* 10 do the needful */
-}
-
-/* 11 ancillary functions if any */
-```
-
-### Including project header files
-
-The second section, **/* 01 project includes /***, reads like this from the source:
-
-
-```
-/* main.c - MeowMeow, a stream encoder/decoder */
-...
-/* 01 project includes */
-#include "main.h"
-#include "mmecode.h"
-#include "mmdecode.h"
-```
-
-The **#include** directive is a C preprocessor command that causes the contents of the named file to be "included" at this point in the file. If the programmer uses double-quotes around the name of the header file, the compiler will look for that file in the current directory. If the file is enclosed in <>, it will look for the file in a set of predefined directories.
-
-The file [**main.h**][6] contains the definitions and typedefs used in [**main.c**][7]. I like to collect these things here in case I want to use those definitions elsewhere in my program.
-
-The files [**mmencode.h**][8] and [**mmdecode.h**][9] are nearly identical, so I'll break down **mmencode.h**.
-
-
-```
- /* mmencode.h - MeowMeow, a stream encoder/decoder */
-
- #ifndef _MMENCODE_H
- #define _MMENCODE_H
-
- #include <stdio.h>
-
- int mm_encode(FILE *src, FILE *dst);
-
- #endif /* _MMENCODE_H */
-```
-
-The **#ifdef, #define, #endif** construction is collectively known as a "guard." This keeps the C compiler from including this file more than once per file. The compiler will complain if it finds multiple definitions/prototypes/declarations, so the guard is a _must-have_ for header files.
-
-Inside the guard, there are only two things: an **#include** directive and a function prototype declaration. I include **stdio.h** here to bring in the definition of **FILE** that is used in the function prototype. The function prototype can be included by other C files to establish that function in the file's namespace. You can think of each file as a separate _namespace_, which means variables and functions in one file are not usable by functions or variables in another file.
-
-Writing header files is complex, and it is tough to manage in larger projects. Use guards.
-
-### MeowMeow encoding, finally
-
-The meat and potatoes of this program—encoding and decoding bytes into/out of **MeowMeow** strings—is actually the easy part of this project. All of our activities until now have been putting the scaffolding in place to support calling this function: parsing the command line, determining which operation to use, and opening the files that we'll operate on. Here is the encoding loop:
-
-
-```
- /* mmencode.c - MeowMeow, a stream encoder/decoder */
- ...
- while (![feof][10](src)) {
-
- if (![fgets][11](buf, sizeof(buf), src))
- break;
-
- for(i=0; i<[strlen][12](buf); i++) {
- lo = (buf[i] & 0x000f);
- hi = (buf[i] & 0x00f0) >> 4;
- [fputs][13](tbl[hi], dst);
- [fputs][13](tbl[lo], dst);
- }
- }
-```
-
-In plain English, this loop reads in a chunk of the file while there are chunks left to read (**feof(3)** and **fgets(3)**). Then it splits each byte in the chunk into **hi** and **lo** nibbles. Remember, a nibble is half of a byte, or 4 bits. The real magic here is realizing that 4 bits can encode 16 values. I use **hi** and **lo** as indices into a 16-string lookup table, **tbl**, that contains the **MeowMeow** strings that encode each nibble. Those strings are written to the destination **FILE** stream using **fputs(3)**, then we move on to the next byte in the buffer.
-
-The table is initialized with a macro defined in [**table.h**][14] for no particular reason except to demonstrate including another project local header file, and I like initialization macros. We will go further into why a future article.
-
-### MeowMeow decoding
-
-Alright, I'll admit it took me a couple of runs at this before I got it working. The decode loop is similar: read a buffer full of **MeowMeow** strings and reverse the encoding from strings to bytes.
-
-
-```
- /* mmdecode.c - MeowMeow, a stream decoder/decoder */
- ...
- int mm_decode(FILE *src, FILE *dst)
- {
- if (!src || !dst) {
- errno = EINVAL;
- return -1;
- }
- return stupid_decode(src, dst);
- }
-```
-
-Not what you were expecting?
-
-Here, I'm exposing the function **stupid_decode()** via the externally visible **mm_decode()** function. When I say "externally," I mean outside this file. Since **stupid_decode()** isn't in the header file, it isn't available to be called in other files.
-
-Sometimes we do this when we want to publish a solid public interface, but we aren't quite done noodling around with functions to solve a problem. In my case, I've written an I/O-intensive function that reads 8 bytes at a time from the source stream to decode 1 byte to write to the destination stream. A better implementation would work on a buffer bigger than 8 bytes at a time. A _much_ better implementation would also buffer the output bytes to reduce the number of single-byte writes to the destination stream.
-
-
-```
- /* mmdecode.c - MeowMeow, a stream decoder/decoder */
- ...
- int stupid_decode(FILE *src, FILE *dst)
- {
- char buf[9];
- decoded_byte_t byte;
- int i;
-
- while (![feof][10](src)) {
- if (![fgets][11](buf, sizeof(buf), src))
- break;
- byte.field.f0 = [isupper][15](buf[0]);
- byte.field.f1 = [isupper][15](buf[1]);
- byte.field.f2 = [isupper][15](buf[2]);
- byte.field.f3 = [isupper][15](buf[3]);
- byte.field.f4 = [isupper][15](buf[4]);
- byte.field.f5 = [isupper][15](buf[5]);
- byte.field.f6 = [isupper][15](buf[6]);
- byte.field.f7 = [isupper][15](buf[7]);
-
- [fputc][16](byte.value, dst);
- }
- return 0;
- }
-```
-
-Instead of using the bit-shifting technique I used in the encoder, I elected to create a custom data structure called **decoded_byte_t**.
-
-
-```
- /* mmdecode.c - MeowMeow, a stream decoder/decoder */
- ...
-
- typedef struct {
- unsigned char f7:1;
- unsigned char f6:1;
- unsigned char f5:1;
- unsigned char f4:1;
- unsigned char f3:1;
- unsigned char f2:1;
- unsigned char f1:1;
- unsigned char f0:1;
- } fields_t;
-
- typedef union {
- fields_t field;
- unsigned char value;
- } decoded_byte_t;
-```
-
-It's a little complex when viewed all at once, but hang tight. The **decoded_byte_t** is defined as a **union** of a **fields_t** and an **unsigned char**. The named members of a union can be thought of as aliases for the same region of memory. In this case, **value** and **field** refer to the same 8-bit region of memory. Setting **field.f0** to 1 would also set the least significant bit in **value**.
-
-While **unsigned char** shouldn't be a mystery, the **typedef** for **fields_t** might look a little unfamiliar. Modern C compilers allow programmers to specify "bit fields" in a **struct**. The field type needs to be an unsigned integral type, and the member identifier is followed by a colon and an integer that specifies the length of the bit field.
-
-This data structure makes it simple to access each bit in the byte by field name and then access the assembled value via the **value** field of the union. We depend on the compiler to generate the correct bit-shifting instructions to access the fields, which can save you a lot of heartburn when you are debugging.
-
-Lastly, **stupid_decode()** is _stupid_ because it only reads 8 bytes at a time from the source **FILE** stream. Usually, we try to minimize the number of reads and writes to improve performance and reduce our cost of system calls. Remember that reading or writing a bigger chunk less often is much better than reading/writing a lot of smaller chunks more frequently.
-
-### The wrap-up
-
-Writing a multi-file program in C requires a little more planning on behalf of the programmer than just a single **main.c**. But just a little effort up front can save a lot of time and headache when you refactor as you add functionality.
-
-To recap, I like to have a lot of files with a few short functions in them. I like to expose a small subset of the functions in those files via header files. I like to keep my constants in header files, both numeric and string constants. I _love_ Makefiles and use them instead of Bash scripts to automate all sorts of things. I like my **main()** function to handle command-line argument parsing and act as a scaffold for the primary functionality of the program.
-
-I know I've only touched the surface of what's going on in this simple program, and I'm excited to learn what things were helpful to you and which topics need better explanations. Share your thoughts in the comments to let me know.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/19/7/structure-multi-file-c-part-2
-
-作者:[Erik O'Shaughnessy][a]
-选题:[lujun9972][b]
-译者:[萌新阿岩](https://github.com/mengxinayan)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://opensource.com/users/jnyjny
-[b]: https://github.com/lujun9972
-[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/file_system.jpg?itok=pzCrX1Kc (4 manilla folders, yellow, green, purple, blue)
-[2]: https://opensource.com/article/19/7/how-structure-multi-file-c-program-part-1
-[3]: https://github.com/jnyjny/MeowMeow.git
-[4]: https://en.wikipedia.org/wiki/Codec
-[5]: https://opensource.com/article/19/5/how-write-good-c-main-function
-[6]: https://github.com/JnyJny/meowmeow/blob/master/main.h
-[7]: https://github.com/JnyJny/meowmeow/blob/master/main.c
-[8]: https://github.com/JnyJny/meowmeow/blob/master/mmencode.h
-[9]: https://github.com/JnyJny/meowmeow/blob/master/mmdecode.h
-[10]: http://www.opengroup.org/onlinepubs/009695399/functions/feof.html
-[11]: http://www.opengroup.org/onlinepubs/009695399/functions/fgets.html
-[12]: http://www.opengroup.org/onlinepubs/009695399/functions/strlen.html
-[13]: http://www.opengroup.org/onlinepubs/009695399/functions/fputs.html
-[14]: https://github.com/JnyJny/meowmeow/blob/master/table.h
-[15]: http://www.opengroup.org/onlinepubs/009695399/functions/isupper.html
-[16]: http://www.opengroup.org/onlinepubs/009695399/functions/fputc.html
diff --git a/sources/tech/20190813 Building a non-breaking breakpoint for Python debugging.md b/sources/tech/20190813 Building a non-breaking breakpoint for Python debugging.md
deleted file mode 100644
index 0cafd51c17..0000000000
--- a/sources/tech/20190813 Building a non-breaking breakpoint for Python debugging.md
+++ /dev/null
@@ -1,238 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: (caiichenr)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Building a non-breaking breakpoint for Python debugging)
-[#]: via: (https://opensource.com/article/19/8/debug-python)
-[#]: author: (Liran Haimovitch https://opensource.com/users/liranhaimovitch)
-
-Building a non-breaking breakpoint for Python debugging
-======
-Have you ever wondered how to speed up a debugger? Here are some lessons
-learned while building one for Python.
-![Real python in the graphic jungle][1]
-
-This is the story of how our team at [Rookout][2] built non-breaking breakpoints for Python and some of the lessons we learned along the way. I'll be presenting all about the nuts and bolts of debugging in Python at [PyBay 2019][3] in San Francisco this month. Let's dig in.
-
-### The heart of Python debugging: sys.set_trace
-
-There are many Python debuggers out there. Some of the more popular include:
-
- * **pdb**, part of the Python standard library
- * **PyDev**, the debugger behind the Eclipse and PyCharm IDEs
- * **ipdb**, the IPython debugger
-
-
-
-Despite the range of choices, almost every Python debugger is based on just one function: **sys.set_trace**. And let me tell you, **[sys.settrace][4]** might just be the most complex function in the Python standard library.
-
-![set_trace Python 2 docs page][5]
-
-In simpler terms, **settrace** registers a trace function for the interpreter, which may be called in any of the following cases:
-
- * Function call
- * Line execution
- * Function return
- * Exception raised
-
-
-
-A simple trace function might look like this:
-
-
-```
-def simple_tracer(frame, event, arg):
- co = frame.f_code
- func_name = co.co_name
- line_no = frame.f_lineno
- print("{e} {f} {l}".format(
-e=event, f=func_name, l=line_no))
- return simple_tracer
-```
-
-When looking at this function, the first things that come to mind are its arguments and return values. The trace function arguments are:
-
- * **frame** object, which is the full state of the interpreter at the point of the function's execution
- * **event** string, which can be **call**, **line**, **return**, or **exception**
- * **arg** object, which is optional and depends on the event type
-
-
-
-The trace function returns itself because the interpreter keeps track of two kinds of trace functions:
-
- * **Global trace function (per thread):** This trace function is set for the current thread by **sys.settrace** and is invoked whenever a new **frame** is created by the interpreter (essentially on every function call). While there's no documented way to set the trace function for a different thread, you can call **threading.settrace** to set the trace function for all newly created **threading** module threads.
- * **Local trace function (per frame):** This trace function is set by the interpreter to the value returned by the global trace function upon frame creation. There's no documented way to set the local trace function once the frame has been created.
-
-
-
-This mechanism is designed to allow the debugger to have more granular control over which frames are traced to reduce performance impact.
-
-### Building our debugger in three easy steps (or so we thought)
-
-With all that background, writing your own debugger using a custom trace function looks like a daunting task. Luckily, **pdb**, the standard Python debugger, is built on top of **Bdb**, a base class for building debuggers.
-
-A naive breakpoints debugger based on **Bdb** might look like this:
-
-
-```
-import bdb
-import inspect
-
-class Debugger(bdb.Bdb):
- def __init__(self):
- Bdb.__init__(self)
- self.breakpoints = dict()
- self.set_trace()
-
-def set_breakpoint(self, filename, lineno, method):
- self.set_break(filename, lineno)
- try :
- self.breakpoints[(filename, lineno)].add(method)
- except KeyError:
- self.breakpoints[(filename, lineno)] = [method]
-
-def user_line(self, frame):
- if not self.break_here(frame):
- return
-
- # Get filename and lineno from frame
- (filename, lineno, _, _, _) = inspect.getframeinfo(frame)
-
- methods = self.breakpoints[(filename, lineno)]
- for method in methods:
- method(frame)
-```
-
-All this does is:
-
- 1. Inherits from **Bdb** and write a simple constructor initializing the base class and tracing.
- 2. Adds a **set_breakpoint** method that uses **Bdb** to set the breakpoint and keeps track of our breakpoints.
- 3. Overrides the **user_line** method that is called by **Bdb** on certain user lines. The function makes sure it is being called for a breakpoint, gets the source location, and invokes the registered breakpoints
-
-
-
-### How well did the simple Bdb debugger work?
-
-Rookout is about bringing a debugger-like user experience to production-grade performance and use cases. So, how well did our naive breakpoint debugger perform?
-
-To test it and measure the global performance overhead, we wrote two simple test methods and executed each of them 16 million times under multiple scenarios. Keep in mind that no breakpoint was executed in any of the cases.
-
-
-```
-def empty_method():
- pass
-
-def simple_method():
- a = 1
- b = 2
- c = 3
- d = 4
- e = 5
- f = 6
- g = 7
- h = 8
- i = 9
- j = 10
-```
-
-Using the debugger takes a shocking amount of time to complete. The bad results make it clear that our naive **Bdb** debugger is not yet production-ready.
-
-![First Bdb debugger results][6]
-
-### Optimizing the debugger
-
-There are three main ways to reduce debugger overhead:
-
- 1. **Limit local tracing as much as possible:** Local tracing is very costly compared to global tracing due to the much larger number of events per line of code.
- 2. **Optimize "call" events and return control to the interpreter faster:** The main work in **call** events is deciding whether or not to trace.
- 3. **Optimize "line" events and return control to the interpreter faster:** The main work in **line** events is deciding whether or not we hit a breakpoint.
-
-
-
-So we forked **Bdb**, reduced the feature set, simplified the code, optimized for hot code paths, and got impressive results. However, we were still not satisfied. So, we took another stab at it, migrated and optimized our code to **.pyx**, and compiled it using [Cython][7]. The final results (as you can see below) were still not good enough. So, we ended up diving into CPython's source code and realizing we could not make tracing fast enough for production use.
-
-![Second Bdb debugger results][8]
-
-### Rejecting Bdb in favor of bytecode manipulation
-
-After our initial disappointment from the trial-and-error cycles of standard debugging methods, we decided to look into a less obvious option: bytecode manipulation.
-
-The Python interpreter works in two main stages:
-
- 1. **Compiling Python source code into Python bytecode:** This unreadable (for humans) format is optimized for efficient execution and is often cached in those **.pyc** files we have all come to love.
- 2. **Iterating through the bytecode in the _interpreter loop_:** This executes one instruction at a time.
-
-
-
-This is the pattern we chose: use **bytecode manipulation** to set **non-breaking breakpoints** with no global overhead. This is done by finding the bytecode in memory that represents the source line we are interested in and inserting a function call just before the relevant instruction. This way, the interpreter does not have to do any extra work to support our breakpoints.
-
-This approach is not magic. Here's a quick example.
-
-We start with a very simple function:
-
-
-```
-def multiply(a, b):
- result = a * b
- return result
-```
-
-In documentation hidden in the **[inspect][9]** module (which has several useful utilities), we learn we can get the function's bytecode by accessing **multiply.func_code.co_code**:
-
-
-```
-`'|\x00\x00|\x01\x00\x14}\x02\x00|\x02\x00S'`
-```
-
-This unreadable string can be improved using the **[dis][10]** module in the Python standard library. By calling **dis.dis(multiply.func_code.co_code)**, we get:
-
-
-```
- 4 0 LOAD_FAST 0 (a)
- 3 LOAD_FAST 1 (b)
- 6 BINARY_MULTIPLY
- 7 STORE_FAST 2 (result)
-
- 5 10 LOAD_FAST 2 (result)
- 13 RETURN_VALUE
-```
-
-This gets us closer to understanding what happens behind the scenes of debugging but not to a straightforward solution. Unfortunately, Python does not offer a method for changing a function's bytecode from within the interpreter. You can overwrite the function object, but that's not good enough for the majority of real-world debugging scenarios. You have to go about it in a roundabout way using a native extension.
-
-### Conclusion
-
-When building a new tool, you invariably end up learning a lot about how stuff works. It also makes you think out of the box and keep your mind open to unexpected solutions.
-
-Working on non-breaking breakpoints for Rookout has taught me a lot about compilers, debuggers, server frameworks, concurrency models, and much much more. If you are interested in learning more about bytecode manipulation, Google's open source **[cloud-debug-python][11]** has tools for editing bytecode.
-
-* * *
-
-_Liran Haimovitch will present "[Understanding Python’s Debugging Internals][12]" at [PyBay][3], which will be held August 17-18 in San Francisco. Use code [OpenSource35][13] for a discount when you purchase your ticket to let them know you found out about the event from our community._
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/19/8/debug-python
-
-作者:[Liran Haimovitch][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/liranhaimovitch
-[b]: https://github.com/lujun9972
-[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/python_jungle_lead.jpeg?itok=pFKKEvT- (Real python in the graphic jungle)
-[2]: https://rookout.com/
-[3]: https://pybay.com/
-[4]: https://docs.python.org/3/library/sys.html#sys.settrace
-[5]: https://opensource.com/sites/default/files/uploads/python2docs.png (set_trace Python 2 docs page)
-[6]: https://opensource.com/sites/default/files/uploads/debuggerresults1.png (First Bdb debugger results)
-[7]: https://cython.org/
-[8]: https://opensource.com/sites/default/files/uploads/debuggerresults2.png (Second Bdb debugger results)
-[9]: https://docs.python.org/2/library/inspect.html
-[10]: https://docs.python.org/2/library/dis.html
-[11]: https://github.com/GoogleCloudPlatform/cloud-debug-python
-[12]: https://pybay.com/speaker/liran-haimovitch/
-[13]: https://ti.to/sf-python/pybay2019/discount/OpenSource35
diff --git a/sources/tech/20190925 Debugging in Emacs- The Grand Unified Debugger.md b/sources/tech/20190925 Debugging in Emacs- The Grand Unified Debugger.md
deleted file mode 100644
index f1a7fe8060..0000000000
--- a/sources/tech/20190925 Debugging in Emacs- The Grand Unified Debugger.md
+++ /dev/null
@@ -1,97 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Debugging in Emacs: The Grand Unified Debugger)
-[#]: via: (https://opensourceforu.com/2019/09/debugging-in-emacs-the-grand-unified-debugger/)
-[#]: author: (Vineeth Kartha https://opensourceforu.com/author/vineeth-kartha/)
-
-Debugging in Emacs: The Grand Unified Debugger
-======
-
-[![][1]][2]
-
-_This article briefly explores the features of the Grand Unified Debugger, a debugging tool for Emacs._
-
-If you are a C/C++ developer, it is highly likely that you have crossed paths with GDB (the GNU debugger) which is, without doubt, one of the most powerful and unrivalled debuggers out there. Its only drawback is that it is command line based, and though that offers a lot of power, it is sometimes a bit restrictive as well. This is why smart people started coming up with IDEs to integrate editors and debuggers, and give them a GUI. There are still developers who believe that using the mouse reduces productivity and that mouse-click based GUIs are temptations by the devil.
-Since Emacs is one of the coolest text editors out there, I am going to show you how to write, compile and debug code without having to touch the mouse or move out of Emacs.
-
-![Figure 1: Compile command in Emacs’ mini buffer][3]
-
-![Figure 2: Compilation status][4]
-
-The Grand Unified Debugger, or GUD as it is commonly known, is an Emacs mode in which GDB can be run from within Emacs. This provides all the features of Emacs in GDB. The user does not have to move out of the editor to debug the code written.
-
-**Setting the stage for the Grand Unified Debugger**
-If you are using a Linux machine, then it is likely you will have GDB and gcc already installed. The next step is to ensure that Emacs is also installed. I am assuming that the readers are familiar with GDB and have used it at least for basic debugging. If not, please do check out some quick introductions to GDB that are widely available on the Internet.
-
-For people who are new to Emacs, let me introduce you to some basic terminology. Throughout this article, you will see shortcut commands such as C-c, M-x, etc. C means the Ctrl key and M means the Alt key. C-c means the Ctrl + c keys are pressed. If you see C-c c, it means Ctrl + c is pressed followed by c. Also, in Emacs, the main area where you edit the text is called the main buffer, and the area at the bottom of the Emacs window, where commands are entered, is called the mini buffer.
-Start Emacs and to create a new file, press _C-x C-f_. This will prompt you to enter a file name. Let us call our file ‘buggyFactorial.cpp’. Once the file is open, type in the code shown below:
-
-```
-#include
-#include
-int factorial(int num) {
-int product = 1;
-while(num--) {
-product *= num;
-}
-return product;
-}
-int main() {
-int result = factorial(5);
-assert(result == 120);
-}
-```
-
-Save the file with _C-x C-s_. Once the file is saved, it’s time to compile the code. Press _M-x_ and in the prompt that comes up, type in compile and hit Enter. Then, in the prompt, replace whatever is there with _g++ -g buggyFactorial.cpp_ and again hit _Enter_.
-
-This will open up another buffer in Emacs that will show the status of the compile and, hopefully, if the code typed in is correct, you will get a buffer like the one shown in Figure 2.
-
-To hide this compilation status buffer, make sure your cursor is in the compilation buffer (you can do this without the mouse using _C-x o_-this is used to move the cursor from one open buffer to the other), and then press _C-x 0_. The next step is to run the code and see if it works fine. Press M-! and in the mini buffer prompt, type _./a.out._
-
-See the mini buffer that says the assertion is failed. Clearly, something is wrong with the code, because the factorial (5) is 120. So let’s debug the code now.
-
-![Figure 3: Output of the code in the mini buffer][5]
-
-![Figure 4: The GDB buffer in Emacs][6]
-
-**Debugging the code using GUD**
-Now, since we have the code compiled, it’s time to see what is wrong with it. Press M-x and in the prompt, enter _gdb._ In the next prompt that appears, write _gdb -i=mi a.out_, which will start GDB in the Emacs buffer and if everything goes well, you should get the window that’s shown in Figure 4.
-At the gdb prompt, type break main and then r to run the program. This should start running the program and should break at the _main()_.
-
-As soon as GDB hits the break point at main, a new buffer will open up showing the code that you are debugging. Notice the red dot on the left side, which is where your breakpoint was set. There will be a small indicator that shows which line of the code you are on. Currently, this will be the same as the break point itself (Figure 5).
-
-![Figure 5: GDB and the code in split windows][7]
-
-![Figure 6: Show the local variables in a separate frame in Emacs][8]
-
-To debug the factorial function, we need to step into it. For this, you can either use the _gdb_ prompt and the gdb command step, or you can use the Emacs shortcut _C-c C-s_. There are other similar shortcuts, but I prefer using the GDB commands. So I will use them in the rest of this article.
-Let us keep an eye on the local variables while stepping through the factorial number. Check out Figure 6 for how to get an Emacs frame to show the local variables.
-
-Step through the code in the GDB prompt and watch the value of the local variable change. In the first iteration of the loop itself, we see a problem. The value of the product should have been 5 and not 4.
-
-This is where I leave you and now it’s up to the readers to explore and discover the magic land called GUD mode. Every gdb command works in the GUD mode as well. I leave the fix to this code as an exercise to readers. Explore and see how you can customise things to make your workflow simpler and become more productive while debugging.
-
---------------------------------------------------------------------------------
-
-via: https://opensourceforu.com/2019/09/debugging-in-emacs-the-grand-unified-debugger/
-
-作者:[Vineeth Kartha][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://opensourceforu.com/author/vineeth-kartha/
-[b]: https://github.com/lujun9972
-[1]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/09/Screenshot-from-2019-09-25-15-39-46.png?resize=696%2C440&ssl=1 (Screenshot from 2019-09-25 15-39-46)
-[2]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/09/Screenshot-from-2019-09-25-15-39-46.png?fit=800%2C506&ssl=1
-[3]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2019/09/Figure_1.png?resize=350%2C228&ssl=1
-[4]: https://i2.wp.com/opensourceforu.com/wp-content/uploads/2019/09/Figure_2.png?resize=350%2C228&ssl=1
-[5]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/09/Figure_3.png?resize=350%2C228&ssl=1
-[6]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/09/Figure_4.png?resize=350%2C227&ssl=1
-[7]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2019/09/Figure_5.png?resize=350%2C200&ssl=1
-[8]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2019/09/Figure_6.png?resize=350%2C286&ssl=1
diff --git a/sources/tech/20191031 Advance your awk skills with two easy tutorials.md b/sources/tech/20191031 Advance your awk skills with two easy tutorials.md
index 76f7a54e5f..f84e4ebe3a 100644
--- a/sources/tech/20191031 Advance your awk skills with two easy tutorials.md
+++ b/sources/tech/20191031 Advance your awk skills with two easy tutorials.md
@@ -1,5 +1,5 @@
[#]: collector: (lujun9972)
-[#]: translator: (nacyro)
+[#]: translator: ( )
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
diff --git a/sources/tech/20191111 A guide to intermediate awk scripting.md b/sources/tech/20191111 A guide to intermediate awk scripting.md
index 7e788b2adc..53e7126eb1 100644
--- a/sources/tech/20191111 A guide to intermediate awk scripting.md
+++ b/sources/tech/20191111 A guide to intermediate awk scripting.md
@@ -1,5 +1,5 @@
[#]: collector: (lujun9972)
-[#]: translator: (lnrCoder)
+[#]: translator: ( )
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
diff --git a/sources/tech/20191118 How to use regular expressions in awk.md b/sources/tech/20191118 How to use regular expressions in awk.md
index a0be0df4d7..2cf5881263 100644
--- a/sources/tech/20191118 How to use regular expressions in awk.md
+++ b/sources/tech/20191118 How to use regular expressions in awk.md
@@ -1,5 +1,5 @@
[#]: collector: (lujun9972)
-[#]: translator: (lixin555)
+[#]: translator: ( )
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
diff --git a/sources/tech/20191126 Calculator N- is an open source scientific calculator for your smartphone.md b/sources/tech/20191126 Calculator N- is an open source scientific calculator for your smartphone.md
deleted file mode 100644
index 32d467465a..0000000000
--- a/sources/tech/20191126 Calculator N- is an open source scientific calculator for your smartphone.md
+++ /dev/null
@@ -1,61 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Calculator N+ is an open source scientific calculator for your smartphone)
-[#]: via: (https://opensource.com/article/19/11/calculator-n-mobile)
-[#]: author: (Ricardo Berlasso https://opensource.com/users/rgb-es)
-
-Calculator N+ is an open source scientific calculator for your smartphone
-======
-The Android app does a wide range of advanced mathematical functions in
-the palm of your hand.
-![scientific calculator][1]
-
-Mobile phones are becoming more powerful every day, so it is no surprise that they can beat most computers from the not-so-distant past. This also means the tools available on them are getting more powerful every day.
-
-Previously, I wrote about [scientific calculators for the Linux desktop][2], and I'm following that up here with information about [Calculator N+][3], an awesome GPL v3.0-licensed computer algebra system (CAS) app for Android devices.
-
-Calculator N+ is presented as a "powerful calculator for Android," but that's a humble statement; the app not only works with arbitrary precision, displaying results with roots and fractions in all their glory, it does a _lot_ more.
-
-Finding polynomial roots? Check. Factorization? Check. Symbolic derivatives, integrals, and limits? Check. Number theory (modular arithmetic, combinatorics, prime factorization)? Check.
-
-You can also solve systems of equations, simplify expressions (including trigonometric ones), convert units… you name it!
-
-![Calculator N+ graphical interface][4]
-
-Results are output in LaTeX. The menu in the top-left provides many powerful functions ready to use with a simple touch. Also in that menu, you'll find Help files for all of the app's functions. At the top-right of the screen, you can toggle between exact and decimal representation. Finally, tapping the blue bar at the bottom of the screen gives you access to the whole library of functions available in the app. But be careful! If you are not a mathematician, physicist, or engineer, such a long list may seem overwhelming.
-
-All of this power comes from the [Symja library][5], another great GPL 3 project.
-
-Both projects are under active development, and they are getting better with each version. In particular, version 3.4.6 of Calculator N+ gets a major leap in user interface (UI) quality. And yes, there are still some rough corners here and there, but taming this much power in the tiny UI of a smartphone is a difficult task, and I think the app developers are solving its remaining issues quite well. Kudos to them!
-
-If you are a teacher, a student, or work on a STEM field, check out Calculator N+. It's free, no ads, open source, and covers all your math needs. (Except, of course, during math exams, where smartphones should never be allowed to prevent cheating.)
-
-Calculator N+ is available in the [Google Play Store][6], or you can [build it from source code][7] using the instructions on the GitHub page.
-
-If you know any other useful open source apps for science or engineering, let us know in the comments.
-
-The app makes use of the sensors on your phone and offers a digital science notebook to record your...
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/19/11/calculator-n-mobile
-
-作者:[Ricardo Berlasso][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/rgb-es
-[b]: https://github.com/lujun9972
-[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/calculator_money_currency_financial_tool.jpg?itok=2QMa1y8c (scientific calculator)
-[2]: https://opensource.com/article/18/1/scientific-calculators-linux
-[3]: https://github.com/tranleduy2000/ncalc
-[4]: https://opensource.com/sites/default/files/uploads/calculatornplus_sqrt-frac.png (Calculator N+ graphical interface)
-[5]: https://github.com/axkr/symja_android_library
-[6]: https://play.google.com/store/apps/details?id=com.duy.calculator.free
-[7]: https://github.com/tranleduy2000/ncalc/blob/master/README.md
diff --git a/sources/tech/20191223 10 articles to learn Linux your way.md b/sources/tech/20191223 10 articles to learn Linux your way.md
deleted file mode 100644
index 0ef668ad28..0000000000
--- a/sources/tech/20191223 10 articles to learn Linux your way.md
+++ /dev/null
@@ -1,96 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (10 articles to learn Linux your way)
-[#]: via: (https://opensource.com/article/19/12/learn-linux)
-[#]: author: (Seth Kenlon https://opensource.com/users/seth)
-
-10 articles to learn Linux your way
-======
-It's been a good year for Linux, so take a look back at the top 10 Linux
-articles on Opensource.com from 2019.
-![Penguins gathered together in the Artic][1]
-
-The year 2019 has been good for Linux with Opensource.com readers. Obviously, the term "Linux" itself is weighted: Does it refer to the kernel or the desktop or the ecosystem? In this look back at the top Linux articles of the year, I've intentionally taken a broad view in defining the top 10 Linux articles (for some definition of "top" and some definition of "Linux"). Here they are, offered in no particular order.
-
-### A beginner's guide to Linux permissions
-
-[_A beginner's guide to Linux permissions_][2] by Bryant Son introduces new users to the concept of file permissions with graphics and charts to illustrate each point. It can be hard to come up with visuals for concepts that are, at their core, purely text-based, and this article is friendly for the visual learners out there. I also like how Bryant stays focused. Any discussion of file permissions can lead to several related topics (like ownership and access control lists and so on), but this article is dedicated to explaining one thing and explaining it well.
-
-### Why I made the switch from Mac to Linux
-
-Matthew Broberg offers an insightful and honest look at his migration to Linux from MacOS in [_Why I made the switch from Mac to Linux_][3]. Changing platforms is always tough, and it's important to record what's behind the decision to switch. Matt's article, I think, serves several purposes, but the two most important for me: it's an invitation for the Linux community to support him by answering questions and offering potential solutions, and it's a good data point for others who are considering Linux adoption.
-
-### Troubleshooting slow WiFi on Linux
-
-In [_Troubleshooting slow WiFi on Linux_][4], David Clinton provides a useful analysis of a problem everyone has on every platform—and has tips on how to solve it. It's a good example of an "incidentally Linux" tip that not only helps everyday people with everyday problems but also shows non-Linux users how approachable troubleshooting (on any platform) is.
-
-### How GNOME uses Git
-
-[_How GNOME uses Git_][5] by Molly de Blanc takes a look behind the scenes, revealing how one of the paragons of open source software (the GNOME desktop) uses one of the other paragons of open source (Git) for development. It's always heartening to me to hear about an open source project that defaults to an open source solution for whatever needs to be done. Believe it or not, this isn't always the case, but for GNOME, it's an important and welcoming part of the project's identity.
-
-### Virtual filesystems in Linux: Why we need them and how they work
-
-Alison Chaiken masterfully explains what is considered incomprehensible to many users in [_Virtual filesystems in Linux: Why we need them and how they work_][6]. Understanding what a filesystem is and what it does is one thing, but _virtual_ ones aren't even, by definition, real. And yet Linux delivers them in a way that even casual users can benefit from, and Alison's article explains it in a way that anyone can understand. As a bonus, Alison goes even deeper in the second half of the article and demonstrates how to use bcc scripts to monitor everything she just taught you.
-
-### Understanding file paths and how to use them
-
-I thought [_Understanding file paths and how to use them_][7] was important to write about because it's a concept most users (on any platform) don't seem to be taught. It's a strange phenomenon, because now, more than ever, the _file path_ is something people see literally on a daily basis: Nearly all internet URLs contain a file path telling you exactly where within the domain you are. I often wonder why computer education doesn't start with the internet, the most familiar app of all and arguably the most heavily used supercomputer in existence, and use it to explain the appliances we interface with each day. (I guess it would help if those appliances were running Linux, but we're working on that.)
-
-### Inter-process communication in Linux
-
-[_Inter-process communication in Linux: Shared storage_][8] by Marty Kalin delves into the developer side of Linux, explaining IPC and how to interact with it in your code. I'm cheating by including this article because it's actually a three-part series, but it's the best explanation of its kind. There is very little documentation that manages to explain how Linux handles IPC, much less what IPC is, why it's important, or how to take advantage of it when programming. It's normally a topic you work your way up to in university. Now you can read all about it here instead.
-
-### Understanding system calls on Linux with strace
-
-[_Understanding system calls on Linux with strace_][9] by Gaurav Kamathe is highly technical in ways I wish that every conference talk I've ever seen about **strace** was. This is a clear and helpful demonstration of a complex but amazingly useful command. To my surprise, the command I've found myself using since this article isn't the titular command, but **ltrace** (to see which functions are called by a command). Obviously, this article's packed with information and is a handy reference for developers and QA testers.
-
-### How the Linux desktop has grown
-
-[_How the Linux desktop has grown_][10] by Jim Hall is a visual journey through the history of the Linux desktop. It starts with [TWM][11] and passes by [FVWM][12], [GNOME][13], [KDE][14], and others. If you're new to Linux, this is a fascinating history lesson from someone who was there (and has the screenshots to prove it). If you've been with Linux for many years, then this will definitely bring back memories. In the end, though, one thing is certain: Anyone who can still locate screenshots from 20 years ago is a superhuman data archivist.
-
-### Create your own video streaming server with Linux
-
-[_Create your own video streaming server with Linux_][15] by Aaron J. Prisk breaks down more than just a few preconceptions most of us have about the services we take for granted. Because services like YouTube and Twitch exist, many people assume that those are the only gateways to broadcasting video to the world. Of course, people used to think that Windows and Mac were the only gateways into computing, and that, thankfully, turned out to be a gross miscalculation. In this article, Aaron sets up a video-streaming server and even manages to find space to talk about [OBS][16] in so you can create videos to stream. Is it a fun weekend project or the start of a new career? You decide.
-
-### 10 moments that shaped Linux history
-
-[_10 moments that shaped Linux history_][17] by Alan Formy-Duval attempts the formidable task of choosing just 10 things to highlight in the history of Linux. It's an exercise in futility, of course, because there have been so many important moments, so I love how Alan filters it through his own experience. For example, when was it obvious that Linux was going to last? When Alan realized that all the systems he maintained at work were running Linux. There's a beauty to interpreting history this way because the moments of importance will differ for each person. There's no definitive list for Linux, or articles about Linux, or for open source. You make your own list, and you make yourself a part of it.
-
-### What do you want to learn?
-
-What else do you want to know about Linux? Please tell us about it in the comments, or [write an article][18] for Opensource.com about your experience with Linux.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/19/12/learn-linux
-
-作者:[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/sites/default/files/styles/image-full-size/public/lead-images/OSDC_Penguin_Image_520x292_12324207_0714_mm_v1a.png?itok=p7cWyQv9 (Penguins gathered together in the Artic)
-[2]: https://opensource.com/article/19/6/understanding-linux-permissions
-[3]: https://opensource.com/article/19/10/why-switch-mac-linux
-[4]: http://opensource.com/article/19/4/troubleshooting-wifi-linux
-[5]: https://opensource.com/article/19/10/how-gnome-uses-git
-[6]: https://opensource.com/article/19/3/virtual-filesystems-linux
-[7]: https://opensource.com/article/19/8/understanding-file-paths-linux
-[8]: https://opensource.com/article/19/4/interprocess-communication-linux-storage
-[9]: https://opensource.com/article/19/2/linux-backup-solutions
-[10]: https://opensource.com/article/19/8/how-linux-desktop-grown
-[11]: https://github.com/freedesktop/twm
-[12]: http://www.fvwm.org/
-[13]: http://gnome.org
-[14]: http://kde.org
-[15]: https://opensource.com/article/19/1/basic-live-video-streaming-server
-[16]: https://opensource.com/life/15/12/real-time-linux-video-editing-with-obs-studio
-[17]: https://opensource.com/article/19/4/top-moments-linux-history
-[18]: https://opensource.com/how-submit-article
diff --git a/sources/tech/20191223 Prioritizing simplicity in your Python code.md b/sources/tech/20191223 Prioritizing simplicity in your Python code.md
deleted file mode 100644
index 53662a8f1c..0000000000
--- a/sources/tech/20191223 Prioritizing simplicity in your Python code.md
+++ /dev/null
@@ -1,59 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Prioritizing simplicity in your Python code)
-[#]: via: (https://opensource.com/article/19/12/zen-python-simplicity-complexity)
-[#]: author: (Moshe Zadka https://opensource.com/users/moshez)
-
-Prioritizing simplicity in your Python code
-======
-This is the second part of a special series about the Zen of Python
-focusing on the third and fourth principles: simplicity and complexity.
-![Person reading a book and digital copy][1]
-
-> "Il semble que la perfection soit atteinte non quand il n'y a plus rien à ajouter, mais quand il n'y plus rien à retrancher."
->
-> "It seems that perfection is finally attained not when there is no longer anything to add, but when there is no longer anything to take away."
-> —Antoine de Saint-Exupéry, _[Terre des Hommes][2]_, 1939
-
-A common concern in programming is the struggle with complexity. It is easy for any programmer to make a program so complicated no expert can debug it or modify it. The [Zen of Python][3] would not be complete if it did not touch on this.
-
-### Simple is better than complex.
-
-When it is possible to choose at all, choose the simple solution. Python is rarely in the business of _disallowing_ things. This means it is possible, and even straightforward, to design baroque programs to solve straightforward problems.
-
-It is worthwhile to remember at each point that simplicity is one of the easiest things to lose and the hardest to regain when writing code.
-
-This can mean choosing to write something as a function, rather than introducing an extraneous class. This can mean avoiding a robust third-party library in favor of writing a two-line function that is perfect for the immediate use-case. Most often, it means avoiding predicting the future in favor of solving the problem at hand.
-
-It is much easier to change the program later, especially if simplicity and beauty were among its guiding principles than to load the code down with all possible future variations.
-
-### Complex is better than complicated.
-
-This is possibly the most misunderstood principle because understanding the precise meanings of the words is crucial. Something is _complex_ when it is composed of multiple parts. Something is _complicated_ when it has a lot of different, often hard to predict, behaviors.
-
-When solving a hard problem, it is often the case that no simple solution will do. In that case, the most Pythonic strategy is to go "bottom-up." Build simple tools and combine them to solve the problem.
-
-This is where techniques like _object composition_ shine. Instead of having a complicated inheritance hierarchy, have objects that forward some method calls to a separate object. Each of those can be tested and developed separately and then finally put together.
-
-Another example of "building up" is using [singledispatch][4], so that instead of one complicated object, we have a simple, mostly behavior-less object and separate behaviors.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/19/12/zen-python-simplicity-complexity
-
-作者:[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://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/read_book_guide_tutorial_teacher_student_apaper.png?itok=_GOufk6N (Person reading a book and digital copy)
-[2]: https://en.wikipedia.org/wiki/Wind,_Sand_and_Stars
-[3]: https://www.python.org/dev/peps/pep-0020/
-[4]: https://opensource.com/article/19/5/python-singledispatch
diff --git a/sources/tech/20191224 Why your Python code should be flat and sparse.md b/sources/tech/20191224 Why your Python code should be flat and sparse.md
deleted file mode 100644
index 0e447c5d8e..0000000000
--- a/sources/tech/20191224 Why your Python code should be flat and sparse.md
+++ /dev/null
@@ -1,87 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Why your Python code should be flat and sparse)
-[#]: via: (https://opensource.com/article/19/12/zen-python-flat-sparse)
-[#]: author: (Moshe Zadka https://opensource.com/users/moshez)
-
-Why your Python code should be flat and sparse
-======
-This is part of a special series about the Zen of Python focusing on the
-fifth and sixth principles: flatness and sparseness.
-![Digital creative of a browser on the internet][1]
-
-The [Zen of Python][2] is called that for a reason. It was never supposed to provide easy-to-follow guidelines for programming. The rules are specified tersely and are designed to engage the reader in deep thought.
-
-In order to properly appreciate the Zen of Python, you must read it and then meditate upon the meanings. If the Zen was designed to be a set of clear rules, it would be a fault that it has rules that contradict each other. However, as a tool to help you meditate on the best solution, contradictions are powerful.
-
-### Flat is better than nested.
-
-Nowhere is the pressure to be "flat" more obvious than in Python's strong insistence on indentation. Other languages will often introduce an implementation that "cheats" on the nested structure by reducing indentation requirements. To appreciate this point, let's take a look at JavaScript.
-
-JavaScript is natively async, which means that programmers write code in JavaScript using a lot of callbacks.
-
-
-```
-a(function(resultsFromA) {
- b(resultsFromA, function(resultsfromB) {
- c(resultsFromC, function(resultsFromC) {
- console.log(resultsFromC)
- }
- }
-}
-```
-
-Ignoring the code, observe the pattern and the way indentation leads to a right-most point. This distinctive "arrow" shape is tough on the eye to quickly walk through the code, so it's seen as undesirable and even nicknamed "callback hell." However, in JavaScript, it is possible to "cheat" and not have indentation reflect nesting.
-
-
-```
-a(function(resultsFromA) {
-b(resultsFromA,
- function(resultsfromB) {
-c(resultsFromC,
- function(resultsFromC) {
- console.log(resultsFromC)
-}}}
-```
-
-Python affords no such options to cheat: every nesting level in the program must be reflected in the indentation level. So deep nesting in Python _looks_ deeply nested. That makes "callback hell" was a worse problem in Python than in JavaScript: nesting callbacks mean indenting with no options to "cheat" with braces.
-
-This challenge, in combination with the Zen principle, has led to an elegant solution by a library I worked on. In the [Twisted][3] framework, we came up with the _deferred_ abstraction, which would later inspire the popular JavaScript _promise_ abstraction. In this way, Python's unwavering commitment to clear code forces Python developers to discover new, powerful abstractions.
-
-
-```
-future_value = future_result()
-future_value.addCallback(a)
-future_value.addCallback(b)
-future_value.addCallback(c)
-```
-
-(This might look familiar to modern JavaScript programmers: Promises were heavily influenced by Twisted's deferreds.)
-
-### Sparse is better than dense.
-
-The easiest way to make something less dense is to introduce nesting. This habit is why the principle of sparseness follows the previous one: after we have reduced nesting as much as possible, we are often left with _dense_ code or data structures. Density, in this sense, is jamming too much information into a small amount of code, making it difficult to decipher when something goes wrong.
-
-Reducing that denseness requires creative thinking, and there are no simple solutions. The Zen of Python does not offer simple solutions. All it offers are ways to find what can be improved in the code, without always giving guidance for "how."
-
-Take a walk. Take a shower. Smell the flowers. Sit in a lotus position and think hard, until finally, inspiration strikes. When you are finally enlightened, it is time to write the code.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/19/12/zen-python-flat-sparse
-
-作者:[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://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_web_internet_website.png?itok=g5B_Bw62 (Digital creative of a browser on the internet)
-[2]: https://www.python.org/dev/peps/pep-0020/
-[3]: https://twistedmatrix.com/trac/
diff --git a/sources/tech/20191226 10 Linux command tutorials for beginners and experts.md b/sources/tech/20191226 10 Linux command tutorials for beginners and experts.md
deleted file mode 100644
index 03fc77a8e1..0000000000
--- a/sources/tech/20191226 10 Linux command tutorials for beginners and experts.md
+++ /dev/null
@@ -1,86 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: (summer2233)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (10 Linux command tutorials for beginners and experts)
-[#]: via: (https://opensource.com/article/19/12/linux-commands)
-[#]: author: (Moshe Zadka https://opensource.com/users/moshez)
-
-10 Linux command tutorials for beginners and experts
-======
-Learn how to make Linux do what you need it to do in Opensource.com's
-top 10 articles about Linux commands from 2019.
-![Penguin driving a car with a yellow background][1]
-
-Using Linux _well_ means understanding what commands are available and what they're capable of doing for you. We have covered a lot of them on Opensource.com during 2019, and here are 10 favorites from the bunch.
-
-### Using the force at the Linux command line
-
-The Force has a light side and a dark side. Properly understanding that is crucial to true mastery. In his article [_Using the force at the Linux command line_][2], Alan Formy-Duval explains the **-f** option (also known as **\--force**) for several popular and sometimes dangerous commands.
-
-### Intro to the Linux useradd command
-
-Sharing accounts is a bad idea. Instead, give separate accounts to different people (and even different roles) with the quintessential **useradd** command. Part of his venerable series on basic Linux administration, Alan Formy-Duval provides an [_Intro to the Linux useradd command_][3], and, as usual, he explains it in _plain English_ so that both new and experienced admins can understand it.
-
-### Linux commands to display your hardware information
-
-What's _inside_ the box? Sometimes it's useful to inspect your hardware without using a screwdriver. In [_Linux commands to display your hardware information_][4], Howard Fosdick provides both popular and obscure commands to help you dig deep into the computer you're using, the computer you're testing at the store before buying, or the computer you're trying to repair.
-
-### How to encrypt files with gocryptfs on Linux
-
-Our files hold lots of private data, from social security numbers to personal letters to loved ones. In [_How to encrypt files with gocryptfs on Linux_][5], Brian "Bex" Exelbierd explains how to keep *private *what's meant to be private. As a bonus, he demonstrates encrypting files in a way that has little to no impact on your existing workflow. This isn't a complex PGP-style puzzle of key management and background key agents; this is quick, seamless, and secure file encryption.
-
-### How to use advanced rsync for large Linux backups
-
-In the New Year, many people will resolve to be more diligent about making backups. Alan Formy-Duval must have made that resolution years ago, because in [_How to use advanced rsync for large Linux backups_][6], he displays remarkable familiarity with the file synchronization command. You might not remember all the syntax right away, but the idea is to read and process the options, construct your backup command, and then automate it. That's the smart way to use **rsync**, and it's the _only_ way to do backups reliably.
-
-### Using more to view text files at the Linux command line
-
-In Scott Nesbitt's article [_Using more to view text files at the Linux command line_][7], the good old default pager **more** finally gets the spotlight. Many people install and use **less**, because it's more flexible than **more**. However, with more and more systems being implemented in the sparsest of containers, the luxury of fancy new tools like **less** or **most** sometimes just doesn't exist. Knowing and using **more** is simple, it's a common default, and it's the production system's debugging tool of last resort.
-
-### What you probably didn't know about sudo
-
-The **sudo** command is famous to a fault. People know the **sudo** term, and most of us believe we know what it does. And we're a little bit correct, but as Peter Czanik reveals in his article [_What you probably didn't know about sudo_][8], there's a lot more to the command than just "Simon says." Like that classic childhood game, the **sudo** command is powerful and also prone to silly mistakes—only with greater potential for horrible consequences. This is one game you do not want to lose!
-
-### How to program with Bash: Syntax and tools
-
-If you're a Linux, BSD, or Mac (and lately, Windows) user, you may have used the Bash shell interactively. It's a great shell for quick, one-off commands, which is why so many Linux users love to use it as their primary user interface. However, Bash is much more than just a command prompt. It's also a programming language, and if you're already using Bash commands, then the path to automation has never been more straightforward. Learn all about it in David Both's excellent [_How to program with Bash: Syntax and tools_][9].
-
-### Master the Linux ls command
-
-The **ls** command is one of those commands that merits a two-letter name; one-letter commands are an optimization for slow terminals where each letter causes a significant delay and also a nice bonus for lazy typists. Seth Kenlon explains how you can [_Master the Linux ls command_][10] and he does so with his usual clarity and pragmatism. Most significantly, in a system where "everything is a file," being able to list the files is crucial.
-
-### Getting started with the Linux cat command
-
-The **cat** command (short for con_cat_enate) is deceptively simple. Whether you use it to quickly see the contents of a file or to pipe the contents to another command, you may not be using **cat** to its full potential. Alan Formy-Duval's elucidating [_Getting started with the Linux cat command_][11] offers new ideas to take advantage of a command that lets you open a file without feeling like you've opened it. As a bonus, learn all about **zcat** so you can decompress files without all the trouble of decompression! It's a small and simple thing, but _this_ is what makes Linux great.
-
-### Continue the journey
-
-Don't let Opensource.com's 10 best articles about Linux commands of 2019 be the end of your journey. There's much more to discover about Linux and its versatile prompt, so stay tuned in 2020 for more insights. And, if there's a Linux command you want us to know about, please tell us about it in the comments, or share your knowledge with Opensource.com readers by [submitting an article][12] about your favorite Linux command.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/19/12/linux-commands
-
-作者:[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://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/car-penguin-drive-linux-yellow.png?itok=twWGlYAc (Penguin driving a car with a yellow background)
-[2]: https://opensource.com/article/19/5/may-the-force-linux
-[3]: https://opensource.com/article/19/10/linux-useradd-command
-[4]: https://opensource.com/article/19/9/linux-commands-hardware-information
-[5]: https://opensource.com/article/19/8/how-encrypt-files-gocryptfs
-[6]: https://opensource.com/article/19/5/advanced-rsync
-[7]: https://opensource.com/article/19/1/more-text-files-linux
-[8]: https://opensource.com/article/19/10/know-about-sudo
-[9]: https://opensource.com/article/19/10/programming-bash-syntax-tools
-[10]: https://opensource.com/article/19/7/master-ls-command
-[11]: https://opensource.com/article/19/2/getting-started-cat-command
-[12]: https://opensource.com/how-submit-article
diff --git a/sources/tech/20200107 Kali Linux Will No Longer Have The Default Root User.md b/sources/tech/20200107 Kali Linux Will No Longer Have The Default Root User.md
deleted file mode 100644
index 0f087529b9..0000000000
--- a/sources/tech/20200107 Kali Linux Will No Longer Have The Default Root User.md
+++ /dev/null
@@ -1,87 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: (BrunoJu)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Kali Linux Will No Longer Have The Default Root User)
-[#]: via: (https://itsfoss.com/kali-linux-root-user/)
-[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
-
-Kali Linux Will No Longer Have The Default Root User
-======
-
-Kali Linux is a specialized Linux distribution for cyber security testing and hacking related tasks.
-
-If you’ve used [Kali Linux][1], you probably know that it followed a default root user policy. In other words, you are always root in Kali Linux. Whatever you do – you will be accessing tools/applications as root by default.
-
-It looks like everything back then was kind of “root for all” for everything. So, the default root user policy existed.
-
-They also explained the history for this in their [announcement post][2]:
-
-> A lot of those tools back then either required root access to run or ran better when ran as root. With this operating system that would be ran from a CD, never be updated, and had a lot of tools that needed root access to run it was a simple decision to have a “everything as root” security model. It made complete sense for the time.
-
-### Kali Linux will now have a default non-root user (like most other distributions)
-
-![][3]
-
-A default non-root model was necessary because a lot of users now use Kali Linux as their daily driver.
-
-Of course, they [do not recommend using Kali Linux][4] as a replacement for stable distributions like Ubuntu/Fedora/Manjaro – however, with its active development, some users do consider using it on a day-to-day basis instead of just using it for its tools.
-
-So, with a wide mainstream usage of the distro, the Kali Linux team thought of switching to a default non-root model because nowadays a lot of applications/tools do not require root access.
-
-> While we don’t encourage people to run Kali as their day to day operating system, over the last few years more and more users have started to do so _(even if they are not using it to do penetration testing full time)_, including some members of the Kali development team. When people do so, they obviously don’t run as default root user. With this usage over time, there is the obvious conclusion that default root user is no longer necessary and Kali will be better off moving to a more traditional security model.
-
-So I am reiterating that you should not consider Kali Linux to be fit for your daily tasks if you do not utilize security-related [Kali Linux tools][5]. Feel free to experiment – but I wouldn’t be so sure to rely on it.
-
-So from the next release, when you install Kali Linux, you’ll be asked to create non-root user that will have admin privileges. Tools and commands that require root access will be run with sudo.
-
-![][6]
-
-#### [Pretend to be Using Windows with Kali Linux Undercover Mode][7]
-
-The new undercover mode in Kali Linux switches the desktop layout to make it look like Windows 10. Find out how to activate the undercover mode.
-
-### New default user and password for Kali Linux live mode
-
-![Kali Linux has new user-password in the live system][8]
-
-Technically, you won’t find a groundbreaking difference. Just note that the default user ID and password in live mode is “**kali**“.
-
-You can find the new non-root model implemented in the new daily/weekly builds if you want to test it early.
-
-In either case, you can wait for the 2020.1 release scheduled for late January to take a look at the new default non-root user model.
-
-### Getting back the old root model in Kali Linux
-
-If you are a long time Kali Linux user, you may not find it convenient to add sudo before commands and then manually enter the password.
-
-The good news here is that you can still get the old password-less root rights with this command:
-
-```
-sudo dpkg-reconfigure kali-grant-root
-```
-
-What do you think about the default non-root user model? Is it a good decision? Let me know your thoughts in the comments.
-
---------------------------------------------------------------------------------
-
-via: https://itsfoss.com/kali-linux-root-user/
-
-作者:[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://www.kali.org/
-[2]: https://www.kali.org/news/kali-default-non-root-user/
-[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/01/kali_linux_default_root_user.png?ssl=1
-[4]: https://itsfoss.com/kali-linux-review/
-[5]: https://itsfoss.com/best-kali-linux-tools/
-[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/11/kali_linux_undercover_mode.jpg?fit=800%2C450&ssl=1
-[7]: https://itsfoss.com/kali-linux-undercover-mode/
-[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/01/kali-linux-live-password.png?ssl=1
diff --git a/sources/tech/20200130 4 open source productivity tools on my wishlist.md b/sources/tech/20200130 4 open source productivity tools on my wishlist.md
deleted file mode 100644
index d36f020aa3..0000000000
--- a/sources/tech/20200130 4 open source productivity tools on my wishlist.md
+++ /dev/null
@@ -1,76 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (4 open source productivity tools on my wishlist)
-[#]: via: (https://opensource.com/article/20/1/open-source-productivity-tools)
-[#]: author: (Kevin Sonney https://opensource.com/users/ksonney)
-
-4 open source productivity tools on my wishlist
-======
-Find out what the open source world needs to work on in the final
-article in our series on 20 ways to be more productive with open source
-in 2020.
-![Two diverse hands holding a globe][1]
-
-Last year, I brought you 19 days of new (to you) productivity tools for 2019. This year, I'm taking a different approach: building an environment that will allow you to be more productive in the new year, using tools you may or may not already be using.
-
-### But what about…
-
-When searching for productivity apps, I never find everything I want, and I almost always miss something great that my readers share with me. So, as I bring this series to a close, it's time [again][2] to talk about some of the topics I failed to cover in this year's series.
-
-![Desktop with Joplin, Emacs, and Firefox][3]
-
-#### Chatting in Vim
-
-I tried. I really, _really_ tried to get chat to work in Vim, but it was not to be. The one package I was able to find, [VimIRC.vim][4], never did work for me, and I tried for a few days to no avail. The other option I explored was [Irc it][5], which requires a lot more [effort to set up][6] than I could fit into my available space or time. I tried, I really did, and for the Vim users out there, I'm sorry I wasn't able to get something workable for you.
-
-#### Org mode
-
-![Org Mode in Emacs][7]
-
-I love [Org Mode][8], and I use it daily. I could spend several days _just_ talking about Org. It provides basic [task tracking][9]; Google [calendar][10] sync and [CalFW][11] integration; rich text documents, websites, and presentations; linking to all the things; and; and; and…
-
-I expect you will hear more from me about Org in 2020 because it really is pretty cool.
-
-#### GUI programs
-
-In 2019's productivity series, I shared a lot of programs with a graphical user interface (GUI), and this year almost all are command-line applications. There are some great graphical programs to help with some of the things I talked about this year—[mail][12] programs to talk to Maildir mailboxes, calendar programs to read local calendar files, [weather][13] apps, and so on. I even tried several new-to-me things to see if they would fit with the overall theme. With the exception of [twin][14], I didn't feel that there were any GUI programs that were new (to me) or notable (again, to me) to write about this year. And that brings me to…
-
-#### Mobile
-
-More and more people are using tablets (sometimes in conjunction with a laptop) as their primary device. I use my phone for most of my social media and instant messaging, and, more often than not, I use my tablet (OK, let's be honest, _tablets_) to read or browse the web. It isn't that open source mobile apps aren't out there, that's for sure, but they didn't fit with my themes this year. There is a lot going on with open source and mobile apps, and I'm watching carefully for things that can help me be more productive on my phone and tablet.
-
-### Your turn
-
-Thank you very much for reading the series this year. Please comment with what you think I missed or need to look at for 2021. And as I say on the [Productivity Alchemy][15] podcast: "Remember folks: Stay productive!"
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/20/1/open-source-productivity-tools
-
-作者:[Kevin Sonney][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://opensource.com/users/ksonney
-[b]: https://github.com/lujun9972
-[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/world_hands_diversity.png?itok=zm4EDxgE (Two diverse hands holding a globe)
-[2]: https://opensource.com/article/19/1/productivity-tool-wish-list
-[3]: https://opensource.com/sites/default/files/uploads/productivity_20-1.png (Desktop with Joplin, Emacs, and Firefox)
-[4]: https://github.com/vim-scripts/VimIRC.vim
-[5]: https://tools.suckless.org/ii/
-[6]: https://www.reddit.com/r/vim/comments/48t7ws/vim_ii_irc_client_xpost_runixporn/d0macnl/
-[7]: https://opensource.com/sites/default/files/uploads/productivity_20-2.png (Org Mode in Emacs)
-[8]: https://orgmode.org/
-[9]: https://opensource.com/article/20/1/open-source-to-do-list
-[10]: https://opensource.com/article/20/1/open-source-calendar
-[11]: https://github.com/kiwanami/emacs-calfw
-[12]: https://opensource.com/article/20/1/organize-email-notmuch
-[13]: https://opensource.com/article/20/1/open-source-weather-forecast
-[14]: https://github.com/cosmos72/twin
-[15]: https://productivityalchemy.com
diff --git a/sources/tech/20200204 DevOps vs Agile- What-s the difference.md b/sources/tech/20200204 DevOps vs Agile- What-s the difference.md
deleted file mode 100644
index ec49c22c92..0000000000
--- a/sources/tech/20200204 DevOps vs Agile- What-s the difference.md
+++ /dev/null
@@ -1,170 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (DevOps vs Agile: What's the difference?)
-[#]: via: (https://opensource.com/article/20/2/devops-vs-agile)
-[#]: author: (Taz Brown https://opensource.com/users/heronthecli)
-
-DevOps vs Agile: What's the difference?
-======
-The difference between the two is what happens after development.
-![Pair programming][1]
-
-Early on, software development didn't really fit under a particular management umbrella. Then along came [waterfall][2], which spoke to the idea that software development could be defined by the length of time an application took to create or build.
-
-Back then, it often took long periods of time to create, test, and deploy software because there were no checks and balances during the development process. The results were poor software quality with defects and bugs and unmet timelines. The focus was on long, drawn-out plans for software projects.
-
-Waterfall projects have been associated with the [triple constraint][3] model, which is also called the project management triangle. Each side of the triangle represents a component of the triple constraints of project management: **scope**, **time**, and **cost**. As [Angelo Baretta writes][4], the triple constraint model "says that cost is a function of time and scope, that these three factors are related in a defined and predictable way… [I]f we want to shorten the schedule (time), we must increase cost. It says that if we want to increase scope, we must increase cost or schedule."
-
-### Transitioning from waterfall to agile
-
-Waterfall came from manufacturing and engineering, where a linear process makes sense; you build the wall before you build the roof. Similarly, software development problems were viewed as something that could be solved with planning. From beginning to end, the development process was clearly defined by a roadmap that would lead to the final delivery of a product.
-
-Eventually, waterfall was recognized as detrimental and counterintuitive to software development because, often, the value could not be determined until the very end of the project cycle, and in many cases, the projects failed. Also, the customer didn't get to see any working software until the end of the project.
-
-Agile takes a different approach that moves away from planning the entire project, committing to estimated dates, and being accountable to a plan. Rather, agile assumes and embraces uncertainty. It is built around the idea of responding to change instead of charging past it or ignoring the need for it. Instead, change is considered as a way to fulfill the needs of the customer.
-
-### Agile values
-
-Agile is governed by the Agile Manifesto, which defines [12 principles][5]:
-
- 1. Satisfying the customer is the top priority
- 2. Welcome changing requirements, even late in development
- 3. Deliver working software frequently
- 4. Development and business must work together
- 5. Build projects around motivated people
- 6. Face-to-face communication is the most efficient and effective method of conveying information
- 7. The primary measure of success is working software
- 8. Agile processes promote sustainable development
- 9. Maintain continuous attention to technical excellence and good design
- 10. Simplicity is essential
- 11. The best architectures, requirements, and designs emerge from self-organizing teams
- 12. Regularly reflect on work, then tune and adjust behavior
-
-
-
-Agile's four [core values][6] are:
-
- * **Individuals and interactions** over processes and tools
- * **Working software** over comprehensive documentation
- * **Customer collaboration** over contract negotiation
- * **Responding to change** over following a plan
-
-
-
-This contrasts with waterfall's rigid planning style. In agile, the customer is a member of the development team rather than engaging only at the beginning, when setting business requirements, and at the end, when reviewing the final product (as in waterfall). The customer helps the team write the [acceptance criteria][7] and remains engaged throughout the process. In addition, agile requires changes and continuous improvement throughout the organization. The development team works with other teams, including the project management office and the testers. What gets done and when are led by a designated role and agreed to by the team as a whole.
-
-### Agile software development
-
-Agile software development requires adaptive planning, evolutionary development, and delivery. Many software development methodologies, frameworks, and practices fall under the umbrella of being agile, including:
-
- * Scrum
- * Kanban (visual workflow)
- * XP (eXtreme Programming)
- * Lean
- * DevOps
- * Feature-driven development (FDD)
- * Test-driven development (TDD)
- * Crystal
- * Dynamic systems development method (DSDM)
- * Adaptive software development (ASD)
-
-
-
-All of these have been used on their own or in combination for developing and deploying software. The most common are [scrum, kanban][8] (or the combination called scrumban), and DevOps.
-
-[Scrum][9] is a framework under which a team, generally consisting of a scrum master, product owner, and developers, operates cross-functionally and in a self-directed manner to increase the speed of software delivery and
-
-to bring greater business value to the customer. The focus is on faster iterations with smaller [increments][10].
-
-[Kanban][11] is an agile framework, sometimes called a workflow management system, that helps teams visualize their work and maximize efficiency (thus being agile). Kanban is usually represented by a digital or physical board. A team's work moves across the board, for example, from not started, to in progress, testing, and finished, as it progresses. Kanban allows each team member to see the state of all work at any time.
-
-### DevOps values
-
-DevOps is a culture, a state of mind, a way that software development or infrastructure is, and a way that software and applications are built and deployed. There is no wall between development and operations; they work simultaneously and without silos.
-
-DevOps is based on two other practice areas: lean and agile. DevOps is not a title or role within a company; it's really a commitment that an organization or team makes to continuous delivery, deployment, and integration. According to [Gene Kim][12], author of _The Phoenix Project_ and _The Unicorn Project_, there are three "ways" that define the principles of DevOps:
-
- * The First Way: Principles of flow
- * The Second Way: Principles of feedback
- * The Third Way: Principles of continuous learning
-
-
-
-### DevOps software development
-
-DevOps does not happen in a vacuum; it is a flexible practice that, in its truest form, is a shared culture and mindset around software development and IT or infrastructure implementation.
-
-When you think of automation, cloud, microservices, you think of DevOps. In an [interview][13], _Accelerate: Building and Scaling High Performing Technology Organizations_ authors Nicole Forsgren, Jez Humble, and Gene Kim explained:
-
-> * Software delivery performance matters, and it has a significant impact on organizational outcomes such as profitability, market share, quality, customer satisfaction, and achieving organizational and mission goals.
-> * High performers achieve levels of throughput, stability, and quality; they're not trading off to achieve these attributes.
-> * You can improve your performance by implementing practices from the lean, agile, and DevOps playbooks.
-> * Implementing these practices and capabilities also has an impact on your organizational culture, which in turn has an impact on both your software delivery performance and organizational performance.
-> * There's still lots of work to do to understand how to improve performance.
->
-
-
-### DevOps vs. agile
-
-Despite their similarities, DevOps and agile are not the same, and some argue that DevOps is better than agile. To eliminate the confusion, it's important to get down to the nuts and bolts.
-
-#### Similarities
-
- * Both are software development methodologies; there is no disputing this.
- * Agile has been around for over 20 years, and DevOps came into the picture fairly recently.
- * Both believe in fast software development, and their principles are based on how fast software can be developed without causing harm to the customer or operations.
-
-
-
-#### Differences
-
- * **The difference between the two** is what happens after development.
- * Software development, testing, and deployment happen in both DevOps and agile. However, pure agile tends to stop after these three stages. In contrast, DevOps includes operations, which happen continually. Therefore, monitoring and software development are also continuous.
- * In agile, separate people are responsible for developing, testing, and deploying the software. In DevOps, the DevOps engineering role is are responsible for everything; development is operations, and operations is development.
- * DevOps is more associated with cost-cutting, and agile is more synonymous with lean and reducing waste, and concepts like agile project accounting and minimum viable product (MVP) are relevant.
- * Agile focuses on and embodies empiricism (**adaptation**, **transparency**, and **inspection**) instead of predictive measures.
-
-Agile | DevOps
----|---
-Feedback from customer | Feedback from self
-Smaller release cycles | Smaller release cycles, immediate feedback
-Focus on speed | Focus on speed and automation
-Not the best for business | Best for business
-
-### Wrapping up
-
-Agile and DevOps are distinct, although their similarities lead people to think they are one and the same. This does both agile and DevOps a disservice.
-
-In my experience as an agilist, I have found it valuable for organizations and teams to understand—from a high level—what agile and DevOps are and how they aid teams in working faster and more efficiently, delivering quality faster, and improving customer satisfaction.
-
-Agile and DevOps are not adversarial in any way (or at least the intent is not there). They are more allies than enemies in the agile revolution. Agile and DevOps can operate exclusively and inclusively, which allows both to exist in the same space.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/20/2/devops-vs-agile
-
-作者:[Taz 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://opensource.com/users/heronthecli
-[b]: https://github.com/lujun9972
-[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/collab-team-pair-programming-code-keyboard.png?itok=kBeRTFL1 (Pair programming)
-[2]: http://www.agilenutshell.com/agile_vs_waterfall
-[3]: https://en.wikipedia.org/wiki/Project_management_triangle
-[4]: https://www.pmi.org/learning/library/triple-constraint-erroneous-useless-value-8024
-[5]: https://agilemanifesto.org/principles.html
-[6]: https://agilemanifesto.org/
-[7]: https://www.productplan.com/glossary/acceptance-criteria/
-[8]: https://opensource.com/article/19/8/scrum-vs-kanban
-[9]: https://www.scrum.org/
-[10]: https://www.scrum.org/resources/what-is-an-increment
-[11]: https://www.atlassian.com/agile/kanban
-[12]: https://itrevolution.com/the-unicorn-project/
-[13]: https://www.infoq.com/articles/book-review-accelerate/
diff --git a/sources/tech/20200211 Basic kubectl and Helm commands for beginners.md b/sources/tech/20200211 Basic kubectl and Helm commands for beginners.md
deleted file mode 100644
index 318fd943f8..0000000000
--- a/sources/tech/20200211 Basic kubectl and Helm commands for beginners.md
+++ /dev/null
@@ -1,211 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Basic kubectl and Helm commands for beginners)
-[#]: via: (https://opensource.com/article/20/2/kubectl-helm-commands)
-[#]: author: (Jessica Cherry https://opensource.com/users/jrepka)
-
-Basic kubectl and Helm commands for beginners
-======
-Take a trip to the grocery store to shop for the commands you'll need to
-get started with these Kubernetes tools.
-![A person working.][1]
-
-Recently, my husband was telling me about an upcoming job interview where he would have to run through some basic commands on a computer. He was anxious about the interview, but the best way for him to learn and remember things has always been to equate the thing he doesn't know to something very familiar to him. Because our conversation happened right after I was roaming the grocery store trying to decide what to cook that evening, it inspired me to write about kubectl and Helm commands by equating them to an ordinary trip to the grocer.
-
-[Helm][2] is a tool to manage applications within Kubernetes. You can easily deploy charts with your application information, allowing them to be up and preconfigured in minutes within your Kubernetes environment. When you're learning something new, it's always helpful to look at chart examples to see how they are used, so if you have time, take a look at these stable [charts][3].
-
-[Kubectl][4] is a command line that interfaces with Kubernetes environments, allowing you to configure and manage your cluster. It does require some configuration to work within environments, so take a look through the [documentation][5] to see what you need to do.
-
-I'll use namespaces in the examples, which you can learn about in my article [_Kubernetes namespaces for beginners_][6].
-
-Now that we have that settled, let's start shopping for basic kubectl and Helm commands!
-
-### Helm list
-
-What is the first thing you do before you go to the store? Well, if you're organized, you make a **list**. LIkewise, this is the first basic Helm command I will explain.
-
-In a Helm-deployed application, **list** provides details about an application's current release. In this example, I have one deployed application—the Jenkins CI/CD application. Running the basic **list** command always brings up the default namespace. Since I don't have anything deployed in the default namespace, nothing shows up:
-
-
-```
-$helm list
-NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
-```
-
-However, if I run the command with an extra flag, my application and information appear:
-
-
-```
-$helm list --all-namespaces
-NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
-jenkins jenkins 1 2020-01-18 16:18:07 EST deployed jenkins-1.9.4 lts
-```
-
-Finally, I can direct the **list** command to check only the namespace I want information from:
-
-
-```
-$helm list --namespace jenkins
-NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
-jenkins jenkins 1 2020-01-18 16:18:07 EST deployed jenkins-1.9.4 lts
-```
-
-Now that I have a list and know what is on it, I can go and get my items with **get** commands! I'll start with the Kubernetes cluster; what can I get from it?
-
-### Kubectl get
-
-The **kubectl get** command gives information about many things in Kubernetes, including pods, nodes, and namespaces. Again, without a namespace flag, you'll always land in the default. First, I'll get the namespaces in the cluster to see what's running:
-
-
-```
-$kubectl get namespaces
-NAME STATUS AGE
-default Active 53m
-jenkins Active 44m
-kube-node-lease Active 53m
-kube-public Active 53m
-kube-system Active 53m
-```
-
-Now that I have the namespaces running in my environment, I'll get the nodes and see how many are running:
-
-
-```
-$kubectl get nodes
-NAME STATUS ROLES AGE VERSION
-minikube Ready master 55m v1.16.2
-```
-
-I have one node up and running, mainly because my Minikube is running on one small server. To get the pods running on my one node:
-
-
-```
-$kubectl get pods
-No resources found in default namespace.
-```
-
-Oops, it's empty. I'll get what's in my Jenkins namespace with:
-
-
-```
-$kubectl get pods --namespace jenkins
-NAME READY STATUS RESTARTS AGE
-jenkins-7fc688c874-mh7gv 1/1 Running 0 40m
-```
-
-Good news! There's one pod, it hasn't restarted, and it has been running for 40 minutes. Well, since I know the pod is up, I want to see what I can get from Helm.
-
-### Helm get
-
-**Helm get** is a little more complicated because this **get** command requires more than an application name, and you can request multiple things from applications. I'll begin by getting the values used to make the application, and then I'll show a snip of the **get all** action, which provides all the data related to the application.
-
-
-```
-$helm get values jenkins -n jenkins
-USER-SUPPLIED VALUES:
-null
-```
-
-Since I did a very minimal stable-only install, the configuration didn't change. If I run the **all** command, I get everything out of the chart:
-
-
-```
-`$helm get all jenkins -n jenkins`
-```
-
-![output from helm get all command][7]
-
-This produces a ton of data, so I always recommend keeping a copy of a Helm chart so you can look over the templates in the chart. I also create my own values to see what I have in place.
-
-Now that I have all my goodies in my shopping cart, I'll check the labels that **describe** what's in them. These examples pertain only to kubectl, and they describe what I've deployed through Helm.
-
-### Kubectl describe
-
-As I did with the **get** command, which can describe just about anything in Kubernetes, I'll limit my examples to namespaces, pods, and nodes. Since I know I'm working with one of each, this will be easy.
-
-
-```
-$kubectl describe ns jenkins
-Name: jenkins
-Labels: <none>
-Annotations: <none>
-Status: Active
-No resource quota.
-No resource limits.
-```
-
-I can see my namespace's name and that it is active and has no resource nor quote limits.
-
-The **describe pods** command produces a large amount of information, so I'll provide a small snip of the output. If you run the command without the pod name, it will return information for all of the pods in the namespace, which can be overwhelming. So, be sure you always include the pod name with this command. For example:
-
-
-```
-`$kubectl describe pods jenkins-7fc688c874-mh7gv --namespace jenkins`
-```
-
-![output of kubectl-describe-pods][8]
-
-This provides (among many other things) the status of the container, how the container is managed, the label, and the image used in the pod. The data not in this abbreviated output includes resource requests and limits along with any conditions, init containers, and storage volume information applied in a Helm values file. This data is useful if your application is crashing due to inadequate resources, a configured init container that runs a prescript for configuration, or generated hidden passwords that shouldn't be in a plain text YAML file.
-
-Finally, I'll use **describe node**, which (of course) describes the node. Since this example has just one, named Minikube, that is what I'll use; if you have multiple nodes in your environment, you must include the node name of interest.
-
-As with pods, the node command produces an abundance of data, so I'll include just a snip of the output.
-
-
-```
-`$kubectl describe node minikube`
-```
-
-![output of kubectl describe node][9]
-
-Note that **describe node** is one of the more important basic commands. As this image shows, the command returns statistics that indicate when the node is running out of resources, and this data is excellent for alerting you when you need to scale up (if you do not have autoscaling in your environment). Other things not in this snippet of output include the percentages of requests made for all resources and limits, as well as the age and allocation of resources (e.g., for my application).
-
-### Checking out
-
-With these commands, I've finished my shopping and gotten everything I was looking for. Hopefully, these basic commands can help you, too, in your day-to-day with Kubernetes.
-
-I urge you to work with the command line often and learn the shorthand flags available in the Help sections, which you can access by running these commands:
-
-
-```
-`$helm --help`
-```
-
-and
-
-
-```
-`$kubectl -h`
-```
-
-### Peanut butter and jelly
-
-Some things just go together like peanut butter and jelly. Helm and kubectl are a little like that.
-
-I often use these tools in my environment. Because they have many similarities in a ton of places, after using one, I usually need to follow up with the other. For example, I can do a Helm deployment and watch it fail using kubectl. Try them together, and see what they can do for you.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/20/2/kubectl-helm-commands
-
-作者:[Jessica Cherry][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/jrepka
-[b]: https://github.com/lujun9972
-[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003784_02_os.comcareers_os_rh2x.png?itok=jbRfXinl (A person working.)
-[2]: https://helm.sh/
-[3]: https://github.com/helm/charts/tree/master/stable
-[4]: https://kubernetes.io/docs/reference/kubectl/kubectl/
-[5]: https://kubernetes.io/docs/reference/kubectl/overview/
-[6]: https://opensource.com/article/19/12/kubernetes-namespaces
-[7]: https://opensource.com/sites/default/files/uploads/helm-get-all.png (output from helm get all command)
-[8]: https://opensource.com/sites/default/files/uploads/kubectl-describe-pods.png (output of kubectl-describe-pods)
-[9]: https://opensource.com/sites/default/files/uploads/kubectl-describe-node.png (output of kubectl describe node)
diff --git a/sources/tech/20200212 Extend the life of your SSD drive with fstrim.md b/sources/tech/20200212 Extend the life of your SSD drive with fstrim.md
deleted file mode 100644
index c8108d68c9..0000000000
--- a/sources/tech/20200212 Extend the life of your SSD drive with fstrim.md
+++ /dev/null
@@ -1,161 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Extend the life of your SSD drive with fstrim)
-[#]: via: (https://opensource.com/article/20/2/trim-solid-state-storage-linux)
-[#]: author: (Alan Formy-Duval https://opensource.com/users/alanfdoss)
-
-Extend the life of your SSD drive with fstrim
-======
-A new systemd service to make your life easier.
-![Linux keys on the keyboard for a desktop computer][1]
-
-Over the past decade, solid-state drives (SSD) have brought about a new way of managing storage. SSDs have benefits like silent and cooler operation and a faster interface spec, compared to their elder spinning ancestors. Of course, new technology brings with it new methods of maintenance and management. SSDs have a feature called TRIM. This is essentially a method for reclaiming unused blocks on the device, which may have been previously written, but no longer contain valid data and therefore, can be returned to the general storage pool for reuse. Opensource.com’s Don Watkins first wrote about TRIM in his 2017 article ["Solid-state drives in Linux: Enabling TRIM for SSDs."][2]
-
-If you have been using this feature on your Linux system, then you are probably familiar with the two methods described below.
-
-### The old ways
-
-#### Discard
-
-I initially enabled this with the discard option to the mount command. The configuration is placed into the **/etc/fstab** file for each file system.
-
-
-```
-# cat /etc/fstab
-UUID=3453g54-6628-2346-8123435f /home xfs defaults,discard 0 0
-```
-
-The discard option enables automatic online TRIM. There has recently been debate on whether this is the best method due to possible negative performance impacts. Using this option causes a TRIM to be initiated every time new data is written to the drive. This may introduce additional activity that interferes with storage performance.
-
-#### Cron
-
-I removed the discard option from the **fstab** file. Then I created a cron job to call the command on a scheduled basis.
-
-
-```
-# crontab -l
-@midnight /usr/bin/trim
-```
-
-This is the method I used most recently on my Ubuntu Linux systems until I learned about another way.
-
-### A new TRIM service
-
-I recently discovered that a systemd service for TRIM exists. Fedora [introduced][3] this into their distribution in version 30, and, although it is not enabled by default in versions 30 and 31, it is planned to be in version 32. If you’re working on Fedora Workstation 31 and you want to begin using this feature, you can enable it very easily. I’ll also show you how to test it below. This service is not unique to Fedora. The existence and status will depend on an individual distribution basis.
-
-#### Test
-
-I like to test first, to better understand what is happening behind the scenes. I do this by opening a terminal and issuing the command that the service is configured to call.
-
-
-```
-`/usr/sbin/fstrim --fstab --verbose --quiet`
-```
-
-The **–help** argument to **fstrim** will describe these and other arguments.
-
-
-```
-$ sudo /usr/sbin/fstrim --help
-
-Usage:
- fstrim [options] <mount point>
-
-Discard unused blocks on a mounted filesystem.
-
-Options:
- -a, --all trim all supported mounted filesystems
- -A, --fstab trim all supported mounted filesystems from /etc/fstab
- -o, --offset <num> the offset in bytes to start discarding from
- -l, --length <num> the number of bytes to discard
- -m, --minimum <num> the minimum extent length to discard
- -v, --verbose print number of discarded bytes
- --quiet suppress error messages
- -n, --dry-run does everything, but trim
-
- -h, --help display this help
- -V, --version display version
-```
-
-So, now I can see that the systemd service is configured to run the trim on all supported mounted filesystems in my **/etc/fstab** file **–fstab** and print the number of discarded bytes **–verbose** but suppress any error messages that might occur **–quiet**. Knowing these options is helpful for testing. For instance, I can start with the safest one, which is the dry run. I’ll also leave off the quiet argument so I can determine if any errors will occur with my drive setup.
-
-
-```
-`$ sudo /usr/sbin/fstrim --fstab --verbose --dry-run`
-```
-
-This will simply show what the **fstrim** command will do based on the file systems that it finds configured in your **/etc/fstab** file.
-
-
-```
-`$ sudo /usr/sbin/fstrim --fstab --verbose`
-```
-
-This will now send the TRIM operation to the drive and report on the number of discarded bytes from each file system. Below is an example after my recent fresh install of Fedora on a new NVME SSD.
-
-
-```
-/home: 291.5 GiB (313011310592 bytes) trimmed on /dev/mapper/wkst-home
-/boot/efi: 579.2 MiB (607301632 bytes) trimmed on /dev/nvme0n1p1
-/boot: 787.5 MiB (825778176 bytes) trimmed on /dev/nvme0n1p2
-/: 60.7 GiB (65154805760 bytes) trimmed on /dev/mapper/wkst-root
-```
-
-#### Enable
-
-Fedora Linux implements systemd timer service, scheduled to run on a weekly basis. To check the existence and current status, run **systemctl status**.
-
-
-```
-`$ sudo systemctl status fstrim.timer`
-```
-
-Now, enable the service.
-
-
-```
-`$ sudo systemctl enable fstrim.timer`
-```
-
-#### Verify
-
-Then you can verify that the timer is enabled by listing all of the timers.
-
-
-```
-`$ sudo systemctl list-timers --all`
-```
-
-The following line referring to the **fstrim.timer** will appear. Notice that the timer actually activates **fstrim.service**. This is from where the actual **fstrim** is called. The time-related fields show **n/a** because the service has just been enabled and has not run yet.
-
-
-```
-NEXT LEFT LAST PASSED UNIT ACTIVATES
-n/a n/a n/a n/a fstrim.timer fstrim.service
-```
-
-### Conclusion
-
-This service seems like the best way to run TRIM on your drives. It is much simpler than having to create your own crontab entry to call the **fstrim** command. It is also safer not having to edit the **fstab** file. It has been interesting to watch the evolution of solid-state storage technology and nice to know that it appears Linux is moving toward a standard and safe way to implement it.
-
-In this article, learn how solid state drives differ from traditional hard drives and what it means...
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/20/2/trim-solid-state-storage-linux
-
-作者:[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
-[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/linux_keyboard_desktop.png?itok=I2nGw78_ (Linux keys on the keyboard for a desktop computer)
-[2]: https://opensource.com/article/17/1/solid-state-drives-linux-enabling-trim-ssds
-[3]: https://fedoraproject.org/wiki/Changes/EnableFSTrimTimer (Fedora Project WIKI: Changes/EnableFSTrimTimer)
diff --git a/sources/tech/20200214 How to set up your own fast, private open source mesh network.md b/sources/tech/20200214 How to set up your own fast, private open source mesh network.md
deleted file mode 100644
index b68b57da3d..0000000000
--- a/sources/tech/20200214 How to set up your own fast, private open source mesh network.md
+++ /dev/null
@@ -1,110 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (How to set up your own fast, private open source mesh network)
-[#]: via: (https://opensource.com/article/20/2/mesh-network-freemesh)
-[#]: author: (Spencer Thomason https://opensource.com/users/spencerthomason)
-
-How to set up your own fast, private open source mesh network
-======
-FreeMesh is an affordable, performant, privacy-respecting mesh system
-that installs in less than 10 minutes.
-![people on top of a connected globe][1]
-
-The [FreeMesh][2] system promises to bring fully open source mesh networking to the masses. I recently had a chance to test it; it installed quickly, and the performance was great—especially for the price.
-
-### Why mesh and open source?
-
-The reason to use open source is simple: privacy. With FreeMesh, your data is your own. It doesn't track or collect data. Don't trust it? You can easily check—it's open source, after all! With some other popular mesh solutions, say those provided by very large tech conglomerates, would you trust them with your data?
-
-Another important factor: updates. FreeMesh says it is committed to pushing out security and performance updates regularly. What about 10 years from now? With an open source solution, you are free to update the product for as long as you want.
-
-So why mesh? In a mesh network, multiple wireless routers work together to broadcast a single, very large wireless network. Each router in a mesh network intelligently communicates with the other(s) to provide the best "path" for your data. The following images from FreeMesh's website highlight the difference between using a single wireless router and a mesh network. The red network represents a single wireless router, and the green is a mesh network.
-
-![Single-router network][3] | ![Mesh network][4]
----|---
-
-### Get the equipment
-
-To get started with FreeMesh, [order a kit][5]. Two kits are available: standard and 4G LTE.
-
-The 4G LTE kit, as the name suggests, supports cellular data connections. This feature is a rarity in the consumer networking space, and it will be _very_ useful to some folks. You can set up a portable mesh network anywhere with power and cell service with full fast-failover capability.
-
-The FreeMesh kits come with a primary router and two nodes. The router and nodes use 802.11ac, 802.11r, and 802.11s standards. The included firmware runs a customized version of [OpenWrt][6], a Linux distro for embedded devices.
-
-The FreeMesh router has some really good specs:
-
- * **CPU:** Dual-core 880MHz MediaTek MT7621AT (two cores/four threads!)
- * **RAM:** DDR3 512MB
- * **Interfaces:** 1x GbE WAN, 4x GbE LAN, 1x USB 2.0 ports, 1x microSD card slot, 1x SIM slot
- * **Antenna:** 2x 5dBi 2.4GHz, 2x 5dBi 5GHz, 2x 3dBi 3G/4G (built-in)
- * **4G LTE modem:** LTE category 4 module, 150Mbps downlink and 50Mbps uplink
-
-
-
-### Setup
-
-Setup is easy, and FreeMesh's [README][7] offers simple instructions and diagrams. Start by setting up the primary router first. Then follow these simple steps:
-
- 1. Connect the first node (blue WAN port) to the primary router (yellow LAN port).
-![FreeMesh setup step 1][8]
- 2. Wait about 30 to 60 seconds. The node will flash its LEDs when the setup is complete.
-![FreeMesh setup step 2][9]
- 3. Move the node to another location.
-
-
-
-That's it! There is no manual setup required for the nodes; you simply plug them into the primary router, and it does the rest. You can add more nodes the same way; just repeat the steps above.
-
-### Features
-
-Out of the box, FreeMesh runs a combination of OpenWRT and LuCI. It has all the features you'd expect from a router. Want to install new features or packages? SSH in and start hacking!
-
-![Real-time load on FreeMesh network][10]
-
-![Overview of FreeMesh network][11]
-
-![OpenWrt status report][12]
-
-### Performance
-
-After setting up the FreeMesh system, I moved the nodes to various places around my house. I used [iPerf][13] to test the bandwidth and was getting around 150Mbps. WiFi can be affected by any number of environmental variables, so your mileage may vary. Distance between the nodes and the primary router also plays a large factor in bandwidth.
-
-However, the real advantage of a mesh network isn't its top-end speed but much better average speed across a space. Even at the far reaches of my home, I was still able to stream videos and work without interruption. I was even able to work in my backyard. I simply repositioned one of the nodes in front of a window before heading outside.
-
-### Conclusion
-
-FreeMesh is really compelling; it offers performance, privacy, and price, all in a simple, open source package.
-
-In my experience, setup is a breeze, and it is more than fast enough. The range is excellent and far exceeds any single-router setup. You are free to hack and customize your FreeMesh setup, but I didn't feel the need to. It has everything I need out of the box.
-
-If you are looking for an affordable, performant, privacy-respecting mesh system that installs in less than 10 minutes, you might want to consider FreeMesh.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/20/2/mesh-network-freemesh
-
-作者:[Spencer Thomason][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/spencerthomason
-[b]: https://github.com/lujun9972
-[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/bus-networking.png?itok=fHmulI9p (people on top of a connected globe)
-[2]: https://freemeshwireless.com/
-[3]: https://opensource.com/sites/default/files/uploads/singlerouternetwork.png (Single-router network)
-[4]: https://opensource.com/sites/default/files/uploads/meshnetwork.png (Mesh network)
-[5]: https://freemeshwireless.com/#pricing
-[6]: https://openwrt.org/
-[7]: https://gitlab.com/slthomason/freemesh/-/blob/master/README.md
-[8]: https://opensource.com/sites/default/files/uploads/connecttorouter.png (FreeMesh setup step 1)
-[9]: https://opensource.com/sites/default/files/uploads/setupcomplete.png (FreeMesh setup step 2)
-[10]: https://opensource.com/sites/default/files/uploads/freemeshrealtimeload.png (Real-time load on FreeMesh network)
-[11]: https://opensource.com/sites/default/files/uploads/freemeshwirelessoverview.png (Overview of FreeMesh network)
-[12]: https://opensource.com/sites/default/files/uploads/openwrt.png (OpenWrt status report)
-[13]: https://opensource.com/article/20/1/internet-speed-tests
diff --git a/sources/tech/20200214 PHP Development on Fedora with Eclipse.md b/sources/tech/20200214 PHP Development on Fedora with Eclipse.md
deleted file mode 100644
index 24ecdcb232..0000000000
--- a/sources/tech/20200214 PHP Development on Fedora with Eclipse.md
+++ /dev/null
@@ -1,89 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: (geekpi)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (PHP Development on Fedora with Eclipse)
-[#]: via: (https://fedoramagazine.org/php-development-on-fedora-with-eclipse/)
-[#]: author: (Mehdi Haghgoo https://fedoramagazine.org/author/powergame/)
-
-PHP Development on Fedora with Eclipse
-======
-
-![][1]
-
-[Eclipse][2] is a full-featured free and open source IDE developed by the Eclipse Foundation. It has been around since 2001. You can write anything from C/C++ and Java to PHP, Python, HTML, JavaScript, Kotlin, and more in this IDE.
-
-### Installation
-
-The software is available from Fedora’s official repository. To install it, invoke:
-
-```
-sudo dnf install eclipse
-```
-
-This will install the base IDE and Eclipse platform, which enables you to develop Java applications. In order to add PHP development support to the IDE, run this command:
-
-```
-sudo dnf install eclipse-pdt
-```
-
-This will install PHP development tools like PHP project wizard, PHP server configurations, composer support, etc.
-
-### Features
-
-This IDE has many features that make PHP development easier. For example, it has a comprehensive project wizard (where you can configure many options for your new projects). It also has built-in features like composer support, debugging support, a browser,a terminal, and more.
-
-### Sample project
-
-Now that the IDE is installed, let’s create a simple PHP project. Go to _File →New → Project_. From the resulting dialog, select _PHP project_. Enter a name for your project. There are some other options you might want to change, like changing the project’s default location, enabling JavaScript, and changing PHP version. See the following screenshot.
-
-![Create A New PHP Project in Eclipse][3]
-
-You can click the _Finish_ button to create the project or press _Next_ to configure other options like adding include and build paths. You don’t need to change those in most cases.
-
-Once the project is created, right click on the project folder and select _New → PHP File_ to add a new PHP file to the project. For this tutorial I named it _index.php_, the conventionally-recognized default file in every PHP project.
-
-![][4]
-
-Then add the your code to the new file.
-
-![Demo PHP code][5]
-
-In the example above, I used CSS, JavaScript, and PHP tags on the same page mainly to show that the IDE is capable of supporting all of them together.
-
-Once your page is ready, you can see the result output by moving the file to your web server document root or by creating a development PHP server in the project directory.
-
-Thanks to the built-in terminal in Eclipse, we can launch a PHP development server right from within the IDE. Simply click the terminal icon on the toolbar (![Terminal Icon][6]) and click _OK_. In the new terminal, change to the project directory and run the following command:
-
-```
-php -S localhost:8080 -t . index.php
-```
-
-![Terminal output][7]
-
-Now, open a browser and head over to . If everything has been done correctly per instructions and your code is error-free, you will see the output of your PHP script in the browser.
-
-![PHP output in Fedora][8]
-
---------------------------------------------------------------------------------
-
-via: https://fedoramagazine.org/php-development-on-fedora-with-eclipse/
-
-作者:[Mehdi Haghgoo][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/powergame/
-[b]: https://github.com/lujun9972
-[1]: https://fedoramagazine.org/wp-content/uploads/2020/02/php-eclipse-816x346.png
-[2]: https://projects.eclipse.org/projects/eclipse
-[3]: https://fedoramagazine.org/wp-content/uploads/2020/02/Screenshot-from-2020-02-07-01-58-39.png
-[4]: https://fedoramagazine.org/wp-content/uploads/2020/02/Screenshot-from-2020-02-07-02-02-05-1024x576.png
-[5]: https://fedoramagazine.org/wp-content/uploads/2020/02/code-1024x916.png
-[6]: https://fedoramagazine.org/wp-content/uploads/2020/02/Screenshot-from-2020-02-07-03-50-05.png
-[7]: https://fedoramagazine.org/wp-content/uploads/2020/02/terminal-1024x239.png
-[8]: https://fedoramagazine.org/wp-content/uploads/2020/02/output.png
diff --git a/sources/tech/20200219 Basic Vim Commands You Need to Know to Work in Vim Editor.md b/sources/tech/20200219 Basic Vim Commands You Need to Know to Work in Vim Editor.md
index 657fb6a93b..6b959364b7 100644
--- a/sources/tech/20200219 Basic Vim Commands You Need to Know to Work in Vim Editor.md
+++ b/sources/tech/20200219 Basic Vim Commands You Need to Know to Work in Vim Editor.md
@@ -1,5 +1,5 @@
[#]: collector: (lujun9972)
-[#]: translator: ( )
+[#]: translator: (mengxinayan)
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
@@ -157,7 +157,7 @@ via: https://www.2daygeek.com/basic-vim-commands-cheat-sheet-quick-start-guide/
作者:[Magesh Maruthamuthu][a]
选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
+译者:[萌新阿岩](https://github.com/mengxinayan)
校对:[校对者ID](https://github.com/校对者ID)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/sources/tech/20200219 Here Are The Most Beautiful Linux Distributions in 2020.md b/sources/tech/20200219 Here Are The Most Beautiful Linux Distributions in 2020.md
index 3188c97fa7..2b4dbfaacf 100644
--- a/sources/tech/20200219 Here Are The Most Beautiful Linux Distributions in 2020.md
+++ b/sources/tech/20200219 Here Are The Most Beautiful Linux Distributions in 2020.md
@@ -1,5 +1,5 @@
[#]: collector: (lujun9972)
-[#]: translator: ( )
+[#]: translator: (robsean)
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
@@ -7,34 +7,34 @@
[#]: via: (https://itsfoss.com/beautiful-linux-distributions/)
[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
-Here Are The Most Beautiful Linux Distributions in 2020
+2020 年最漂亮的 Linux 发行版
======
-It’s a no-brainer that there’s a Linux distribution for every user – no matter what they prefer or what they want to do.
+每个 Linux 用户都有一个 Linux 发行版是不需要考虑的 – 不管他们喜欢什么,或者想做什么
-Starting out with Linux? You can go with the [Linux distributions for beginners][1]. Switching from Windows? You have [Windows-like Linux distributions][2]. Have an old computer? You can [use lightweight Linux distros][3].
+刚开始使用 Linux ?你可以使用 [面向初学者的 Linux 发行版][1] 。来自 Windows ?你可以拥有[像 Windows 一样的 Linux发行版][2]。你拥有一台旧电脑?你可以 [使用轻量级 Linux 发行版][3] 。
-In this list, I’m going to focus only on the most beautiful Linux distros out there.
+在这个列表中,我只关注最漂亮的 Linux 发行版。
-### Top 7 Most Beautiful Linux Distributions
+### 7 款最漂亮的 Linux 发行版
![][4]
-Wait! Is there a thing called a beautiful Linux distribution? Is it not redundant considering the fact that you can customize the looks of any distribution and make it look better with [themes][5] and [icons][6]?
+等一下!有一个可以称为最漂亮的 Linux 发行版的东西存在吗?不需要考虑的事实是,你可以自定义容易发行版的外观,并使用 [主题][5] 和 [图标]][6] 来使其看起来更漂亮。
-You are right about that. But here, I am talking about the distributions that look great without any tweaks and customization effort from the user’s end. These distros provide a seamless, pleasant desktop experience right out of the box.
+你说得对。但是在这里,我所说的发行版看起来好极了,不需要用户端的任何调整和自定义工作。这些发行版提供友好的无缝转换的开箱即用的桌面体验。
-**Note:** _The list is in no particular order of ranking._
+**注意:** _列表排名不分前后。_
#### 1\. elementary OS
![][7]
-elementary OS is one of the most beautiful Linux distros out there. It leans on a macOS-ish look while providing a great user experience for Linux users. If you’re already comfortable macOS – you will have no problem using the elementary OS.
+这里的 elementary OS 是一个最漂亮的 Linux 发行版。在为 Linux 用户提供一种极好的体验的同时,它倾向于一种 macOS 的外观。如果你已经适应了 macOS – 那么你在使用 elementary OS 时,将没有任何问题。
-Also, elementary OS is based on Ubuntu – so you can easily find plenty of applications to get things done.
+此外,elementary OS 也同样基于 Ubuntu – 因此你可以很容易地找到大量的应用程序来把事情做好。
-Not just limited to the look and feel – but the elementary OS is always hard at work to introduce meaningful changes. So, you can expect the user experience to improve with every update you get.
+不紧紧局限于外观和感觉 – elementary OS 也努力地引入重要的更改。因此,你可以期待每次更新后所带来的用户体验。
[elementary OS][8]
@@ -42,11 +42,11 @@ Not just limited to the look and feel – but the elementary OS is always hard a
![][9]
-Deepin is yet another beautiful Linux distro originally based on Debian’s stable branch. The animations (look and feel) could be too overwhelming for some – but it looks pretty.
+Deepin 是另一个漂亮的 Linux 发行版,起初基于 Debian 的稳定版本分支。对于一些人来说,动画效果(外观和感觉)可能太过令人不知所措 – 但是它看起来很漂亮。
-It features its own Deepin Desktop Environment that involves a mix of essential features for the best user experience possible. It may not exactly resemble the UI of any other distribution but it’s quite easy to get used to.
+它以拥有自己的 Deepin 桌面环境为特色,涉及到一些基本功能的组合,以获得尽可能好的用户体验。它可能与任何其它的发行版的用户界面都不相似,但是它很容易习惯的。
-My personal attention would go to the control center and the color scheme featured in Deepin OS. You can give it a try – it’s worth taking a look.
+我个人的注意力将转向 Deepin OS 中的控制中心和特色配色方案。你也尝试一下 – 它是值得一看的。
[Deepin][10]
@@ -54,11 +54,11 @@ My personal attention would go to the control center and the color scheme featur
![][11]
-Pop!_OS manages to offer a great UI on top of Ubuntu while offering a pure [GNOME][12] experience.
+Pop!_OS 成功地在 Ubuntu 的上层提供一个的极好用户界面,与此同时也提供一种纯净的 [GNOME][12] 体验。
-It also happens to be my personal favorite which I utilize as my primary desktop OS. Pop!_OS isn’t flashy – nor involves any fancy animations. However, they’ve managed to get things right by having a perfect combo of icon/themes – while polishing the user experience from a technical point of view.
+它也碰巧也是我个人的最爱,我使用它作为我的主要桌面系统。Pop!_OS 既不浮华,也不是涉及一些花哨的动画。不过,它们通过图标和主题的完美组合成来解决问题 – 在此期间从技术角度提升用户体验。
-I don’t want to initiate a [Ubuntu vs Pop OS][13] debate but if you’re used to Ubuntu, Pop!_OS can be a great alternative for potentially better user experience.
+我不想发起一场 [Ubuntu 和 Pop OS][13] 的争论,但是如果你已经习惯了 Ubuntu ,为获取更好的潜在的用户体验,Pop!_OS 可能是一个极好的可供选择的系统。
[Pop!_OS][14]
@@ -66,11 +66,11 @@ I don’t want to initiate a [Ubuntu vs Pop OS][13] debate but if you’re used
![][15]
-Manjaro Linux is an [Arch][16]-based Linux distribution. While [installing Arch Linux][17] is a slightly complicated job, Manjaro provides an easier and smoother Arch experience.
+Manjaro Linux 是一个基于 [Arch][16] 的 Linux 发行版。然而 [安装 Arch Linux][17] 是一件稍微复杂的工作,Manjaro 提供了一种更舒适、更流畅的 Arch 体验。
-It offers a variety of [desktop environment editions][18] to choose from while downloading. No matter what you choose, you still get enough options to customize the look and feel or the layout.
+它提供各种各样的 [桌面环境版本][18] 来供下载时选择。不管你选择哪一个,你都仍然有足够的选择权来自定义外观和感觉或布局。
-To me, it looks quite fantastic for an Arch-based distribution that works out of the box – you can give it a try!
+对我来说,一个开箱即用的基于 Arch 的发行版看起来极好。 – 你可以试一试!
[Manjaro Linux][19]
@@ -78,13 +78,13 @@ To me, it looks quite fantastic for an Arch-based distribution that works out of
![][20]
-[KDE Neon][21] is for the users who want a simplified approach to the design language but still get a great user experience.
+[KDE Neon][21] 是为那些想简单接近设计语言的用户所准备的,the design language 但是仍能获得良好的用户体验。
-It is a lightweight Linux distro which is based on Ubuntu. As the name suggests, it features the KDE Plasma desktop and looks absolutely beautiful.
+它是一个基于 Ubuntu 的轻量级 Linux 发行版。顾名思义,它以 KDE Plasma 桌面和精美绝伦为特色。
-KDE Neon gives you the latest and greatest KDE Plasma desktop and KDE applications. Unlike [Kubuntu][22] or other KDE-based distributions, you don’t have to wait for months to get the new [KDE software][23].
+KDE Neon 给予你最新的、最好的 KDE Plasma 桌面及KDE 应用程序。不像 [Kubuntu][22] 或其它基于 KDE 的发行版,你不需要等待数月来获取新的 [KDE 软件][23] 。
-You get a lot of customization options built-in with the KDE desktop – so feel free to try it out!
+你可以在 KDE 桌面中获取很多内置的自定义选项 – 所以你可以随意使用!
[KDE Neon][24]
@@ -92,11 +92,11 @@ You get a lot of customization options built-in with the KDE desktop – so feel
![][25]
-Without a doubt, Zorin OS is an impressive Linux distro that manages to provide a good user experience – even with its lite edition.
+毫无疑问,Zorin OS 是一个令人印象深刻的 Linux 发行版,它设法提供一个良好的用户体验 – 即使使用它的精简版本。
-You can try either the full version or the lite edition (with [Xfce desktop][26]). The UI is tailored for Windows and macOS users to get used to. While based on Ubuntu, it provides a great user experience with what it has to offer.
+你可以尝试完整版本或精简版本(使用 [Xfce 桌面][26]) 。该用户界面专门为习惯于 Windows 和 macOS 的用户定制。虽然基于 Ubuntu ,它仍然能提供一种极好的用户体验。
-If you start like its user interface – you can also try [Zorin Grid][27] to manage multiple computers running Zorin OS at your workplace/home. With the ultimate edition, you can also control the layout of your desktop (as shown in the image above).
+如果你开始喜欢它的用户界面 – 在你也可以尝试 [Zorin Grid][27] 来管理在工作区/家庭中运行的 Zorin OS的 计算机。使用终极版本,你也可以控制你的桌面布局 (如上图所示)。
[Zorin OS][28]
@@ -104,33 +104,33 @@ If you start like its user interface – you can also try [Zorin Grid][27] to ma
![][29]
-[Nitrux OS][30] is a unique take on a Linux distribution which is somewhat based on Ubuntu – but not completely.
+[Nitrux OS][30] 是一个独特的 Linux 发行版,它某种程度上基于 Ubuntu – 但是不完全基于 Ubuntu 。
-It focuses on providing a good user experience to the users who are looking for a unique design language with a fresh take on a Linux distro. It uses Nomad desktop which is based on KDE.
+对于正在寻找在 Linux 发行版上使用全新方式的独特设计语言的用户来说,它专注于提供一种良好的用户体验。它使用基于 KDE 的 Nomad 桌面。
-Nitrux encourages to use of [AppImage][31] for applications. But you can also use Arch Linux’s pacman package manager in Nitrux which is based on Ubuntu. Awesome, isn’t it?
+Nitrux 鼓励使用 [AppImage][31] 应用程序。但是在 基于 Ubuntu 的 Nitrux 中你也可以使用 Arch Linux 的 pacman 软件包管理器。令人惊叹,不是吗?
-Even if it’s not the perfect OS to have installed (yet), it sure looks pretty and good enough for most of the basic tasks. You can also know more about it when you read our [interview with Nitrux’s founder][32].
+尽管它尚不是用来安装的完美的操作系统,它确实看起来很漂亮,并且对大多数基本任务来说已经足够了。当你阅读我们的 [ Nitrux 创始人的采访][32] 时,你可以了解更多。
-Here’s a slightly old video of Nitrux but it still looks good:
+这是一个稍微过时的 Nitrux 视频,但是它仍然看起来很好:
[Nitrux OS][33]
-#### Bonus: eXtern OS (in ‘stagnated’ development)
+#### 意外:eXtern OS (处于‘停滞’ 开发阶段)
![][34]
-If you want to try an experimental Linux distro, extern OS is going to be beautiful.
+如果你想尝试一个实验性的 Linux 发行版,extern OS 将会非常出色。
-It isn’t actively maintained and should not be used for production systems. Yet, it provides unique user experience (thought not polished enough).
+它并没有被积极地维护,因此不应该用于生产系统。但是,它提供独特的用户体验(尽管还不够完美无缺)。
-Just for the sake of trying a good-looking Linux distro, you can give it a try to experience it.
+只为尝试一个好看的 Linux 发行版,你可以尝试体验一下。
[eXtern OS][35]
-**Wrapping Up**
+**总结**
-Now, as the saying goes, beauty lies in the eyes of the beholder. So this list of beautiful Linux distributions is from my point of view. Feel free to disagree (politely of course) and mention your favorites.
+现在,俗话说,情人眼里出西施。所以这份来自我眼中的最漂亮 Linux 发行版列表。你可以随意提出不同的意见 (当然要礼貌一点),并提及你最喜欢的 Linux 发行版。
--------------------------------------------------------------------------------
@@ -138,7 +138,7 @@ via: https://itsfoss.com/beautiful-linux-distributions/
作者:[Ankush Das][a]
选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
+译者:[robsean](https://github.com/robsean)
校对:[校对者ID](https://github.com/校对者ID)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/sources/tech/20200219 How to find what you-re looking for on Linux with find.md b/sources/tech/20200219 How to find what you-re looking for on Linux with find.md
deleted file mode 100644
index 9bcb73d4e5..0000000000
--- a/sources/tech/20200219 How to find what you-re looking for on Linux with find.md
+++ /dev/null
@@ -1,240 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: (heguangzhi)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (How to find what you’re looking for on Linux with find)
-[#]: via: (https://www.networkworld.com/article/3527420/how-to-find-what-you-re-looking-for-on-linux-with-find.html)
-[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
-
-How to find what you’re looking for on Linux with find
-======
-The find command has a huge array of options to help you locate exactly the files you're looking for on a Linux system. This post explores a series of extremely useful commands.
-CSA Images / Getty Images
-
-There are a number of commands for finding files on Linux systems, but there are also a huge number of options that you can deploy when looking for them.
-
-For example, you can find files not just by their names, but by their owners and/or groups, their age, their size, the assigned permissions, the last time they were accessed, the associated inodes and even whether the files belong to an account or group that no longer exists on the system and so on.
-
-[[Get regularly scheduled insights by signing up for Network World newsletters.]][1]
-
-You can also specify where a search should start, how deeply into the file system the search should reach and how much the search result will tell you about the files it finds.
-
-And all these criteria can be handled by the **find** command.
-
-Examples of finding files by these criteria are provided below. In some commands, errors (such as trying to list files that you don’t have read access to), error output will be sent to **/dev/null** so that we don’t have to look at it. In others, we’ll simply run as root to avoid this problem.
-
-Keep in mind that additional options exist. This post covers a lot of ground, but not all of the ways that the **find** command can help locate files for you.
-
-### Picking a starting point
-
-With **find**, you can either select a point or start where you are. To select a starting spot, enter it following the word “find”. For example, “find /usr” or “find ./bin” would search starting the **/usr** directory or the **bin** directory in the current location while “find ~” would start in your home directory even if you’re currently located in some other location in the file system.
-
-[][2]
-
-### Picking what you want to see
-
-One of the most commonly used search strategies is to search for files by name. This requires using the **-name** option.
-
-By default, **find** will show you the full path to the files it finds. This is the same thing you would see if you add **-print** to your command. If you want to see the details associated with a file – its length, permissions, etc., you would need to add **-ls** to the end of your **find** command.
-
-```
-$ find ~/bin -name tryme
-/home/shs/bin/tryme
-$ find ~/bin -name tryme -print
-/home/shs/bin/tryme
-$ find ~/bin -name tryme -ls
- 917528 4 -rwx------ 1 shs shs 139 Apr 8 2019 /home/shs/bin/tryme
-```
-
-You can also find files using substrings. For example, if you replace "tryme" in the example above with "try*", you'll find all the files with names that begin with "try".
-
-Finding files by name is probably the most typical use of the **find** command, but there are so many other ways to look for files and good reasons to want to. The sections below show how to use many of the other criteria available.
-
-In addition, when searching for files by size, group, inode etc., you probably will want some confirmation that the files found match what you were looking for. Using the **-ls** option to display the details is often very helpful.
-
-### Finding files by size
-
-Finding files by size requires use of the **-size** option and a little finesse with the specifications. If you specify **-size 189b**, for you example, you’re going to find files that are 189 blocks long, not 189 bytes. For bytes, you would need to use **-size 189c** (characters). And, if you specify **-size 200w**, you’re going to find files that are 200 words – words as in "two-byte increments", not words as in "those things we all say to each other". You can also look for file by providing sizes in kilobytes (k), megabytes (M) and gigabytes (G).
-
-Most of the time, Linux users will be searching for files that are larger than some selected size. For example, to find files that are larger than a gigabyte, you might use a command like this where the +1G means "larger than a gigabyte":
-
-```
-$ find -size +1G -ls 2>/dev/null
- 787715 1053976 -rw-rw-r-- 1 shs shs 1079263432 Dec 21 2018 ./backup.zip
- 801834 1052556 -rw-rw-r-- 1 shs shs 1077809525 Dec 21 2018 ./2019/hold.zip
-```
-
-### Finding files by inode #
-
-You can find files by the inode that is used to maintain the file’s metadata (i.e., everything but the file content and file name).
-
-```
-$ find -inum 919674 -ls 2>/dev/null
- 919674 4 -rw-rw-r-- 1 shs shs 512 Dec 27 15:25 ./bin/my.log
-```
-
-### Finding files with a specific file owner or group
-
-Finding files by owner or group is also very straightforward. Here we use sudo to overcome permission issues.
-
-```
-$ sudo find /home -user nemo -name "*.png"-ls
- 1705219 4 drwxr-xr-x 2 nemo nemo 4096 Jan 28 08:50 /home/nemo/Pictures/me.png
-```
-
-In this command, we look for a file that is owned by a multi-user group called “admins”.
-
-```
-# find /tmp -group admins -ls
- 262199 4 -rwxr-x--- 1 dory admins 27 Feb 16 18:57 /tmp/testscript
-```
-
-### Finding files with no owners or groups
-
-You can look for files that don't belong to any users currently set up on the system by using the **-nouser** option as shown in the command below.
-
-```
-# find /tmp -nouser -ls
-262204 4 -rwx------ 1 1016 1016 17 Feb 17 16:42 /tmp/hello
-```
-
-Notice that the listing shows the old user's UID and GID – a clear indication that this user is not defined on the system. This kind of command will find files that were likely created in other-than-home directories by users whose accounts have since been removed from the system or in home directories that were not removed after the user account was removed. Similarly, the **-nogroup** option would find such files – especially when these users were the only members of the associated groups.
-
-### Finding files by last update time
-
-In this command, we look for files that have been updated in the last 24 hours in a particular user's home directory. The **sudo** is being used to allow searching another user’s home directory.
-
-```
-$ sudo find /home/nemo -mtime -1
-/home/nemo
-/home/nemo/snap/cheat
-/home/nemo/tryme
-```
-
-### Finding files by when permissions were last changed
-
-The **-ctime** option can help you find files that have had their status (e.g., permissions) changed within some referenced time frame. Here’s an example of looking for files that had permission changes within the last day:
-
-```
-$ find . -ctime -1 -ls
- 787987 4 -rwxr-xr-x 1 shs shs 189 Feb 11 07:31 ./tryme
-```
-
-Keep in mind that the date and time displayed reflect the last updates to the file contents. You will have to use a command like **stat** to see all three times associated with a file (file creation, modification and status changes) .
-
-### Finding files based on last access times
-
-In this command, we look for local pdf files that were accessed within the last two days using the **-atime** option.
-
-```
-$ find -name "*.pdf" -atime -2
-./Wingding_Invites.pdf
-```
-
-### Finding files based on their age relative to another file
-
-You can use the -newer option to find files that are newer than some other file.
-
-```
-$ find . -newer dig1 -ls
- 786434 68 drwxr-xr-x 67 shs shs 69632 Feb 16 19:05 .
- 1064442 4 drwxr-xr-x 5 shs shs 4096 Feb 16 11:06 ./snap/cheat
- 791846 4 -rw-rw-r-- 1 shs shs 649 Feb 13 14:26 ./dig
-```
-
-There is no corresponding **-older** option, but you can get a similar result with **! -newer** (i.e., not newer), which means almost the same thing.
-
-### Finding files by type
-
-Finding a file by file type, you get a lot of choices – regular files, directories, block and character files, etc. Here’s a list of the file type options:
-
-```
-b block (buffered) special
-c character (unbuffered) special
-d directory
-p named pipe (FIFO)
-f regular file
-l symbolic link
-s socket
-```
-
-Here’s an example looking for symbolic links:
-
-```
-$ find . -type l -ls
- 805717 0 lrwxrwxrwx 1 shs shs 11 Apr 10 2019 ./volcano -> volcano.pdf
- 918552 0 lrwxrwxrwx 1 shs shs 1 Jun 16 2018 ./letter -> pers/letter2mom
-```
-
-### Limiting how deeply find should look
-
-The **-mindepth** and **-maxdepth** options control how deeply into the file system (from the current location or starting point) your searches will look.
-
-```
-$ find -maxdepth 3 -name "*loop"
-./bin/save/oldloop
-./bin/long-loop
-./private/loop
-```
-
-### Finding files only if empty
-
-In this command, we look for empty files, but no further than directories and their subdirectories.
-
-```
-$ find . -maxdepth 2 -empty -type f -ls
- 917517 0 -rw-rw-r-- 1 shs shs 0 Sep 23 11:00 ./complaints/newfile
- 792050 0 -rw-rw-r-- 1 shs shs 0 Oct 4 19:02 ./junk
-```
-
-### Finding files by permissions
-
-You can find files that have specific permissions set using the **-perm** option. In the example below, we are looking only for regular files (**-type f**) to avoid seeing symbolic links that are given these permissions by default even if the file they refer to is restricted.
-
-```
-$ find -perm 777 -type f -ls
-find: ‘./.dbus’: Permission denied
- 798748 4 -rwxrwxrwx 1 shs shs 15 Mar 28 2019 ./runme
-```
-
-### Using find to help you get rid of files
-
-You can use the find command to both locate and then remove files if you use a command like this one:
-
-```
-$ find . -name runme -exec rm {} \;
-```
-
-The {} represents the name of each of the files located by the search criteria.
-
-One very useful option is to replace **-exec** with **-ok**. When you do this, **find** will ask for a confirmation before it removes any file.
-
-```
-$ find . -name runme -ok rm -rf {} \;
-< rm ... ./bin/runme > ?
-```
-
-Removing a file isn't the only thing that **-ok** and **-rm** can do for you. For example, you could copy, rename or move files.
-
-There are really a lot of options for using the find command effectively and undoubtedly some that haven’t been covered in this post. I hope you’ve found some that are new and especially promising.
-
-Join the Network World communities on [Facebook][3] and [LinkedIn][4] to comment on topics that are top of mind.
-
---------------------------------------------------------------------------------
-
-via: https://www.networkworld.com/article/3527420/how-to-find-what-you-re-looking-for-on-linux-with-find.html
-
-作者:[Sandra Henry-Stocker][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://www.networkworld.com/author/Sandra-Henry_Stocker/
-[b]: https://github.com/lujun9972
-[1]: https://www.networkworld.com/newsletters/signup.html
-[2]: https://www.networkworld.com/article/3440100/take-the-intelligent-route-with-consumption-based-storage.html?utm_source=IDG&utm_medium=promotions&utm_campaign=HPE21620&utm_content=sidebar ( Take the Intelligent Route with Consumption-Based Storage)
-[3]: https://www.facebook.com/NetworkWorld/
-[4]: https://www.linkedin.com/company/network-world
diff --git a/sources/tech/20200219 Try this Bash script for-large filesystems.md b/sources/tech/20200219 Try this Bash script for-large filesystems.md
deleted file mode 100644
index f0f0a88f2f..0000000000
--- a/sources/tech/20200219 Try this Bash script for-large filesystems.md
+++ /dev/null
@@ -1,335 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Try this Bash script for large filesystems)
-[#]: via: (https://opensource.com/article/20/2/script-large-files)
-[#]: author: (Nick Clifton https://opensource.com/users/nickclifton)
-
-Try this Bash script for large filesystems
-======
-A simple script to list files, directories, executables, and links.
-![bash logo on green background][1]
-
-Have you ever wanted to list all the files in a directory, but just the files, nothing else? How about just the directories? If you have, then the following script, which is open source under GPLv3, could be what you have been looking for.
-
-Of course, you could use the **find** command:
-
-
-```
-`find . -maxdepth 1 -type f -print`
-```
-
-But this is cumbersome to type, produces unfriendly output, and lacks some of the refinement of the **ls** command. You could also combine **ls** and **grep** to achieve the same result:
-
-
-```
-`ls -F . | grep -v /`
-```
-
-But again, this is clunky. This script provides a simple alternative.
-
-### Usage
-
-The script provides four main functions, which depend upon which name you call: **lsf** lists files, **lsd** lists directories, **lsx** lists executables, and **lsl** lists links.
-
-There is no need to install multiple copies of the script, as symbolic links work. This saves space and makes updating the script easier.
-
-The script works by using the **find** command to do the searching, and then it runs **ls** on each item it finds. The nice thing about this is that any arguments given to the script are passed to the **ls** command. So, for example, this lists all files, even those that start with a dot:
-
-
-```
-`lsf -a`
-```
-
-To list directories in long format, use the **lsd** command:
-
-
-```
-`lsd -l`
-```
-
-You can provide multiple arguments, and also file and directory paths.
-
-This provides a long classified listing of all of files in the current directory's parent directory, and in the **/usr/bin** directory:
-
-
-```
-`lsf -F -l .. /usr/bin`
-```
-
-One thing that the script does not currently handle, however, is recursion. This command lists only the files in the current directory.
-
-
-```
-`lsf -R`
-```
-
-The script does not descend into any subdirectories. This is something that may be fixed one day.
-
-### Internals
-
-The script is written in a top-down fashion with the initial functions at the start of the script and the body of the work performed near the end. There are only two functions that really matter in the script. The **parse_args()** function peruses the command line, separates options from pathnames, and scripts specific options from the **ls** command-line options.
-
-The **list_things_in_dir()** function takes a directory name as an argument and runs the **find** command on it. Each item found is passed to the **ls** command for display.
-
-### Conclusion
-
-This is a simple script to accomplish a simple function. It is a time saver and can be surprisingly useful when working with large filesystems.
-
-### The script
-
-
-```
-#!/bin/bash
-
-# Script to list:
-# directories (if called "lsd")
-# files (if called "lsf")
-# links (if called "lsl")
-# or executables (if called "lsx")
-# but not any other type of filesystem object.
-# FIXME: add lsp (list pipes)
-#
-# Usage:
-# <command_name> [switches valid for ls command] [dirname...]
-#
-# Works with names that includes spaces and that start with a hyphen.
-#
-# Created by Nick Clifton.
-# Version 1.4
-# Copyright (c) 2006, 2007 Red Hat.
-#
-# This is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published
-# by the Free Software Foundation; either version 3, or (at your
-# option) any later version.
-
-# It is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# ToDo:
-# Handle recursion, eg: lsl -R
-# Handle switches that take arguments, eg --block-size
-# Handle --almost-all, --ignore-backups, --format and --ignore
-
-main ()
-{
- init
-
- parse_args ${1+"$@"}
-
- list_objects
-
- exit 0
-}
-
-report ()
-{
- echo $prog": " ${1+"$@"}
-}
-
-fail ()
-{
- report " Internal error: " ${1+"$@"}
- exit 1
-}
-
-# Initialise global variables.
-init ()
-{
- # Default to listing things in the current directory.
- dirs[0]=".";
-
- # num_dirs is the number of directories to be listed minus one.
- # This is because we are indexing the dirs[] array from zero.
- num_dirs=0;
-
- # Default to ignoring things that start with a period.
- no_dots=1
-
- # Note - the global variables 'type' and 'opts' are initialised in
- # parse_args function.
-}
-
-# Parse our command line
-parse_args ()
-{
- local no_more_args
-
- no_more_args=0 ;
-
- prog=`basename $0` ;
-
- # Decide if we are listing files or directories.
- case $prog in
- lsf | lsf.sh)
- type=f
- opts="";
- ;;
- lsd | lsd.sh)
- type=d
- # The -d switch to "ls" is presumed when listing directories.
- opts="-d";
- ;;
- lsl | lsl.sh)
- type=l
- # Use -d to prevent the listed links from being followed.
- opts="-d";
- ;;
- lsx | lsx.sh)
- type=f
- find_extras="-perm /111"
- ;;
- *)
- fail "Unrecognised program name: '$prog', expected either 'lsd', 'lsf', 'lsl' or 'lsx'"
- ;;
- esac
-
- # Locate any additional command line switches for ls and accumulate them.
- # Likewise accumulate non-switches to the directories list.
- while [ $# -gt 0 ]
- do
- case "$1" in
- # FIXME: Handle switches that take arguments, eg --block-size
- # FIXME: Properly handle --almost-all, --ignore-backups, --format
- # FIXME: and --ignore
- # FIXME: Properly handle --recursive
- -a | -A | --all | --almost-all)
- no_dots=0;
- ;;
- --version)
- report "version 1.2"
- exit 0
- ;;
- --help)
- case $type in
- d) report "a version of 'ls' that lists only directories" ;;
- l) report "a version of 'ls' that lists only links" ;;
- f) if [ "x$find_extras" = "x" ] ; then
- report "a version of 'ls' that lists only files" ;
- else
- report "a version of 'ls' that lists only executables";
- fi ;;
- esac
- exit 0
- ;;
- --)
- # A switch to say that all further items on the command line are
- # arguments and not switches.
- no_more_args=1 ;
- ;;
- -*)
- if [ "x$no_more_args" = "x1" ] ;
- then
- dirs[$num_dirs]="$1";
- let "num_dirs++"
- else
- # Check for a switch that just uses a single dash, not a double
- # dash. This could actually be multiple switches combined into
- # one word, eg "lsd -alF". In this case, scan for the -a switch.
- # XXX: FIXME: The use of =~ requires bash v3.0+.
- if [[ "x${1:1:1}" != "x-" && "x$1" =~ "x-.*a.*" ]] ;
- then
- no_dots=0;
- fi
- opts="$opts $1";
- fi
- ;;
- *)
- dirs[$num_dirs]="$1";
- let "num_dirs++"
- ;;
- esac
- shift
- done
-
- # Remember that we are counting from zero not one.
- if [ $num_dirs -gt 0 ] ;
- then
- let "num_dirs--"
- fi
-}
-
-list_things_in_dir ()
-{
- local dir
-
- # Paranoia checks - the user should never encounter these.
- if test "x$1" = "x" ;
- then
- fail "list_things_in_dir called without an argument"
- fi
-
- if test "x$2" != "x" ;
- then
- fail "list_things_in_dir called with too many arguments"
- fi
-
- # Use quotes when accessing $dir in order to preserve
- # any spaces that might be in the directory name.
- dir="${dirs[$1]}";
-
- # Catch directory names that start with a dash - they
- # confuse pushd.
- if test "x${dir:0:1}" = "x-" ;
- then
- dir="./$dir"
- fi
-
- if [ -d "$dir" ]
- then
- if [ $num_dirs -gt 0 ]
- then
- echo " $dir:"
- fi
-
- # Use pushd rather passing the directory name to find so that the
- # names that find passes on to xargs do not have any paths prepended.
- pushd "$dir" > /dev/null
- if [ $no_dots -ne 0 ] ; then
- find . -maxdepth 1 -type $type $find_extras -not -name ".*" -printf "%f\000" \
- | xargs --null --no-run-if-empty ls $opts -- ;
- else
- find . -maxdepth 1 -type $type $find_extras -printf "%f\000" \
- | xargs --null --no-run-if-empty ls $opts -- ;
- fi
- popd > /dev/null
- else
- report "directory '$dir' could not be found"
- fi
-}
-
-list_objects ()
-{
- local i
-
- i=0;
- while [ $i -le $num_dirs ]
- do
- list_things_in_dir i
- let "i++"
- done
-}
-
-# Invoke main
-main ${1+"$@"}
-```
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/20/2/script-large-files
-
-作者:[Nick Clifton][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/nickclifton
-[b]: https://github.com/lujun9972
-[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/bash_command_line.png?itok=k4z94W2U (bash logo on green background)
diff --git a/sources/tech/20200219 Waterfox- Firefox Fork With Legacy Add-ons Options.md b/sources/tech/20200219 Waterfox- Firefox Fork With Legacy Add-ons Options.md
deleted file mode 100644
index 8593b5a981..0000000000
--- a/sources/tech/20200219 Waterfox- Firefox Fork With Legacy Add-ons Options.md
+++ /dev/null
@@ -1,110 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Waterfox: Firefox Fork With Legacy Add-ons Options)
-[#]: via: (https://itsfoss.com/waterfox-browser/)
-[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
-
-Waterfox: Firefox Fork With Legacy Add-ons Options
-======
-
-_**Brief: In this week’s open source software highlight, we take a look at a Firefox-based browser that supports legacy extensions that Firefox no longer supports while potentially providing fast user experience.**_
-
-When it comes to web browsers, Google Chrome leads the market share. [Mozilla Firefox is there still providing hopes for a mainstream web browser that respects your privacy][1].
-
-Firefox has improved a lot lately and one of the side-effects of the improvements is removal of add-ons. If your favorite add-on disappeared in last few months/years, you have a good new in the form of Witerfox.
-
-Attention!
-
-It’s been brought to our notice that Waterfox has been acquired by System1. This company also acquired privacy focused search engine Startpage.
-While System1 claims that they are providing privacy focused products because ‘there is a demand’, we cannot vouch for their claim.
-In other words, it’s up to you to trust System1 and Waterfox.
-
-### Waterfox: A Firefox-based Browser
-
-![Waterfox Classic][2]
-
-[Waterfox][3] is a useful open-source browser built on top of Firefox that focuses on privacy and supports legacy extensions. It doesn’t pitch itself as a privacy-paranoid browser but it does respect the basics.
-
-You get two separate Waterfox browser versions. The current edition aims to provide a modern experience and the classic version focuses to support [NPAPI plugins][4] and [bootstrap extensions][5].
-
-![Waterfox Classic][6]
-
-If you do not need to utilize bootstrap extensions but rely on [WebExtensions][7], Waterfox Current is the one you should go for.
-
-And, if you need to set up a browser that needs NPAPI plugins or bootstrap extensions extensively, Waterfox Classic version will be suitable for you.
-
-So, if you like Firefox, but want to try something different on the same line, this is a Firefox alternative for the job.
-
-### Features of Waterfox
-
-![Waterfox Current][8]
-
-Of course, technically, you should be able to do a lot of things that Mozilla Firefox supports.
-
-So, I’ll just highlight all the important features of Waterfox in a list here.
-
- * Supports NPAPI Plugins
- * Supports Bootstrap Extensions
- * Offers separate editions for legacy extension support and modern WebExtension support.
- * Cross-platform support (Windows, Linux, and macOS)
- * Theme customization
- * Archived Add-ons supported
-
-
-
-### Installing Waterfox on Ubuntu/Linux
-
-Unlike other popular browsers, you don’t get a package to install. So, you will have to download the archived package from its [official download page][9].
-
-![][10]
-
-Depending on what edition (Current/Classic) you want – just download the file, which will be **.tar.bz2** extension file.
-
-Once downloaded, simply extract the file.
-
-Next, head on to the extracted folder and look for the “**Waterfox**” file. You can simply double-click on it to run start up the browser.
-
-If that doesn’t work, you can utilize the terminal and navigate to the extracted **Waterfox** folder. Once there, you can simply run it with a single command. Here’s how it looks like:
-
-```
-cd waterfox-classic
-./waterfox
-```
-
-In either case, you can also head to its [GitHub page][11] and explore more options to get it installed on your system.
-
-[Download Waterfox][3]
-
-**Wrapping up**
-
-I fired it up on my Pop!_OS 19.10 installation and it worked really well for me. Though I don’t think I could switch from Firefox to Waterfox because I am not using any legacy add-on. It could still be an impressive option for certain users.
-
-You could give it a try and let me know your thoughts in the comments below.
-
---------------------------------------------------------------------------------
-
-via: https://itsfoss.com/waterfox-browser/
-
-作者:[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/why-firefox/
-[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/02/waterfox-classic.png?fit=800%2C423&ssl=1
-[3]: https://www.waterfox.net/
-[4]: https://en.wikipedia.org/wiki/NPAPI
-[5]: https://wiki.mozilla.org/Extension_Manager:Bootstrapped_Extensions
-[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/02/waterfox-classic-screenshot.jpg?ssl=1
-[7]: https://wiki.mozilla.org/WebExtensions
-[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/02/waterfox-screenshot.jpg?ssl=1
-[9]: https://www.waterfox.net/download/
-[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/02/waterfox-download-page.jpg?ssl=1
-[11]: https://github.com/MrAlex94/Waterfox
diff --git a/sources/tech/20200225 3 eBook readers for the Linux desktop.md b/sources/tech/20200225 3 eBook readers for the Linux desktop.md
deleted file mode 100644
index 1c057a15ed..0000000000
--- a/sources/tech/20200225 3 eBook readers for the Linux desktop.md
+++ /dev/null
@@ -1,118 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (3 eBook readers for the Linux desktop)
-[#]: via: (https://opensource.com/article/20/2/linux-ebook-readers)
-[#]: author: (Scott Nesbitt https://opensource.com/users/scottnesbitt)
-
-3 eBook readers for the Linux desktop
-======
-Any of these open source eBook applications will make it easy to read
-your books on a larger screen.
-![Computer browser with books on the screen][1]
-
-I usually read eBooks on my phone or with my Kobo eReader. I've never been comfortable reading books on larger screens. However, many people regularly read books on their laptops or desktops. If you are one of them (or think you might be), I'd like to introduce you to three eBook readers for the Linux desktop.
-
-### Bookworm
-
-[Bookworm][2] is billed as a "simple, focused eBook reader." And it is. Bookworm has a basic set of features, which some people will complain about being _too basic_ or lacking _functionality_ (whatever that word means). Bookworm does one thing and does it well without unnecessary frills.
-
-The application's interface is very clean and uncluttered.
-
-![Bookworm e-book application][3]
-
-You navigate through a book by pressing:
-
- * The space bar to move down a page
- * The Down and Up arrow keys to move down and up a single line
- * The Right and Left arrow keys to jump to the next or previous chapter
-
-
-
-You can also annotate portions of a book and insert bookmarks to jump back to a page.
-
-![Annotations in Bookworm][4]
-
-Bookworm doesn't have many configuration options. You can change the size and spacing of a book's font, enable a two-page reading view or dark mode, and add folders that Bookworm will scan to find new eBooks.
-
-![Bookworm preferences][5]
-
-Bookworm supports the most widely used eBook formats: EPUB, PDF, MOBI, and [FB2][6]. You can also use Bookworm to read popular digital comic book formats [CBR][7] and CBZ. I've tested Bookworm with only the first three formats. PDF files are readable, but they load slowly and the formatting can be rather ugly.
-
-### Foliate
-
-As far as features go, [Foliate][8] is a step or two above Bookworm. Not only does it have several more features, but it also has more configuration options. You get all of that in a zippy, clean, and uncluttered package.
-
-![Foliate e-book application][9]
-
-You can navigate through an eBook in Foliate using the space bar, arrow keys, or PgUp and PgDn keys. There's nothing unique there.
-
-You can also annotate text, look up and translate words and phrases, and look up the meanings of words. If you have a text-to-speech application installed on your computer, Foliate can use it to read books aloud.
-
-![Annotating a book in Foliate][10]
-
-Foliate has a few more customization options than Bookworm. You can change a book's font and its size, the spacing of lines, and the size of a book's margins. You can also increase or decrease the brightness and select one of four built-in themes.
-
-![Foliate settings][11]
-
-You can read books in the EPUB, MOBI, AZW, and AZW3 formats using Foliate. In case you're wondering, the latter three are closed formats used with books published for Amazon's Kindle eReader
-
-### Calibre's eBook viewer
-
-[eBook viewer][12] is a component of the [Calibre][13] eBook management tool. Like its parent, the eBook viewer feature isn't the prettiest piece of software out there.
-
-![E-book Viewer application][14]
-
-Don't let that put you off, though. It's a solid desktop eBook reader.
-
-You navigate through an eBook in Calibre's e-book viewer using the arrow and PgUp/PgDn keys or by pressing the space bar. You can also look up words in an online dictionary and add bookmarks throughout a book. E-book viewer lacks an annotation function, but its built-in search engine is solid, and you can save books as PDFs (though I'm not sure why you'd want to).
-
-Configuration options are an area where this eBook viewer shines. It has far more of them than both Bookworm and Foliate combined. You can change everything from fonts to the layout of text to how text is broken up into pages. On top of that, you can customize the keyboard shortcuts for using the application and add your favorite dictionary website or sites to help you look up words in a book you're reading.
-
-![E-book Viewer preferences][15]
-
-One useful feature of Calibre's eBook viewer is the ability to apply your own CSS file to your e-books. CSS, in case you're wondering, is a way to format web pages (which is what many e-books are made of). If you're a master with CSS, you can copy and paste your CSS file into the **User stylesheet** tab in eBook viewer's Preferences window. That's the ultimate in customization.
-
-eBook viewer, according to its developer, "can display all the major e-book formats." If you're wondering what those formats are, [here's a list][16]. I've tested it with just a few of those formats and have had no problems with them.
-
-### Final thought
-
-Whether you're looking for a simple eBook reader or one with bells and whistles and whatever else, the three applications in this article are good choices. Any of them can make reading an eBook on a larger screen easier.
-
-* * *
-
-_This article is based on an article published on [Open Source Musings][17] and appears here via a [CC BY-SA 4.0][18] license._
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/20/2/linux-ebook-readers
-
-作者:[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://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/computer_browser_program_books_read.jpg?itok=iNMWe8Bu (Computer browser with books on the screen)
-[2]: https://babluboy.github.io/bookworm/
-[3]: https://opensource.com/sites/default/files/uploads/bookworm-reading.png (Bookworm e-book application)
-[4]: https://opensource.com/sites/default/files/uploads/bookworm-annotations.png (Annotations in Bookworm)
-[5]: https://opensource.com/sites/default/files/uploads/bookworm-preferences.png (Bookworm preferences)
-[6]: https://en.wikipedia.org/wiki/FictionBook
-[7]: https://en.wikipedia.org/wiki/Comic_book_archive
-[8]: https://johnfactotum.github.io/foliate/
-[9]: https://opensource.com/sites/default/files/uploads/foliate-reading.png (Foliate e-book application)
-[10]: https://opensource.com/sites/default/files/uploads/foliate-annotation_0.png
-[11]: https://opensource.com/sites/default/files/uploads/foliate-settings.png (Foliate settings)
-[12]: https://calibre-ebook.com/about
-[13]: https://opensourcemusings.com/managing-your-ebooks-with-calibre
-[14]: https://opensource.com/sites/default/files/uploads/e-book_viewer-reading.png (E-book Viewer application)
-[15]: https://opensource.com/sites/default/files/uploads/ebook-viewer-preferences.png (E-book Viewer preferences)
-[16]: https://manual.calibre-ebook.com/faq.html#what-formats-does-calibre-support-conversion-to-from
-[17]: https://opensourcemusings.com/three-ebook-readers-for-the-linux-desktop
-[18]: https://creativecommons.org/licenses/by-sa/4.0/
diff --git a/sources/tech/20200226 Use logzero for simple logging in Python.md b/sources/tech/20200226 Use logzero for simple logging in Python.md
deleted file mode 100644
index 1fbd61b68f..0000000000
--- a/sources/tech/20200226 Use logzero for simple logging in Python.md
+++ /dev/null
@@ -1,156 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Use logzero for simple logging in Python)
-[#]: via: (https://opensource.com/article/20/2/logzero-python)
-[#]: author: (Ben Nuttall https://opensource.com/users/bennuttall)
-
-Use logzero for simple logging in Python
-======
-A quick primer on the handy log library that can help you master this
-important programming concept.
-![Snake charmer cartoon with a yellow snake and a blue snake][1]
-
-The logzero library makes logging as easy as a print statement, which is quite a feat of simplicity. I'm not sure whether logzero took its name to fit in with the series of "zero boilerplate" libraries like pygame-zero, GPIO Zero, and guizero, but it's certainly in that category. It's a Python library that makes logging straightforward.
-
-You can just use its basic logging to stdout the same way you might use print for information and debugging purposes, and it has a smooth learning curve towards more advanced logging, like logging to a file.
-
-To start, install logzero with pip:
-
-
-```
-`$ sudo pip3 install logzero`
-```
-
-Now in a Python file, import logger and try one or all of these logging examples:
-
-
-```
-from logzero import logger
-
-logger.debug("hello")
-logger.info("info")
-logger.warning("warning")
-logger.error("error")
-```
-
-The output is automatically colored in an easy-to-read way:
-
-![Python, Raspberry Pi: import logger][2]
-
-So now, instead of using **print** to figure out what's going on, use logger instead, with the relevant log level.
-
-### Writing logs to a file in Python
-
-If you only read this far and make that one change in the way you write code, that's good enough for me. If you want to go further, read on!
-
-Writing to **stdout** is fun for testing a new program, but it is only useful if you are logged into the computer where the script is running. Many times when using an application you'll want to execute the code remotely and review errors after the fact. That's when it's helpful to log to a file instead. Let's try it:
-
-
-```
-from logzero import logger, logfile
-
-logfile('/home/pi/test.log')
-```
-
-Now your log entries will be logged into the file **test.log**. Remember to make sure that the [script has permission][3] to write to that file and its directory structure.
-
-You can specify some more options too:
-
-
-```
-`logfile(’/home/pi/test.log’, maxBytes=1e6, backupCount=3)`
-```
-
-Now when the file provided to **logfile** reaches 1MB (1×106 bytes), it will rotate entries through **test.log.1**, **test.log.2**, and so on. This behavior is nice to avoid generating a massive log file that is I/O intensive for the system to open and close. You might also want to log to **/var/log** like a pro. Assuming you're on Linux, you a directory and make your user the owner so they can write to it:
-
-
-```
-$ sudo mkdir /var/log/test
-$ sudo chown pi /var/log/test
-```
-
-Then in your Python code, change the **logfile** path:
-
-
-```
-`logfile(’/var/log/test/test.log’, maxBytes=1e6, backupCount=3)`
-```
-
-When it comes to catching exceptions in your **logfile**, you can either use **logging.exception:**
-
-
-```
-try:
- c = a / b
-except Exception as e:
- logger.exception(e)
-```
-
-This will produce the following (in the case that b is zero):
-
-
-```
-[E 190422 23:41:59 test:9] division by zero
- Traceback (most recent call last):
- File "test.py", line 7, in
- c = a / b
- ZeroDivisionError: division by zero
-```
-
-You get the log entry, followed by the full traceback. Alternatively, you could use **logging.error** and hide the traceback:
-
-
-```
-try:
- c = a / b
-except Exception as e:
- logger.error(f"{e.__class__.__name__}: {e}")
-```
-
-Now this will produce the more succinct:
-
-
-```
-`[E 190423 00:04:16 test:9] ZeroDivisionError: division by zero`
-```
-
-* * *
-
-* * *
-
-* * *
-
-**![Logging output][4]**
-
-There are plenty more options which you can read in the docs at [logzero.readthedocs.io][5].
-
-### logzero shines for education
-
-Logging can be a challenging concept for a new programmer. Most frameworks depend on flow control and lots of variable manipulation to make a meaningful log, but logzero is different. With its syntax being similar to a print statement, it is a big win for education as it saves from explaining another concept. Give it a try on your next project.
-
-\--
-
-_This article was originally written on [my blog][6] and is republished with permission._
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/20/2/logzero-python
-
-作者:[Ben Nuttall][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/bennuttall
-[b]: https://github.com/lujun9972
-[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/getting_started_with_python.png?itok=MFEKm3gl (Snake charmer cartoon with a yellow snake and a blue snake)
-[2]: https://opensource.com/sites/default/files/uploads/rpi_ben_1.png (Python, Raspberry Pi: import logger)
-[3]: https://opensource.com/article/19/6/understanding-linux-permissions
-[4]: https://opensource.com/sites/default/files/uploads/rpi_ben_2.png (Logging output)
-[5]: https://logzero.readthedocs.io/en/latest/
-[6]: https://tooling.bennuttall.com/logzero/
diff --git a/sources/tech/20200228 Converting between uppercase and lowercase on the Linux command line.md b/sources/tech/20200228 Converting between uppercase and lowercase on the Linux command line.md
deleted file mode 100644
index a2819e3ff7..0000000000
--- a/sources/tech/20200228 Converting between uppercase and lowercase on the Linux command line.md
+++ /dev/null
@@ -1,161 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Converting between uppercase and lowercase on the Linux command line)
-[#]: via: (https://www.networkworld.com/article/3529409/converting-between-uppercase-and-lowercase-on-the-linux-command-line.html)
-[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
-
-Converting between uppercase and lowercase on the Linux command line
-======
-Converting text between uppercase and lowercase can be very tedious, especially when you want to avoid inadvertent misspellings. Fortunately, Linux provides a handful of commands that can make the job very easy.
-[andy.brandon50][1] [(CC BY-SA 2.0)][2]
-
-There are many ways to change text on the Linux command line from lowercase to uppercase and vice versa. In fact, you have an impressive set of commands to choose from. This post examines some of the best commands for the job and how you can get them to do just what you want.
-
-### Using tr
-
-The **tr** (translate) command is one of the easiest to use on the command line or within a script. If you have a string that you want to be sure is in uppercase, you just pass it through a **tr** command like this:
-
-```
-$ echo Hello There | tr [:lower:] [:upper:]
-HELLO THERE
-```
-
-[[Get regularly scheduled insights by signing up for Network World newsletters.]][3]
-
-Below is an example of using this kind of command in a script when you want to be sure that all of the text that is added to a file is in uppercase for consistency:
-
-```
-#!/bin/bash
-
-echo -n "Enter department name: "
-read dept
-echo $dept | tr [:lower:] [:upper:] >> depts
-```
-
-Switching the order to [:upper:] [:lower:] would have the opposite effect, putting all the department names in lowercase:
-
-```
-echo $dept | tr [:upper:] [:lower:] >> depts
-```
-
-Similarly, you could use the **sed** command's **A-Z** and **a-z** strings to accomplish the same thing:
-
-```
-echo $dept | tr a-z A-Z >> depts
-```
-
-As you undoubtedly suspect, reversing the order of the a-z and A-Z strings will have the opposite effect, turning the text to all lowercase.
-
-### Using awk
-
-The **awk** command lets you do the same thing with its **toupper** and **tolower** options. The command in the script shown in the previous example could be done this way instead:
-
-[][4]
-
-```
-echo $dept | awk '{print toupper($0)}' >> depts
-```
-
-The reverse (switching to lowercase) would look like this:
-
-```
-echo $dept | awk '{print tolower($0)}' >> depts
-```
-
-### Using sed
-
-The **sed** (stream editor) command also does a great job of switching between upper- and lowercase. This command would have the same effect as the first of the two shown above.
-
-```
-echo $dept | sed 's/[a-z]/\U&/g' >> depts
-```
-
-Switching from uppercase to lowercase would simply involve replacing the **U** near the end of the line with an **L**.
-
-```
-echo $dept | sed 's/[A-Z]/\L&/g' >> depts
-```
-
-### Manipulating text in a file
-
-Both **awk** and **sed** also allow you to change the case of text for entire files. So, you just found out your boss wanted those department names in all lowercase? No problem. Just run a command like this with the file name provided:
-
-```
-$ awk '{print tolower($0)}' depts
-finance
-billing
-bookkeeping
-```
-
-If you want to overwrite the **depts** file, instead of just displaying its contents in lowercase, you would need to do something like this:
-
-```
-$ awk '{print tolower($0)}' depts > depts-
-$ mv depts- depts
-```
-
-Making the change with **sed**, however, you can avoid that last step because **sed** can edit a file "in place" as shown here, leaving the file intact, but the text in all lowercase:
-
-```
-$ sed 's/[A-Z]/\L&/g' depts
-```
-
-### Capitalizing first letters only
-
-To capitalize only the first letters of words in a string, you can do something like this:
-
-```
-$ echo design \& engineering| sed -e "s/\b\(.\)/\u\1/g"
-Design & Engineering
-```
-
-That command will ensure that first letters are capitalized, but won't change the rest of the letters.
-
-### Making sure only first letters are uppercase
-
-It's a little more challenging when you want to change text so that only first letters are in uppercase. Say you're manipulating a list of staff members' names and you want them to be formatted in the normal Firstname Lastname manner.
-
-##### with sed
-
-You could use a considerably more complex **sed** command to ensure this result:
-
-```
-$ echo design \& ENGINEERING | sed 's/\b\([[:alpha:]]\)\([[:alpha:]]*\)\b/\u\1\L\2/g'
-Design & Engineering
-```
-
-##### with python
-
-If you have python loaded, you can run a command like this that also formats text so that only the first letters of each word are capitalized and the command may be a little easier to parse than the **sed** command shown above:
-
-```
-$ echo -n "design & engineering" | python3 -c "import sys; print(sys.stdin.read().title())"
-Design & Engineering
-```
-
-There are many ways to change the formatting of text between upper- and lowercase. Which works best depends in part of whether you're manipulating a single string or an entire file and how you want the end result to look.
-
-Join the Network World communities on [Facebook][5] and [LinkedIn][6] to comment on topics that are top of mind.
-
---------------------------------------------------------------------------------
-
-via: https://www.networkworld.com/article/3529409/converting-between-uppercase-and-lowercase-on-the-linux-command-line.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.flickr.com/photos/54027476@N07/4999959929
-[2]: https://creativecommons.org/licenses/by-sa/2.0/legalcode
-[3]: https://www.networkworld.com/newsletters/signup.html
-[4]: https://www.networkworld.com/article/3440100/take-the-intelligent-route-with-consumption-based-storage.html?utm_source=IDG&utm_medium=promotions&utm_campaign=HPE21620&utm_content=sidebar ( Take the Intelligent Route with Consumption-Based Storage)
-[5]: https://www.facebook.com/NetworkWorld/
-[6]: https://www.linkedin.com/company/network-world
diff --git a/sources/tech/20200302 Using LibreOffice for your open source budgeting tool.md b/sources/tech/20200302 Using LibreOffice for your open source budgeting tool.md
new file mode 100644
index 0000000000..9d26ff39c7
--- /dev/null
+++ b/sources/tech/20200302 Using LibreOffice for your open source budgeting tool.md
@@ -0,0 +1,168 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Using LibreOffice for your open source budgeting tool)
+[#]: via: (https://opensource.com/article/20/3/libreoffice-open-source-budget)
+[#]: author: (Jess Weichler https://opensource.com/users/cyanide-cupcake)
+
+Using LibreOffice for your open source budgeting tool
+======
+Figure out where your money is going with this LibreOffice Calc budget
+template.
+![scientific calculator][1]
+
+Budgets can be intimidating for beginners. It can feel overwhelming to think about money, much less about how to keep track of it. But it's important to know where your money is coming and going.
+
+In this article, I'll step through a sample budget by explaining the logic behind important money decisions as well as the formulas you need to automate the process. Fortunately, LibreOffice makes it easy for anyone to keep their yearly budget in check, even the math-averse.
+
+### Getting started
+
+Begin by downloading and installing [LibreOffice][2], if you don't already have it. Next, download my [LibreOffice Calc template][3], which you can use as a starting point to create your own budget to meet your spending and savings goals.
+
+It's important to interact with your spreadsheet frequently. You can input transactions as they happen, daily, or weekly. You even could save up your receipts to calculate all your expenses at the end of the month, but this can be a hard slog. You want budgeting to be as quick and easy as possible.
+
+### Categories
+
+The first step to creating a budget is to decide on the categories you want to track. These categories can be as simple or as complex as you like. Think about what is useful to your personal situation and financial goals. You can easily add or change categories as your needs change.
+
+The template has a number of example categories you can start with. There is no right or wrong way to choose categories; your budget has to work for you. Look through the list in Column A of the **Budget** tab and decide which ones to keep, which to delete, and any others you want to add. Then edit that list to align with your personal income and expense situation.
+
+#### Create category drop-down menus
+
+![Budget categories][4]
+
+The template uses a drop-down menu to make it easy to assign categories to income and expenses. You can view them on the **Monthly** sheets (accessed with the tabs at the bottom of the LibreOffice window). Click on a cell in Column C, and a drop-down arrow will appear on the right. Click the arrow, and you'll see the example categories. You may need to change some of them so that they will match the categories in your budget (Column A of the **Budget** tab).
+
+To add or remove categories from the dropdown menu, click on Column C in a Monthly sheet to select all **Category** cells. Then, in the main menu, select **Data** > **Validity**. This opens up a dialog box.
+
+In **Validity**, select the **Criteria** tab, then click on the arrow to the right of **Allow**, set it to **List**, and type the categories you want to use in the **Entries** box. Type one category per line. Make sure to use the exact same categories you used on the **Budget** sheet in Column A.
+
+### Estimating your budget
+
+Once you have defined your categories, it's time to estimate how much you expect to earn and spend. You can calculate these amounts monthly, yearly, or using a mix of the two.
+
+Your first year of budgeting estimates won't be perfect, and you may be surprised at how much or little you spend on certain categories. But doing this will help you get a realistic idea of where your money is going. You can make adjustments in your second year to create a more accurate budget based upon what you spend in year one.
+
+In Column B (**Monthly Estimate**) of the **Budget** tab, enter your anticipated _monthly_ income and expenses for each category (an exception is the **Charity** row, which is automatically calculated as a percentage of your income). For _annual_ expenses and income (e.g., taxes, insurance, tuition, etc.), enter them in Column P (**Yearly Estimate**).
+
+#### Calculating the annual cost of monthly expenses
+
+Most expenses occur monthly. To find the yearly cost of a monthly expense, multiply your monthly estimate by 12. You could do this manually for each category, but it is much easier to use formulas.
+
+Formulas are automated calculations that determine the value of a cell. Formulas do all the heavy lifting, so you don't have to do a lot of sums in your head.
+
+In the template, you can use the **Yearly Estimate** column to make an equation to annualize a monthly expense or income. In a cell in Column P, type this:
+
+
+```
+`=SUM(x*12)`
+```
+
+but change _x_ to the name of the **Monthly Estimate** cell you want to use. (For example, to calculate the annual cost of your phone service using the template, the formula would read **=SUM(B12*13)**.)
+
+#### Calculating the monthly cost of yearly expenses
+
+You may pay some expenses, such as car insurance, only once a year. You can either ignore these expenses in the monthly estimates or put money aside for them in your budget each month.
+
+If you want to do the latter, you need to divide your **Yearly Estimate** by 12 and put that amount into your monthly budget. To do so, place this equation in the appropriate cell in the **Monthly Estimate** column:
+
+
+```
+`=SUM(x/12)`
+```
+
+where _x_ is the corresponding **Yearly Estimate** cell on your spreadsheet (from Column P).
+
+#### Finding percentages
+
+If you want to donate or save a percentage of your income, there's a function for that, too!
+
+The common recommendation is to put aside 20% of your take-home pay for savings. While I don't focus on this too much, I do find it helpful to see if I'm meeting my savings goals from month to month.
+
+For instance, Row 32 of the **Budget** tab template uses this formula to calculate the 20% of your income that you should allocate to savings:
+
+
+```
+`=SUM(B2*0.2)`
+```
+
+This same method can be used if you give a percentage (e.g., 10%) of your income to charity (Row 21 of the template):
+
+
+```
+`=SUM(B2*-0.1)`
+```
+
+This formula uses a negative percentage because donating to charity is an expense.
+
+### Entering monthly income and expenses
+
+The template pulls data totals from the **Monthly** sheets (the tabs at the bottom of the spreadsheet) to populate Columns C through N on the **Budget** sheet.
+
+It's useful to place each month's transactions on separate sheets of your budget spreadsheet. By keeping your receipts from purchases and entering them into each month's sheet, you create a digital record of your money.
+
+Enter income as positive numbers and expenses as negative numbers. Select the appropriate category using the drop-down in the **Category** column.
+
+In LibreOffice, the **SUMIF** function can look at values in a specific column and extract only the ones that occur next to a specific word. My template uses a **SUMIF** formula to extract values based on the adjacent category in order to enter an amount in the correct cell on the **Budget** tab. For example, to enter January's internet expenses into the **Budget** spreadsheet, enter this formula in cell C12:
+
+
+```
+`=SUMIF(january.$C:$C,A12,january.$D:$D)`
+```
+
+This looks at January's Column C and, if it sees an entry that contains the word in A12 on the **Budget** tab (Internet), then it extracts the number from Column D on the **January** tab and enters that value into the cell that contains the formula on the **Budget** tab (C12).
+
+### Analyzing your budget data
+
+#### Adding a range of numbers to calculate YTD spending
+
+To see how much you have spent overall this year to date (YTD), select the cell where you want to display that data (in the template, it's cell O29, under the **YTD** column), and enter the following formula to total the range of numbers corresponding to your monthly **Total Expense**:
+
+
+```
+`=SUM(x:y)`
+```
+
+Instead of _x_ and _y_, enter the first cell and the last cell in the range. You can type them in manually, but it's easier and less error-prone to just click and drag from the first to last cell. LibreOffice does the calculation and enters the appropriate values.
+
+#### Seeing how you're doing on your budget
+
+A big part of budgeting is comparing your estimates to your actual income and expenses. In the template, this is the **Budget** tab's Column Q. This column subtracts the contents of each cell in Column O (**YTD**) from Column P (**Yearly Estimate**).
+
+
+```
+`=SUM(x-y)`
+```
+
+where _x_ and _y_ equal the corresponding cells from Column P and O. For example, using the template to calculate how much you've spent on Utilities compared to your budget, you would enter **=SUM(P11-O11)**.
+
+![Budget overview][5]
+
+### Tracking expenses
+
+Now that your yearly budget is set up, you are ready to start meeting your financial goals.
+
+It's important to look at your budget often—and it's equally important to do so without guilt. Think of this process as gathering data so that you can adjust your estimates for the next year. The primary goal of budgeting is to understand your own spending habits and refine either your expectations or your behavior so that you can plan better for how your income is used.
+
+Which open source tools and apps do you use to budget? Tell us in the comments!
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/libreoffice-open-source-budget
+
+作者:[Jess Weichler][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/cyanide-cupcake
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/calculator_money_currency_financial_tool.jpg?itok=2QMa1y8c (scientific calculator)
+[2]: https://www.libreoffice.org/download/download/
+[3]: https://opensource.com/sites/default/files/uploads/budget_template_0.ods
+[4]: https://opensource.com/sites/default/files/uploads/imagebudget_cat.png (Budget categories)
+[5]: https://opensource.com/sites/default/files/uploads/imagebudget_overview.png (Budget overview)
diff --git a/sources/tech/20200303 Getting started with lightweight alternatives to GNU Emacs.md b/sources/tech/20200303 Getting started with lightweight alternatives to GNU Emacs.md
new file mode 100644
index 0000000000..5f86c79b84
--- /dev/null
+++ b/sources/tech/20200303 Getting started with lightweight alternatives to GNU Emacs.md
@@ -0,0 +1,164 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Getting started with lightweight alternatives to GNU Emacs)
+[#]: via: (https://opensource.com/article/20/3/lightweight-emacs)
+[#]: author: (Seth Kenlon https://opensource.com/users/seth)
+
+Getting started with lightweight alternatives to GNU Emacs
+======
+Slimmed-down (in size and features) alternatives allow you to take your
+text editor anywhere you go.
+![Text editor on a browser, in blue][1]
+
+I work on a lot of servers, and sometimes I find a host that hasn't installed [GNU Emacs][2]. There's usually a [GNU Nano][3] installation to keep me from resorting to [Vi][4], but I'm not used to Nano the way I am Emacs, and I inevitably run into complications when I try to save my document (**C-x** in Nano stands for Exit, and **C-s** locks Konsole).
+
+While it would be nice to have GNU Emacs available everywhere, it's a lot of program for making a simple update to a config file. My need for a small and lightweight emacs is what took me down the path of discovering MicroEmacs, Jove, and Zile—tiny, self-contained [emacsen][5] that you can put on a thumb drive, an SD card, and nearly any server, so you'll never be without an emacs editor.
+
+### Editing macros
+
+The term "emacs" is a somewhat generic term in the way that only open source produces, and a portmanteau. Before there was [GNU Emacs][6], there were collections of batch process scripts (called _macros_) that could perform common tasks for a user. For instance, if you often found yourself typing "teh" instead of "the," you could either go in and correct each one manually (no small feat when your editor can't even load the entire document into memory, as was often the case in the early 1980s), or you could invoke a macro to perform a quick swap of the "e" and "h."
+
+Eventually, these macros were bundled together into a package called editing macros, or EMACS for short. GNU Emacs is the most famous emacsen (yes, the -en suffix is used to describe many emacs, as in the word "oxen"), but it's not the only one. And it's certainly not the smallest. Quite the contrary, GNU Emacs is probably one of the largest.
+
+Fortunately, GNU Emacs is so popular that other emacs implementations tend to mimic most of the GNU version's basic controls. If you're looking for a basic, fast, and efficient editor that isn't Vim, you'll likely be happy with any of these options.
+
+### MicroEmacs
+
+![µemacs][7]
+
+[MicroEmacs][8], also known as uemacs (as in the Greek letter µ, which denotes "micro" in scientific notation), was written by Dave Conroy, but there's a long list of users who have cloned it and modified it. One user who maintains a personal version of µemacs is a programmer named Linus Torvalds, and his copy is available from his website, [kernel.org][9] (which also, incidentally, includes a small side project of his called [Linux][10]).
+
+#### Size
+
+It takes me five seconds to compile µemacs at the slowest setting I can impose on my computer, and the resulting binary is a mere 493KB. Admittedly, that's not literally "micro" compared to the typical size of a GNU Emacs download (1 millionth of 70MB is 70 bytes, by my calculation), but it's respectably small. For instance, it's easy enough to send it to yourself by email or over Signal, and certainly small enough to keep handy on every thumb drive or SD card you own.
+
+By default, Linus's version expects libcurses, but you can override this setting in the Makefile so that it uses libtermcap instead. The resulting binary is independent enough to run on most Linux boxes:
+
+
+```
+$ ldd em
+linux-vdso.so.1
+libtermcap.so.2 => /lib64/libtermcap.so.2
+libc.so.6 => /lib64/libc.so.6
+/lib64/ld-linux-x86-64.so.2
+```
+
+#### Features
+
+The [keyboard shortcuts][11] are just as you'd expect. You can open files and edit them without ever realizing you're not in GNU Emacs.
+
+Some advanced features are missing. For instance, there's no vertical buffer split, although there is a horizontal split. There's no eval command, so you won't use µemacs for Lisp programming.
+
+The search function is also a little different from what you may be used to: instead of **C-s**, it's **M-s**, which could make all the difference if your terminal emulator accepts **Ctrl+S** as a freeze command. The help page for µemacs is very complete, so use **M-x help** to get familiar with what it has available.
+
+#### License
+
+The license for µemacs is custom to the project with a non-commercial condition. You're free to share, use, and modify µemacs, but you can't do anything commercial with it.
+While not as liberal a policy as I typically prefer, it's a good-enough license for personal use; just don't build a business around it.
+
+### GNU Zile
+
+![GNU Zile][12]
+
+[GNU Zile][13] claims to be a development kit for text editors. It's meant as a framework to enable people to quickly develop their own custom text editor without having to reinvent common data structures. It's a great idea and probably very useful, but as I have no interest in making my own editor, I just use the example implementation that ships with its codebase as a pleasant, lightweight emacs.
+
+The build process for the example editor (supposedly called Zemacs, although the binary it renders is named zile) is the standard [Autotools][14] procedure:
+
+
+```
+$ ./configure
+$ make
+```
+
+#### Size
+
+Compiling it from source takes me a minute on one core or about 50 seconds on six cores (the configuration process is the long part). The binary produced in the end is 1.2MB, making this the heaviest of the lightweight emacsen I use, but compared to even GNU Emacs without X (which is 14MB on my system), it's relatively trivial.
+
+Of the lightweight emacsen I use, it's also the most complex. You can exclude some library links by disabling features during configuration, but here are the defaults:
+
+
+```
+$ ldd src/zile
+linux-vdso.so.1
+libacl.so.1 => /lib64/libacl.so.1
+libncurses.so.5 => /lib64/libncurses.so.5
+libgc.so.1 => /usr/lib64/libgc.so.1
+libc.so.6 => /lib64/libc.so.6
+libattr.so.1 => /lib64/libattr.so.1
+libdl.so.2 => /lib64/libdl.so.2
+libpthread.so.0 => /lib64/libpthread.so.0
+/lib64/ld-linux-x86-64.so.2
+```
+
+#### Features
+
+Zile acts a little more like GNU Emacs than µemacs or Jove, but it's still a minimal experience. But some little touches are refreshing: Tab completion happens in a buffer, you can run shell commands from the mini-buffer, and you have a good assortment of functions available. It's by no means a GNU Emacs replacement, though, and if you wander too far in search of advanced features, you'll find out why it's only 1.2MB.
+
+I've been unable to find in-application help files, and the man page bundled with it is minimal. However, if you're comfortable with Emacs, Zile is a good compromise between the full 14MB (or greater, if you're using a GUI) version and the extremely lightweight implementations.
+
+### Jove
+
+![Jove][15]
+
+[Jove][16] was my first tiny emacs and remains the smallest I've found yet. This was an easy discovery for me, as it ships with [Slackware][17] Linux and, with a surreptitious symlink, quickly became my personal replacement for the Vi binary. Jove is based on GNU Emacs, but the man page cautions that feature parity is by no means to be expected. I find Jove surprisingly feature-rich for such a small binary (in fact, this article was written in Jove version 4.17.06-9), but there's no question that renaming .emacs to .joverc does _not_ behave as you might hope.
+
+#### Size
+
+It takes me five seconds to compile Jove at the slowest setting (-j1) and about a second using all cores. The resulting binary, confusingly called jjove by default, is just 293KB.
+
+The Jove binary is independent enough to run on most Linux boxes:
+
+
+```
+$ ldd jjove
+linux-vdso.so.1
+libtermcap.so.2 => /lib64/libtermcap.so.2
+libc.so.6 => /lib64/libc.so.6
+/lib64/ld-linux-x86-64.so.2
+```
+
+#### Features
+
+Jove has good documentation in the form of a man page. You can also get a helpful listing of all available commands by typing **M-x ?** and using the Spacebar to scroll. If you're entirely new to emacs, you can run **teachjove** to learn Jove (and emacs, accordingly).
+
+Most common editing commands and keybindings work as expected. Some oddities exist; for example, there's no vertical split, and Tab completion for paths in the mini-buffer is non-existent. However, it's the smallest emacs I've found and yet has a full GNU Emacs feel to it.
+
+### Try Emacs
+
+If you've only ever tried GNU Emacs, then you might find that the world of emacsen is richer than you may have expected. There's a rich tradition behind emacs, and trying some of its variants, spin-offs, and alternate implementations is part of the joy of being comfortable with how emacsen work. Get to know emacs; carry a few builds around everywhere you go, and you'll never have to use a substandard editor again!
+
+GNU Emacs can be much more than just a text editor. Learn how to get started.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/lightweight-emacs
+
+作者:[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/sites/default/files/styles/image-full-size/public/lead-images/browser_blue_text_editor_web.png?itok=lcf-m6N7 (Text editor on a browser, in blue)
+[2]: https://www.gnu.org/software/emacs/
+[3]: https://www.nano-editor.org/
+[4]: https://opensource.com/article/19/3/getting-started-vim
+[5]: https://www.emacswiki.org/emacs/Emacsen
+[6]: https://opensource.com/article/20/2/who-cares-about-emacs
+[7]: https://opensource.com/sites/default/files/uploads/lightweight-emacs-uemacs.jpg (µemacs)
+[8]: https://en.wikipedia.org/wiki/MicroEMACS
+[9]: https://git.kernel.org/pub/scm/editors/uemacs/uemacs.git
+[10]: https://opensource.com/tags/linux
+[11]: https://opensource.com/downloads/emacs-cheat-sheet
+[12]: https://opensource.com/sites/default/files/uploads/lightweight-emacs-zile.jpg (GNU Zile)
+[13]: https://www.gnu.org/software/zile/
+[14]: https://opensource.com/article/19/7/introduction-gnu-autotools
+[15]: https://opensource.com/sites/default/files/uploads/lightweight-emacs-jove.jpg (Jove)
+[16]: https://opensource.com/article/17/1/jove-lightweight-alternative-vim
+[17]: http://slackware.com
diff --git a/sources/tech/20200303 Watching activity on Linux with watch and tail commands.md b/sources/tech/20200303 Watching activity on Linux with watch and tail commands.md
new file mode 100644
index 0000000000..15780a5b34
--- /dev/null
+++ b/sources/tech/20200303 Watching activity on Linux with watch and tail commands.md
@@ -0,0 +1,148 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Watching activity on Linux with watch and tail commands)
+[#]: via: (https://www.networkworld.com/article/3529891/watching-activity-on-linux-with-watch-and-tail-commands.html)
+[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
+
+Watching activity on Linux with watch and tail commands
+======
+The watch and tail commands can help monitor activity on Linux systems. This post looks at some helpful ways to use these commands.
+Loops7 / Getty Images
+
+The **watch** and **tail** commands provide some interesting options for examining activity on a Linux system in an ongoing manner.
+
+That is, instead of just asking a question and getting an answer (like asking **who** and getting a list of currently logged in users), you can get **watch** to provide you with a display showing who is logged in along with updates as users come and go.
+
+[[Get regularly scheduled insights by signing up for Network World newsletters.]][1]
+
+With **tail**, you can display the bottoms of files and see content as it is added. This kind of monitoring is often very helpful and requires less effort than running commands periodically.
+
+### Using watch
+
+One of the simplest examples of using **watch** is to use the command **watch who**. You should see a list showing who is logged in along with when they logged in and where they logged in from. Notice that the default is to update the display every two seconds (top left) and that the date and time (upper right) updates itself at that interval. The list of users will grow and shrink as users log in and out.
+
+### $ watch who
+
+This command will dissplay a list of logins like this:
+
+```
+Every 2.0s: who dragonfly: Thu Feb 27 10:52:00 2020
+
+nemo pts/0 2020-02-27 08:07 (192.168.0.11)
+shs pts/1 2020-02-27 10:58 (192.168.0.5)
+```
+
+You can change the interval to get less frequent updates by adding a **-n** option (e.g., -n 10) to select a different number of seconds between updates.
+
+### $ watch -n 10 who
+
+The new interval will be displayed and the time shown will change less frequently, aligning itself with the selected interval.
+
+[][2]
+
+```
+Every 10.0s: who dragonfly: Thu Feb 27 11:05:47 2020
+
+nemo pts/0 2020-02-27 08:07 (192.168.0.11)
+shs pts/1 2020-02-27 10:58 (192.168.0.5)
+```
+
+If you prefer to see only the command's output and not the heading (the top 2 lines), you can omit those lines by adding the **-t** (no title) option.
+
+### $ watch -t who
+
+Your display will then look like this:
+
+```
+nemo pts/0 2020-02-27 08:07 (192.168.0.11)
+shs pts/1 2020-02-27 10:58 (192.168.0.5)
+```
+
+If every time the watched command runs, its output is the same, only the title line (if not omitted) will change. The rest of the displayed information will stay the same.
+
+If you want your **watch** command to exit as soon as the output of the command that it is watching changes, you can use a **-g** (think of this as the "go away") option. You might choose to do this if, for example, you are simply waiting for others to start logging into the system.
+
+You can also highlight changes in the displayed output using the **-d** (differences) option. The highlighting will only last for one interval (2 seconds by default), but can help to draw your attention to the changes.
+
+Here's a more complex example of using the **watch** command to display services that are listening for connections and the ports they are using. While the output isn't likely to change, it would alert you to any new service starting up or one going down.
+
+```
+$ watch 'sudo lsof -i -P -n | grep LISTEN'
+```
+
+Notice that the command being run needs to be enclosed in quotes to ensure that the **watch** command doesn't send its output to the grep command.
+
+Using the **watch -h** command will provide you with a list of the command's options.
+
+```
+$ watch -h
+
+Usage:
+ watch [options] command
+
+Options:
+ -b, --beep beep if command has a non-zero exit
+ -c, --color interpret ANSI color and style sequences
+ -d, --differences[=]
+ highlight changes between updates
+ -e, --errexit exit if command has a non-zero exit
+ -g, --chgexit exit when output from command changes
+ -n, --interval seconds to wait between updates
+ -p, --precise attempt run command in precise intervals
+ -t, --no-title turn off header
+ -x, --exec pass command to exec instead of "sh -c"
+
+ -h, --help display this help and exit
+ -v, --version output version information and exit
+```
+
+### Using tail -f
+
+The **tail -f** command has something in common with **watch**. It will both display the bottom of a file and additional content as it is added. Instead of having to run a "tail" command again and again, you run one command and get a repeatedly updated view of its output. For example, you could watch a system log with a command like this:
+
+```
+$ tail -f /var/log/syslog
+```
+
+Some files, like **/var/log/wtmp**, don't lend themselves to this type of handling because they're not formatted as normal text files, but you could get a similar result by combining **watch** and **tail** like this:
+
+```
+watch 'who /var/log/wtmp | tail -20'
+```
+
+This command will display the most recent 5 logins regardless of how many of the users are still logged in. If another login occurs, a line will be added and the top line removed.
+
+```
+Every 60.0s: who /var/log/wtmp | tail -5 dragonfly: Thu Feb 27 12:46:07 2020
+
+shs pts/0 2020-02-27 08:07 (192.168.0.5)
+nemo pts/1 2020-02-27 08:26 (192.168.0.5)
+shs pts/1 2020-02-27 10:58 (192.168.0.5)
+nemo pts/1 2020-02-27 11:34 (192.168.0.5)
+dory pts/1 2020-02-27 12:14 (192.168.0.5)
+```
+
+Both the **watch** and **tail -f** commands can provide auto-updating views of information that you might at times want to monitor, making the task of monitoring quite a bit easier whether you're monitoring processes, logins or system resources.
+
+Join the Network World communities on [Facebook][3] and [LinkedIn][4] to comment on topics that are top of mind.
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3529891/watching-activity-on-linux-with-watch-and-tail-commands.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/newsletters/signup.html
+[2]: https://www.networkworld.com/article/3440100/take-the-intelligent-route-with-consumption-based-storage.html?utm_source=IDG&utm_medium=promotions&utm_campaign=HPE21620&utm_content=sidebar ( Take the Intelligent Route with Consumption-Based Storage)
+[3]: https://www.facebook.com/NetworkWorld/
+[4]: https://www.linkedin.com/company/network-world
diff --git a/sources/tech/20200304 Getting started with the Gutenberg editor in Drupal.md b/sources/tech/20200304 Getting started with the Gutenberg editor in Drupal.md
new file mode 100644
index 0000000000..6050adebfa
--- /dev/null
+++ b/sources/tech/20200304 Getting started with the Gutenberg editor in Drupal.md
@@ -0,0 +1,122 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Getting started with the Gutenberg editor in Drupal)
+[#]: via: (https://opensource.com/article/20/3/gutenberg-editor-drupal)
+[#]: author: (MaciejLukianski https://opensource.com/users/maciejlukianski)
+
+Getting started with the Gutenberg editor in Drupal
+======
+Learn how to use the WYSIWYG editor, made popular in WordPress, with
+Drupal.
+![Text editor on a browser, in blue][1]
+
+Since 2017, WordPress has had a really great WYSIWYG editor in the [Gutenberg][2] plugin. But the Drupal community hasn't yet reached consensus on the best approach to the content management system's (CMS) editorial experience. But a strong new option appeared when, with a lot of community effort, [Gutenberg was integrated with Drupal][3].
+
+Previously, there were two main approaches to content creation in Drupal 8:
+
+ * In the [**Paragraph-based approach**][4], content is assembled out of entities called paragraphs. Currently, approximately 100,000 websites use the Paragraphs module (according to Drupal).
+ * The [**Layout-Builder approach**][5] uses an editorial tool shipped with Drupal 8.5. It is still undergoing improvements, but it is the next strong contender because it is really well integrated with the Drupal core. Stats on usage are not available since Layout Builder is part of Drupal.
+
+
+
+At the end of 2018, the Drupal community, lead by Fronkom (a Norwegian digital agency strongly focused on open source solutions), ported the WordPress Gutenberg project as a contributed module into Drupal. Let's take a look at how Gutenberg works in Drupal (including some cool Drupal-specific integrations).
+
+### Installation
+
+Installing the [Gutenberg module][6] is as straightforward as installing any Drupal module, and it has good [installation documentation][7].
+
+### Configuration
+
+Gutenberg is integrated into Drupal's default content-entity creation workflow. You can use it on any of the content types you choose, provided that the content type has at least one text area field, which is where the Gutenberg editor's output will be saved.
+
+To enable the Gutenberg project on a content type in Drupal, you have to navigate to its settings: **Structure > Content types** and, from the dropdown next to the content type where you want to use Gutenberg, click **Edit**.
+
+![Drupal settings][8]
+
+In the form that appears, scroll down and select the **Gutenberg experience** tab on the left, where you can find the settings described below. Select the **Enable Gutenberg experience** box.
+
+![Drupal Gutenberg settings][9]
+
+#### Template
+
+This is one of the cool features that is not available in WordPress out of the box. It enables you to define a template for a new page in a JSON structure. This will pre-populate all newly created articles with dummy placeholder content, which will help editors structure content correctly. In the screenshot above, I added a heading and a paragraph. Note that any double-quotes have to be escaped.
+
+#### Template lock
+
+This setting allows you to define whether users are allowed to delete the placeholder content, add new blocks, or just edit the existing, pre-populated content.
+
+#### Allowed Gutenberg and Drupal blocks
+
+This is another super-cool feature on the Drupal side of Gutenberg. Drupal allows users to create various types of blocks to design a page. For example, you could create a block with a list of the five latest blog posts, the most recent comments, or a form to collect users' emails.
+
+Gutenberg's deep integration with Drupal allows users to select which Drupal blocks are available to users while they are editing (e.g., limit embeds to YouTube) and use blocks as inline content. This is a very handy feature that allows granular control of the user experience.
+
+There's not much to choose from in a blank Drupal installation, but a live site usually has many blocks that provide various functionalities. In the screenshot below, the **Search form** Drupal block is selected.
+
+![Drupal Gutenberg blocks][10]
+
+After you finish the configuration, hit **Save content type**.
+
+### Publishing content with Drupal Gutenberg
+
+When Gutenberg is enabled for a content type, it takes over most of the editorial experience.
+
+![Drupal Gutenberg content screen][11]
+
+In the main window, you can see the dummy placeholder content I added in the Template configuration above.
+
+#### Drupal-specific options
+
+On the right-hand side, there are a few fields and settings that Drupal provides. For example, the **Title** field is a required separate field in Drupal, and therefore it is not on the main Gutenberg screen.
+
+Underneath the **Title**, there are additional settings that can vary, depending on the modules installed and options set up in Drupal. You can see **Revision log messages**, **Menu settings**, **Comment settings**, and a place to add a **URL alias**.
+
+Typically, Drupal content types are composed of several text fields, such as tags, categories, checkboxes, image fields for teasers, etc. When you enable Gutenberg for a content type, these additional fields are available in the **More settings** tab.
+
+You can now add your content—it works the same as it does in WordPress Gutenberg, with the additional option to add Drupal blocks.
+
+In the screenshot below, you can see what happens when I add some text to replace the placeholder text, a search block from Drupal, a title, tags, and a custom URL alias.
+
+![Drupal Gutenberg entering text][12]
+
+After you hit **Save**, your content will be published.
+
+![Drupal Gutenberg output][13]
+
+And that is it. It works like a charm!
+
+### Working together for better software experiences
+
+Gutenberg in Drupal works well. It is an alternative option that allows editors to control the look and feel of their websites down to the tiniest details. Adoption is growing well, with over 1,000 installations as of this writing and 50 new ones every month. The Drupal integration adds other cool features like fine-grained permissions, placeholder content, and the ability to include Drupal blocks inline, which aren't available in the WordPress plugin.
+
+It is great to see the communities of two separate projects working together to achieve the common goal of giving people better software.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/gutenberg-editor-drupal
+
+作者:[MaciejLukianski][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/maciejlukianski
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_blue_text_editor_web.png?itok=lcf-m6N7 (Text editor on a browser, in blue)
+[2]: https://wordpress.org/plugins/gutenberg/
+[3]: https://drupalgutenberg.org/
+[4]: https://www.droptica.com/blog/flexible-and-easy-content-creation-drupal-paragraphs-module/
+[5]: https://www.droptica.com/blog/layout-builder-building-drupal-8-layouts/
+[6]: https://www.drupal.org/project/gutenberg
+[7]: https://www.drupal.org/docs/8/extending-drupal-8/installing-drupal-8-modules
+[8]: https://opensource.com/sites/default/files/uploads/gutenberg_edit.png (Drupal settings)
+[9]: https://opensource.com/sites/default/files/uploads/gutenberg_settings.png (Drupal Gutenberg settings)
+[10]: https://opensource.com/sites/default/files/uploads/gutenberg_blocks.png (Drupal Gutenberg blocks)
+[11]: https://opensource.com/sites/default/files/uploads/gutenberg_contentwindow.png (Drupal Gutenberg content screen)
+[12]: https://opensource.com/sites/default/files/uploads/gutenberg_entry.png (Drupal Gutenberg entering text)
+[13]: https://opensource.com/sites/default/files/uploads/gutenberg-demo.png (Drupal Gutenberg output)
diff --git a/sources/tech/20200304 How service virtualization relates to test-driven development.md b/sources/tech/20200304 How service virtualization relates to test-driven development.md
new file mode 100644
index 0000000000..4ff4243603
--- /dev/null
+++ b/sources/tech/20200304 How service virtualization relates to test-driven development.md
@@ -0,0 +1,428 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How service virtualization relates to test-driven development)
+[#]: via: (https://opensource.com/article/20/3/service-virtualization-test-driven-development)
+[#]: author: (Alex Bunardzic https://opensource.com/users/alex-bunardzic)
+
+How service virtualization relates to test-driven development
+======
+Mountebank simulates services you're dependent on so autonomous teams
+can continue development activities without having to wait on anyone.
+![Person using a laptop][1]
+
+The agile approach to software development relies on service virtualization to give each IT team autonomy. This approach removes blockages and allows autonomous teams to continue development activities without having to wait on anyone. That way, integration testing can commence as soon as teams start iterating/sprinting.
+
+### How automated services work
+
+Any automated service is available to consumers via a published endpoint. This means services can be automated only if they're made available online.
+
+Any consumer wishing to leverage available automated services must be capable of sending requests to that service's endpoint via an HTTP protocol. Some of those services will, upon receiving the request via the HTTP protocol, respond by simply sending back some data. Other services may respond to receiving a request via HTTP protocol by actually performing some work. For example, a service may create a resource (for example, create an order), update a resource (update an order), or delete a resource (cancel an order).
+
+All those activities get triggered via the HTTP protocol. In the simplest of cases, the action instigated by the service consumer is GET (e.g., HTTP GET). That request may arrive with some query values; those values will get used by the service to narrow down the search (such as "search for order number 12345 and return the data").
+
+In more elaborate cases, a request may arrive with the instruction to POST some values; a service will accept that request and expect some values to be associated with it. Those values are usually called the payload. When the service accepts an HTTP POST request containing the payload, it will attempt to process it. It may or may not succeed in processing it, but either way, it will respond to the service consumer with a status code and an optional status message. That way, service consumers will be notified of the success/failure of their request so that they can decide what the next step should be.
+
+### What is service virtualization?
+
+Now that we understand how automated services work, it should be easier to understand how to virtualize them. In a nutshell, it is possible to simulate any service that is published on a hosting site. Instead of sending HTTP requests directly to the service provider's endpoint, you can interject a fake, pretend service that simulates the behavior of the real service.
+
+From the service consumer's standpoint, it makes absolutely no difference whether it is interacting with a real or a fake service. The interaction remains identical.
+
+### Virtualize one service
+
+OK, enough talking, I'll roll up my sleeves and show how to do it in practical terms. Suppose your team is starting a new project and receives requirements in the form of a fully fleshed user story:
+
+#### Authenticate user
+
+_As a new app_
+_I want to authenticate the user_
+_Because we want to ensure proper security for the app_
+
+#### Acceptance criteria
+
+**Scenario #1:** _New app successfully authenticates the user_
+Given that the user has navigated to the login page
+And the user has submitted credentials
+When new app receives login request
+Then new app successfully authenticates the user
+And new app displays response message "User successfully logged in."
+
+**Scenario #2:** _New app cannot authenticate the user on the first attempt_
+Given that the user has navigated to the login page
+And the user has submitted credentials
+When new app receives login request
+Then new app fails to successfully authenticate the user
+And new app displays response message "Incorrect login. You have 2 more attempts left."
+
+**Scenario #3:** _New app cannot authenticate the user on the second attempt_
+Given that the user has navigated to the login page
+And the user has submitted credentials
+When new app receives login request
+Then new app fails to successfully authenticate the user
+And new app displays response message "Incorrect login. You have 1 more attempt left."
+
+**Scenario #4:** _New app cannot authenticate the user on the third attempt_
+Given that the user has navigated to the login page
+And the user has submitted credentials
+When new app receives login request
+Then new app fails to successfully authenticate the user
+And new app displays response message "Incorrect login. You have no more attempts left."
+
+The first thing to do when starting the work on this user story is to create the so-called "walking skeleton" (for this exercise, I will be using the standard **.Net Core** platform plus **xUnit.net** I discussed in my previous articles ([starting with this one][2] with [another example here][3]). Please refer to them for technical details on how to install, configure, and run the required tools.
+
+Create the walking skeleton infrastructure by opening the command line and typing:
+
+
+```
+`mkdir AuthenticateUser`
+```
+
+Then move inside the **AuthenticateUser** folder:
+
+
+```
+`cd AuthenticateUser`
+```
+
+And create a separate folder for tests:
+
+
+```
+`mkdir tests`
+```
+
+Move into the **tests** folder (**cd tests**) and initiate the **xUnit** framework:
+
+
+```
+`dotnet new xunit`
+```
+
+Now move one folder up (back to **AuthenticateUser**) and create the app folder:
+
+
+```
+mkdir app
+cd app
+```
+
+Create the scaffold necessary for C# code:
+
+
+```
+`dotnet new classlib`
+```
+
+The walking skeleton is now ready! Open the editor of your choice and start coding.
+
+### Write a failing test first
+
+In the spirit of TDD, start by writing the failing test (refer to the [previous article][4] to learn why is it important to see your test fail before attempting to make it pass):
+
+
+```
+using System;
+using Xunit;
+using app;
+
+namespace tests {
+ public class UnitTest1 {
+ Authenticate auth = [new][5] Authenticate();
+
+ [Fact]
+ public void SuccessLogin(){
+ var given = "credentials";
+ var expected = "Successful login.";
+ var actual = auth.Login(given);
+ Assert.Equal(expected, actual);
+ }
+ }
+}
+```
+
+This test states that if someone supplies some credentials (i.e., a secret username and password) to the **Login** method of the **Authenticate** component when it processes the request, it is expected to return the message "Successful login."
+
+Of course, this is functionality that does not exist yet—the instantiated **Authenticate** module in the **SuccessLogin()** module hasn't been written yet. So you might as well go ahead and take the first stab at writing the desired functionality. Create a new file (**Authenticate.cs**) in the **app** folder and add the following code:
+
+
+```
+using System;
+
+namespace app {
+ public class Authenticate {
+ public string Login(string credentials) {
+ return "Not implemented";
+ }
+ }
+}
+```
+
+Now, navigate to the **tests** folder and run:
+
+
+```
+`dotnet test`
+```
+
+![Output of dotnet.test][6]
+
+The test fails because it was expecting a "Successful login" output but instead got the "Not implemented" output.
+
+### Increasing complexity for day two operations
+
+Now that you have created the "happy path" expectation and made it fail, it is time to work on implementing the functionality that will make the failing test pass. The following day, you attend the standup and report that you have started on the "Authenticate user" story. You let the team know that you have created the first failing test for the "happy path," and today, the plan is to implement the code to make the failing test pass.
+
+You explain your intention to first create a **User** table containing the **username**, **password**, and other pertinent attributes. But the scrum master interrupts and explains that the **User** module is being handled by another team. It would be bad practice to duplicate the maintenance of users, as the information will quickly get out of sync. So instead of building the **User** module (which would include the authentication logic), you are to leverage the authentication services that the **User** team is working on.
+
+That's great news because it saves you the trouble of having to write a lot of code to implement the **User** processing. Emboldened, you enthusiastically announce that you will quickly cobble up a function that will take user credentials and send them to the service that the **User** team has built.
+
+Alas, your intentions get squashed again as you learn that the **User** team hasn't started building the **User authentication** service yet. They're still in the process of assigning user stories to the backlog. Disheartened, you resign to the fact that it will be at least a few days (if not weeks?) before you can start working on the **User authentication** story.
+
+The scrum master then says that there is no reason to wait for the **User authentication** service to be built and deployed to testing. You could start developing the authentication functionality right away. But how can you do that?
+
+The scrum master offers a simple suggestion: leverage service virtualization. Since all specifications for the **User** module have been solidified and signed off, you have a solid, non-volatile contract to build your solution against. The contract published by the **User** services team states that in order to authenticate a user, specific expectations must be fulfilled:
+
+ 1. A client wishing to authenticate a user should send an **HTTP POST** request to the endpoint .
+ 2. The **HTTP POST** sent to the above endpoint must have a **JSON** payload that contains the user credentials (i.e., username and password).
+ 3. Upon receiving the request, the service will attempt to log the user in. If the username and password match the information on record, the service will return an **HTTP** response containing status code 200 with the body of the response containing the message "User successfully logged in."
+
+
+
+So, now that you know the contract details, you can start building the solution. Here's the code that connects to the endpoint, sends the **HTTP POST** request, and receives the **HTTP** response:
+
+
+```
+using System;
+using System.Net.Http;
+using System.Threading.Tasks;
+using System.Collections.Generic;
+
+namespace app {
+ public class Authenticate {
+ HttpClient client = [new][5] HttpClient();
+ string endPoint = "";
+
+ public string Login(string credentials) {
+ Task<string> response = CheckLogin(credentials);
+ return response.Result;
+ }
+
+ private async Task<string> CheckLogin(string credentials) {
+ var values = [new][5] Dictionary<string, string>{{"credentials", credentials}};
+ var content = [new][5] FormUrlEncodedContent(values);
+ var response = await client.PostAsync(endPoint, content);
+ return await response.Content.ReadAsStringAsync();
+ }
+ }
+}
+```
+
+This code won't work because does not exist (yet). Are you stuck now, waiting for the other team to eventually build and deploy that service?
+
+Not really. Service virtualization to rescue! Let's pretend that the service is already there and continue the development.
+
+### How to virtualize a service
+
+One way to virtualize the **User authentication** service would be to write a new app (the new API) and run it locally. This API will mirror the contract specified by the real **User authentication** API and will only return hard-coded stubbed data (it will be a fake service).
+
+Sounds like a good plan. Again, the team pushes back during the standup, questioning the need for writing, building, testing, and deploying a brand new app just to accomplish this fake functionality. It kind of wouldn't be worth the trouble because, by the time you deliver that new fake app, the other team would probably be ready with the real service.
+
+So you've reached an impasse. It looks like you are forced to wait on your dependency to materialize. You've failed to control your dependencies; you now have no recourse but to work in a sequential fashion.
+
+Not so fast! There is a great new tool called [mountebank][7] that is ideal for virtualizing any service. Using this tool, you can quickly stand up a local server that listens on a port you specify and takes orders. To make it simulate a service, you only have to tell it which port to listen to and which protocol to handle. The choice of protocols is:
+
+ * HTTP
+ * HTTPS
+ * SMTP
+ * TCP
+
+
+
+In this case, you need the HTTP protocol. First, install mountebank—if you have **npm** on your computer, you can simply type on the command line:
+
+
+```
+`npm install -g mountebank`
+```
+
+After it's installed, run mountebank by typing:
+
+
+```
+`mb`
+```
+
+At startup, mountebank will show:
+
+![mountebank startup][8]
+
+Now you're ready to virtualize an HTTP service. In this case, the **User authentication** service expects to receive an HTTP POST request; here is how the implemented code sends an HTTP POST request:
+
+
+```
+`var response = await client.PostAsync(endPoint, content);`
+```
+
+You now have to establish that **endPoint**. Ideally, all virtualized services should be propped in the **localhost** server to ensure quick execution of integration tests.
+
+To do that, you need to configure the **imposter**. In its bare-bones form, the **imposter** is a simple JSON collection of key-value pairs containing the definition of a port and a protocol:
+
+
+```
+{
+ "port": 3001,
+ "protocol": "http"
+}
+```
+
+This imposter is configured to handle the HTTP protocol and to listen to incoming requests on port 3001.
+
+Just listening to incoming HTTP requests on port 3001 is not going to do much. Once the request arrives at that port, mountebank needs to be told what to do with that request. In other words, you are virtualizing not only the availability of a service on a specific port but also the way that virtualized service is going to respond to the request.
+
+To accomplish that level of service virtualization, you need to tell mountebank how to configure stubs. Each stub consists of two components:
+
+ 1. A collection of predicates
+ 2. A collection of expected responses
+
+
+
+A predicate (sometimes called a matcher) narrows down the scope of the incoming request. For example, using the HTTP protocol, you can expect more than one type of method (e.g., GET, POST, PUT, DELETE, PATCH, etc.). In most service-virtualization scenarios, we are interested in simulating the behavior that is specific to a particular HTTP method. This scenario is about responding to the HTTP POST request, so you need to configure your stub to match on HTTP POST requests only:
+
+
+```
+{
+ "port": 3001,
+ "protocol": "http",
+ "stubs": [
+ {
+ "predicates": [
+ {
+ "equals": {
+ "method": "post"
+ }
+ }
+ ]
+ }
+ ]
+}
+```
+
+This imposter defines one predicate that matches (using the keyword **equals**) on the HTTP POST request only.
+
+Now take a closer look at the **endPoint** value, as defined in the implemented code:
+
+
+```
+`string endPoint = "http://localhost:3001/api/v1/users/login";`
+```
+
+In addition to listening to port 3001 (as defined in ), the **endPoint** is more specific, in that it expects the incoming HTTP POST request to go to the /api/v1/users/login path. How do you tell mountebank to only match exactly on the /api/v1/users/login path? By adding the path key-value pair to the stub's predicate:
+
+
+```
+{
+ "port": 3001,
+ "protocol": "http",
+ "stubs": [
+ {
+ "predicates": [
+ {
+ "equals": {
+ "method": "post",
+ "path": "/api/v1/users/login"
+ }
+ }
+ ]
+ }
+ ]
+}
+```
+
+This imposter now knows that HTTP requests arriving at port 3001 must be a POST method and must point at the /api/v1/users/login path. The only thing left to simulate is the expected HTTP response.
+
+Add the response to the JSON imposter:
+
+
+```
+{
+ "port": 3001,
+ "protocol": "http",
+ "stubs": [
+ {
+ "predicates": [
+ {
+ "equals": {
+ "method": "post",
+ "path": "/api/v1/users/login"
+ }
+ }
+ ],
+ "responses": [
+ {
+ "is": {
+ "statusCode": 200,
+ "body": "Successful login."
+ }
+ }
+ ]
+ }
+ ]
+}
+```
+
+With mountebank imposters, you define responses as a collection of JSON key-value pairs. In most cases, it is sufficient to simply state that a response is a **statusCode** and a **body**. This case is simulating the "happy path" response that has the status code **OK (200)** and the body containing a simple message **Successful login** (as specified in the acceptance criteria).
+
+### How to run virtualized services?
+
+OK, now that you have virtualized the **User authentication** service (at least its "happy path"), how do you run it?
+
+Remember that you have already started mountebank, and it reported that it is running in memory as the domain. Mountebank is listening on port 2525 and taking orders.
+
+Great, now you have to tell mountebank that you have the imposter ready. How do you do that? Send an HTTP POST request to . The requests body must contain the JSON you created above. There are a few techniques available to send that request. If you're versed in [curl][9], using it to send HTTP POST requests would be the simplest, quickest way to stand up the imposter. But many people prefer a more user-friendly way to send the HTTP POST to mountebank.
+
+The easy way to do that is to use [Postman][10]. If you download and install Postman, you can point it at , select the POST method from the pulldown menu, and copy and paste the imposter JSON into the raw body.
+
+When you click Send, the imposter will be created, and you should get Status 201 (Created).
+
+![Postman output][11]
+
+Your virtualized service is now running! You can verify it by navigating to the **tests** folder and running the **dotnet test** command:
+
+![dotnet test output][12]
+
+### Conclusion
+
+This demo shows how easy it is to remove blockages and control dependencies by simulating services you're dependent on. Mountebank is a fantastic tool that easily and cheaply simulates all kinds of very elaborate, sophisticated services.
+
+In this installment, I just had time to illustrate how to virtualize a simple "happy path" service. If you go back to the actual user story, you will notice that its acceptance criteria contain several "less happy" paths (cases when someone is repeatedly trying to log in using invalid credentials). It's a bit trickier to properly virtualize and test those use cases, so I've left that exercise for the next installment in this series.
+
+How will you use service virtualization to solve your testing needs? I would love to hear about it in the comments.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/service-virtualization-test-driven-development
+
+作者:[Alex Bunardzic][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/alex-bunardzic
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/laptop_screen_desk_work_chat_text.png?itok=UXqIDRDD (Person using a laptop)
+[2]: https://opensource.com/article/19/8/mutation-testing-evolution-tdd
+[3]: https://opensource.com/article/19/9/mutation-testing-example-tdd
+[4]: https://opensource.com/article/20/2/automate-unit-tests
+[5]: http://www.google.com/search?q=new+msdn.microsoft.com
+[6]: https://opensource.com/sites/default/files/uploads/dotnet-test.png (Output of dotnet.test)
+[7]: http://www.mbtest.org/
+[8]: https://opensource.com/sites/default/files/uploads/mountebank-startup.png (mountebank startup)
+[9]: https://curl.haxx.se/
+[10]: https://www.postman.com/
+[11]: https://opensource.com/sites/default/files/uploads/status-201.png (Postman output)
+[12]: https://opensource.com/sites/default/files/uploads/dotnet-test2.png (dotnet test output)
diff --git a/sources/tech/20200305 5 productivity apps for Linux.md b/sources/tech/20200305 5 productivity apps for Linux.md
new file mode 100644
index 0000000000..3e7423dc59
--- /dev/null
+++ b/sources/tech/20200305 5 productivity apps for Linux.md
@@ -0,0 +1,153 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (5 productivity apps for Linux)
+[#]: via: (https://opensource.com/article/20/3/productivity-apps-linux-elementary)
+[#]: author: (Scott Nesbitt https://opensource.com/users/scottnesbitt)
+
+5 productivity apps for Linux
+======
+Get organized and accomplish more with these five productivity apps for
+the Elementary Linux desktop.
+![Person drinking a hat drink at the computer][1]
+
+I've had a soft spot for [Elementary OS][2] since I first encountered it in 2013. A lot of that has to do with the distribution being very clean and simple.
+
+Since 2013, I've recommended Elementary to people who I've helped [transition to Linux][3] from other operating systems. Some have stuck with it. Some who moved on to other Linux distributions told me that Elementary helped smooth the transition and gave them more confidence using Linux.
+
+Like the distribution itself, many of the applications created specifically for Elementary OS are simple, clean, and useful. They can help boost your day-to-day productivity, too.
+
+### About "pay-what-you-want" apps
+
+Some apps in the Elementary AppCenter ask you to pay what you can. You're not obliged to pay to the full amount a developer asks for (or pay anything, for that matter). However, any money that changes hands goes to support the development of those apps.
+
+Three of the applications in this article—Quilter, Notes-up, and Envelope—are pay-what-you-want. If you find an app useful, I encourage you to send some money the developer's way.
+
+### Envelope
+
+Managing your budget should be simple. More than a few people, though, struggle with the task. That's where [Envelope][4] can help. While Envelope doesn't pack the features of something like [GnuCash][5], it's good enough for most of us.
+
+The app is built around the [envelope system][6] of personal and household budgeting. The first time you launch Envelope, you need to set up an account. You can do that manually, or you can import a [QIF][7] file containing financial information from another program.
+
+![Adding an account in Envelope][8]
+
+Either way, Envelope offers a set of categories (your envelopes). Add or delete categories as you see fit—for example, I don't own a car, so I deleted the Fuel category.
+
+From there, add transactions. Those can be your expenses or your income. Or both.
+
+![Entering a transaction in Envelope][9]
+
+Envelope gives you an overview of your spending and income. To get a more focused view of your budget, you can report on the current or previous month or a specific range of dates.
+
+### Notes-Up
+
+[Notes-Up][10]'s look and feel are reminiscent of note-taking tools like [Standard Notes][11], Simplenote, and the macOS Notes app. If you use any of them, switching to Notes-Up will be smooth and painless. Regardless, Notes-Up is easy to learn and use.
+
+![Notes-Up][12]
+
+Create a note and start typing. Notes-Up supports Markdown, making it easy to add formatting to your notes.
+
+![Taking notes in Notes-Up][13]
+
+If your Markdown is rusty, you can click the buttons on the toolbar to add formatting like lists; bold, italics, and strikethrough; code blocks; images; and more. You can also export your notes as PDF or Markdown files.
+
+Use Notes-Up for a while, and you'll wind up with a long list of notes. Organize them using _notebooks_. You can, for example, create personal, school, and work notebooks. On top of that, Notes-Up enables you to create sub-notebooks. Under my notebook for Opensource.com, for example, I have sub-notebooks for articles and the news roundups I curate.
+
+Notebooks not your thing? Then use tags to add keywords to your notes to make them easier to sort.
+
+### Yishu
+
+I do as much of my work as I can in [plain text][14]. That includes my task list. For that, I turn to a handy command-line application called [Todo.txt][15].
+
+If you aren't comfortable working at the command line, then [Yishu][16] is for you. It has Todo.txt's key features but graphically on the desktop.
+
+![Yishu][17]
+
+When you first fire up Yishu, it asks you to open an existing Todo.txt file. If you have one, open it. Otherwise, create a task. That also creates a new file for your tasks.
+
+![Adding a task in Yishu][18]
+
+Your options are limited: a description of the task and a priority. You can also add a due date in the format _YYYY-MM-DD_—for example, _2020-02-17_.
+
+When you click **OK**, Yishu saves the file Todo.txt to your **/home** folder. That might not be where you want to store your tasks. You can tell Yishu to use another folder in its preferences.
+
+### Reminduck
+
+Chances are, your notifications and reminders are jarring. A piercing buzz, an annoying beep, a text box that appears when you least expect it. Why not add a bit of [calm][19] and a bit of whimsy to your reminders—with a duck?
+
+That's the idea behind [Reminduck][20]. It's a simple and fun way to tell yourself it's time to do, well, anything.
+
+Fire up the app and create a reminder. You can add a description, date, and time for the reminder to appear, and you can set it to repeat. Reminders can repeat after a number of minutes that you set or at specific times every day, week, or month.
+
+![Reminduck][21]
+
+You can set up more than one reminder. Reminduck organizes your reminders, and you can edit or delete them.
+
+![Reminduck reminders][22]
+
+When the reminder is triggered, a little message pops out of the notification area on the desktop along with a soft alert and an icon of a smiling duck.
+
+![Reminduck notification][23]
+
+### Quilter
+
+It's easy enough to write with [Markdown][24] in a plain old text editor. Some folks, though, prefer to work with a dedicated Markdown editor. On the Elementary OS desktop, one option is [Quilter][25].
+
+![Quilter][26]
+
+Quilter is pretty basic. There's no toolbar to insert formatting; you have to add Markdown by hand. On the other hand, Quilter displays a running word count and an estimate of how long it will take to read what you're writing.
+
+![Quilter][27]
+
+The editor's options are few. There's a preview mode, and you can export your documents to PDF or HTML. The result of an export has the same look as a preview. That's not a bad thing.
+
+Quilter's other options include the ability to change the line spacing and margins, set the editor's font, as well as enable syntax highlighting and spell checking. It also has a mode that you can use to focus on a single line or a single paragraph while you're writing.
+
+### Final thoughts
+
+Sometimes, the best tools to boost your productivity are simple ones. Applications like the five above focus on doing one thing and doing it well.
+
+Envelope, Notes-Up, Yishu, Reminduck, and Quilter won't appeal to everyone. But if you use Elementary OS, give them a try. They can help you keep on track and do what you need to do.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/productivity-apps-linux-elementary
+
+作者:[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://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/coffee_tea_laptop_computer_work_desk.png?itok=D5yMx_Dr (Person drinking a hat drink at the computer)
+[2]: https://elementary.io
+[3]: https://opensource.com/article/18/12/help-non-techies
+[4]: https://nlaplante.github.io/envelope/
+[5]: https://opensource.com/article/20/2/gnucash
+[6]: https://en.wikipedia.org/wiki/Envelope_system
+[7]: https://en.wikipedia.org/wiki/Quicken_Interchange_Format
+[8]: https://opensource.com/sites/default/files/uploads/envelope-add-account.png (Adding an account in Envelope)
+[9]: https://opensource.com/sites/default/files/uploads/envelope-entering-transaction.png (Entering a transaction in Envelope)
+[10]: https://appcenter.elementary.io/com.github.philip-scott.notes-up/
+[11]: https://opensource.com/article/18/12/taking-notes-standard-notes
+[12]: https://opensource.com/sites/default/files/uploads/notes-up-main-window.png (Notes-Up)
+[13]: https://opensource.com/sites/default/files/uploads/notes-up-taking-note.png (Taking notes in Notes-Up)
+[14]: https://plaintextproject.online
+[15]: https://opensource.com/article/20/1/open-source-to-do-list
+[16]: https://appcenter.elementary.io/com.github.lainsce.yishu/
+[17]: https://opensource.com/sites/default/files/uploads/yishu-task-list.png (Yishu)
+[18]: https://opensource.com/sites/default/files/uploads/yishu-add-task.png (Adding a task in Yishu)
+[19]: https://weeklymusings.net/weekly-musings-025
+[20]: https://appcenter.elementary.io/com.github.matfantinel.reminduck/
+[21]: https://opensource.com/sites/default/files/uploads/reminduck.png (Reminduck)
+[22]: https://opensource.com/sites/default/files/uploads/remiunduck-reminders-list.png (Reminduck reminders)
+[23]: https://opensource.com/sites/default/files/uploads/reminduck-notification.png (Reminduck notification)
+[24]: https://opensource.com/article/19/8/markdown-beginners-cheat-sheet
+[25]: https://appcenter.elementary.io/com.github.lainsce.quilter/
+[26]: https://opensource.com/sites/default/files/uploads/quilter.png (Quilter)
+[27]: https://opensource.com/sites/default/files/uploads/quilter-editing.png (Quilter)
diff --git a/sources/tech/20200307 Compose music as code using Sonic Pi.md b/sources/tech/20200307 Compose music as code using Sonic Pi.md
new file mode 100644
index 0000000000..6944a5f6ea
--- /dev/null
+++ b/sources/tech/20200307 Compose music as code using Sonic Pi.md
@@ -0,0 +1,130 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Compose music as code using Sonic Pi)
+[#]: via: (https://opensource.com/article/20/3/sonic-pi)
+[#]: author: (Matt Bargenquast https://opensource.com/users/mbargenquast)
+
+Compose music as code using Sonic Pi
+======
+There's no need for instrumental mastery with this accessible open
+source program that can turn you into a musical virtuoso.
+![Bird singing and music notes][1]
+
+Maybe you're like me, and you learned a musical instrument when you were in school. For me, it was the piano, and later, the viola. However, I've always held that, as my childhood interests shifted towards computers and coding, I subsequently neglected my music practice. I do wonder what I would have done if I'd had something like Sonic Pi when I was younger. Sonic Pi is an open source program that lets you compose and perform music through code itself. It's the perfect marriage of those two worlds.
+
+Opensource.com is no stranger to Sonic Pi—we [featured an interview][2] with the creator, Dr. Sam Aaron, back in 2015. Since that time, a lot has changed, and Sonic Pi has grown substantially in many ways. It's reached a major new version milestone, with the long-awaited v3.2 release made publically available on February 28, 2020. A growing community of developers is actively contributing to its [GitHub project][3], while an equally thriving community of composers shares ideas and support in the [official forums][4]. The project is now also financially assisted through a [Patreon campaign][5], and Sam himself has been spreading the word of Sonic Pi through schools, conferences, and workshops worldwide.
+
+What really shines about Sonic Pi is its approachability. Releases are available for many major flavors of OS, including Windows, macOS, Linux, and of course, the Raspberry Pi itself. In fact, getting started with Sonic Pi on a Raspberry Pi couldn't be simpler; it comes pre-installed with [Raspbian][6], so if you have an existing Raspbian-based setup, you'll find it situated in the programming menu.
+
+Upon loading Sonic Pi for the first time, you'll be greeted with a simple interface with two main areas: an editor in which to write your code, and a section devoted to Sonic Pi's expansive tutorial. For newcomers, the tutorial is an essential resource for learning the basics, featuring accompanying music programs to reinforce each concept being taught.
+
+If you're following along, let's code ourselves a simple bit of music and explore the potential of live-coding music. Type or paste the following code into the Sonic Pi editor:
+
+
+```
+live_loop :beat do
+ sample :drum_heavy_kick
+ sleep 1
+end
+```
+
+Even if you're a Sonic Pi novice, many coders may immediately understand what's going on here. We're playing a drum kick sample, sleeping for a second, and then repeating. Click the Run button or press ALT+R (meta+R on macOS), and you should hear it begin to play.
+
+This isn't a very exciting song yet, so let's liven it up with a snare playing on the off-beat. Replace the existing code with the block below and Run again. You can leave the existing beat playing while you do this; you'll notice that your changes will be applied naturally, in time with the beat:
+
+
+```
+live_loop :beat do
+ sample :drum_heavy_kick
+ sleep 0.5
+ sample :drum_snare_soft
+ sleep 0.5
+end
+```
+
+While we're at it, let's add a hi-hat right before every fourth beat, just to make things a little interesting. Add this new block below our existing one and Run again:
+
+
+```
+live_loop :hihat do
+ sleep 3.9
+ sample :drum_cymbal_closed
+ sleep 0.1
+end
+```
+
+We've got our beat going now, so let's add a bassline! Sonic Pi comes with a variety of synths built-in, along with effects filters such as reverb and distortion. We'll use a combination of the "dsaw" and "tech_saw" synths to give it an electronic retro-synth feel. Add the block below to your existing program, Run, and have a listen:
+
+
+```
+live_loop :bass do
+ use_synth :dsaw
+ play :a2, attack: 1, release: 2, amp: 0.3
+ sleep 2.5
+ use_synth :tech_saws
+ play :a1, attack: 1, release: 1.5, amp: 0.8
+ sleep 1.5
+end
+```
+
+You'll note above that we have full control over the [ADSR][7] envelope when playing notes, so we can decide when each sound should peak and fade.
+
+Lastly, let's add a lead synth and try out one of those effects features known as the "slicer." To spice things up, we'll also introduce an element of pseudo-randomness by letting Sonic Pi pick from a series of potential chords. This is where some of the fun improvisation and "happy accidents" can begin to occur. Add the block below to your existing program and Run:
+
+
+```
+live_loop :lead do
+ with_fx :slicer do
+ chords = [(chord :A4, :minor7), (chord :A4, :minor), (chord :D4, :minor7), (chord :F4, :major7)]
+ use_synth :blade
+ play chords.choose, attack: 1, release: 2, amp: 1
+ sleep 2
+ end
+end
+```
+
+Great! Now, we're certainly not going to be competing with Daft Punk any time soon, but hopefully, through this process, you've seen how we can go from a bare beat to something much bigger, in real-time, by adding some simple morsels of code. It is well worth watching one of Sam Aaron's [live coding performances][8] on YouTube for a demonstration of how creative and adaptive Sonic Pi can let you be.
+
+![Sonic Pi composition example][9]
+
+Our finished piece, in full
+
+If you've ever wanted to learn a musical instrument, but felt held back by thoughts like "I don't have rhythm" or "my hands aren't nimble enough," Sonic Pi is a versatile instrument for which none of those things matter. All you need are the ideas, the inspiration, and an inexpensive computer such as the humble Raspberry Pi. The rest is at your fingertips—literally!
+
+Here are a few handy links to get you started:
+
+ * The Official Sonic Pi [website][10] and [tutorial][11]
+ * [Getting Started with Sonic Pi][12] ([projects.raspberrypi.org][13])
+ * Sonic Pi [Github project][3]
+
+
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/sonic-pi
+
+作者:[Matt Bargenquast][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/mbargenquast
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/music-birds-recording-520.png?itok=UoM7brl0 (Bird singing and music notes)
+[2]: https://opensource.com/life/15/10/interview-sam-aaron-sonic-pi
+[3]: https://github.com/samaaron/sonic-pi/
+[4]: https://in-thread.sonic-pi.net/
+[5]: https://www.patreon.com/samaaron
+[6]: https://www.raspberrypi.org/downloads/raspbian/
+[7]: https://en.wikipedia.org/wiki/Envelope_(music)
+[8]: https://www.youtube.com/watch?v=JEHpS1aTKp0
+[9]: https://opensource.com/sites/default/files/uploads/sonicpi.png (Sonic Pi composition example)
+[10]: https://sonic-pi.net/
+[11]: https://sonic-pi.net/tutorial.html
+[12]: https://projects.raspberrypi.org/en/projects/getting-started-with-sonic-pi
+[13]: http://projects.raspberrypi.org
diff --git a/sources/tech/20200309 Fish - A Friendly Interactive Shell.md b/sources/tech/20200309 Fish - A Friendly Interactive Shell.md
new file mode 100644
index 0000000000..9e892e04ff
--- /dev/null
+++ b/sources/tech/20200309 Fish - A Friendly Interactive Shell.md
@@ -0,0 +1,194 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Fish – A Friendly Interactive Shell)
+[#]: via: (https://fedoramagazine.org/fish-a-friendly-interactive-shell/)
+[#]: author: (Michal Konečný https://fedoramagazine.org/author/zlopez/)
+
+Fish – A Friendly Interactive Shell
+======
+
+![Fish — A Friendly Interactive Shell][1]
+
+Are you looking for an alternative to bash? Are you looking for something more user-friendly? Then look no further because you just found the golden fish!
+
+Fish (friendly interactive shell) is a smart and user-friendly command line shell that works on Linux, MacOS, and other operating systems. Use it for everyday work in your terminal and for scripting. Scripts written in fish are less cryptic than their equivalent bash versions.
+
+### Fish’s user-friendly features
+
+ * **Suggestions**
+Fish will suggest commands that you have written before. This boosts productivity when typing same commands often.
+ * **Sane scripting**
+Fish avoids using cryptic characters. This provides a clearer and friendlier syntax.
+ * **Completion based on man pages**
+Fish will autocomplete parameters based on the the command’s man page.
+ * **Syntax highlighting**
+Fish will highlight command syntax to make it visually friendly.
+
+
+
+### Installation
+
+#### Fedora Workstation
+
+Use the _dnf_ command to install fish:
+
+```
+$ sudo dnf install fish
+```
+
+Make fish your default shell by installing the _util-linux-user_ package and then running the _chsh_ (change shell) command with the appropriate parameters:
+
+```
+$ sudo dnf install util-linux-user
+$ chsh -s /usr/bin/fish
+```
+
+You will need to log out and back in for this change to take effect.
+
+#### Fedora Silverblue
+
+Because this is not GUI application, you will need to layer it using _rpm-ostree_. Use the following command to install fish on Fedora Silverblue:
+
+```
+$ rpm-ostree install fish
+```
+
+On Fedora Silverblue you will need to reboot your PC to switch to the new ostree image.
+
+If you want to make fish your main shell on Fedora Silverblue, the easiest way is to update the _/etc/passwd_ file. Find your user and change _/bin/bash_ to _/usr/bin/fish_.
+
+You will need [root privileges][2] to edit the _/etc/passwd_ file. Also you will need to log out and back in for this change to take effect.
+
+### Configuration
+
+The per-user configuration file for fish is _~/.config/fish/config.fish_. To make configuration changes for all users, edit _/etc/fish/config.fish_ instead.
+
+The per-user configuration file must be created manually. The installation scripts will not create _~/.config/fish/config.fish_.
+
+Here are a couple configuration examples shown alongside their bash equivalents to get you started:
+
+#### Creating aliases
+
+ * _~/.bashrc_: alias ll='ls -lh'
+ * _~/.config/fish/config.fish_: alias ll='ls -lh'
+
+
+
+#### Setting environment variables
+
+ * _~/.bashrc_: export PATH=$PATH:~/bin
+ * _~/.config/fish/config.fish_: set -gx PATH $PATH ~/bin
+
+
+
+### Working with fish
+
+When fish is configured as your default shell, the command prompt will look similar to what is shown in the below image. If you haven’t configured fish to be your default shell, just run the _fish_ command to start it in your current terminal session.
+
+![][3]
+
+As you start typing commands, you will notice the syntax highlighting:
+
+![][4]
+
+Cool, isn’t it? 🙂
+
+You will also see commands being suggested as you type. For example, start typing the previous command a second time:
+
+![][5]
+
+Notice the gray text that appears as you type. The gray text is fish suggesting the command you wrote before. To autocomplete it, just press **CTRL+F**.
+
+Get argument suggestions based on the preceding command’s man page by typing a dash (**–**) and then the **TAB** key:
+
+![][6]
+
+If you press **TAB** once, it will show you the first few suggestions (or every suggestion, if there are only a few arguments available). If you press **TAB** a second time, it will show you all suggestions. If you press **TAB** three times consecutively, it will switch to interactive mode and you can select an argument using the arrow keys.
+
+Otherwise, fish works similar to most other shells. The remaining differences are well documented. So it shouldn’t be difficult to find other features that you may be interested in.
+
+### Make fish even more powerful
+
+Make the fish even more powerful with [powerline][7]. Powerline adds command execution time, colored git status, current git branch and much more to fish’s interface.
+
+Before installing powerline for fish, you must install [Oh My Fish][8]. Oh My Fish extends fish’s core infrastructure to enable the installation of additional plugins. The easiest way to install Oh My Fish is to use the _curl_ command:
+
+```
+> curl -L https://get.oh-my.fish | fish
+```
+
+If you don’t want to pipe the installation commands directly to _curl_, see the installation section of Oh My Fish’s [README][9] for alternative installation methods.
+
+Fish’s powerline plugin is [bobthefish][7]. Bobthefish requires the _powerline-fonts_ package.
+
+**On Fedora Workstation**:
+
+```
+> sudo dnf install powerline-fonts
+```
+
+**On Fedora Silverblue**:
+
+```
+> rpm-ostree install powerline-fonts
+```
+
+On Fedora Silverblue you will have to reboot to complete the installation of the fonts.
+
+After you have installed the _powerline-fonts_ package, install _bobthefish_:
+
+```
+> omf install bobthefish
+```
+
+Now you can experience the full awesomeness of fish with powerline:
+
+![][10]
+
+### Additional resources
+
+Check out these web pages to learn even more about fish:
+
+ * [Official page][11]
+ * [Documentation][12]
+ * [Tutorial][13]
+ * [FAQ][14]
+ * [Web playground][15]
+ * [Mailing lists][16]
+ * [GitHub][17]
+
+
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/fish-a-friendly-interactive-shell/
+
+作者:[Michal Konečný][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/zlopez/
+[b]: https://github.com/lujun9972
+[1]: https://fedoramagazine.org/wp-content/uploads/2020/03/fish-816x345.jpg
+[2]: https://fedoramagazine.org/howto-use-sudo/
+[3]: https://fedoramagazine.org/wp-content/uploads/2020/03/Screenshot-from-2020-03-03-14-00-35.png
+[4]: https://fedoramagazine.org/wp-content/uploads/2020/03/Screenshot-from-2020-03-03-14-19-24.png
+[5]: https://fedoramagazine.org/wp-content/uploads/2020/03/Screenshot-from-2020-03-03-14-25-31.png
+[6]: https://fedoramagazine.org/wp-content/uploads/2020/03/Screenshot-from-2020-03-03-14-58-07.png
+[7]: https://github.com/oh-my-fish/theme-bobthefish
+[8]: https://github.com/oh-my-fish/oh-my-fish
+[9]: https://github.com/oh-my-fish/oh-my-fish/blob/master/README.md#installation
+[10]: https://fedoramagazine.org/wp-content/uploads/2020/03/Screenshot-from-2020-03-03-15-38-07.png
+[11]: https://fishshell.com/
+[12]: https://fishshell.com/docs/current/index.html
+[13]: https://fishshell.com/docs/current/tutorial.html
+[14]: https://fishshell.com/docs/current/faq.html
+[15]: https://rootnroll.com/d/fish-shell/
+[16]: https://sourceforge.net/projects/fish/lists/fish-users
+[17]: https://github.com/fish-shell/fish-shell/
diff --git a/sources/tech/20200309 Level up your use of Helm on Kubernetes with Charts.md b/sources/tech/20200309 Level up your use of Helm on Kubernetes with Charts.md
new file mode 100644
index 0000000000..9a08bdb973
--- /dev/null
+++ b/sources/tech/20200309 Level up your use of Helm on Kubernetes with Charts.md
@@ -0,0 +1,288 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Level up your use of Helm on Kubernetes with Charts)
+[#]: via: (https://opensource.com/article/20/3/helm-kubernetes-charts)
+[#]: author: (Jessica Cherry https://opensource.com/users/jrepka)
+
+Level up your use of Helm on Kubernetes with Charts
+======
+Configuring known apps using the Helm package manager.
+![Ships at sea on the web][1]
+
+Applications are complex collections of code and configuration that have a lot of nuance to how they are installed. Like all open source software, they can be installed from source code, but most of the time users want to install something simply and consistently. That’s why package managers exist in nearly every operating system, which manages the installation process.
+
+Similarly, Kubernetes depends on package management to simplify the installation process. In this article, we’ll be using the Helm package manager and its concept of stable charts to create a small application.
+
+### What is Helm package manager?
+
+[Helm][2] is a package manager for applications to be deployed to and run on Kubernetes. It is maintained by the [Cloud Native Computing Foundation][3] (CNCF) with collaboration with the largest companies using Kubernetes. Helm can be used as a command-line utility, which [I cover how to use here][4].
+
+#### Installing Helm
+
+Installing Helm is quick and easy for Linux and macOS. There are two ways to do this, you can go to the release [page][5], download your preferred version, untar the file, and move the Helm executable to your** /usr/local/bin** or your **/usr/bin** whichever you are using.
+
+Alternatively, you can use your operating system package manage (**dnf**, **snap**, **brew**, or otherwise) to install it. There are instructions on how to install on each OS on this [GitHub page][6].
+
+### What are Helm Charts?
+
+We want to be able to repeatably install applications, but also to customize them to our environment. That’s where Helm Charts comes into play. Helm coordinates the deployment of applications using standardized templates called Charts. Charts are used to define, install, and upgrade your applications at any level of complexity.
+
+> A _Chart_ is a Helm package. It contains all of the resource definitions necessary to run an application, tool, or service inside of a Kubernetes cluster. Think of it like the Kubernetes equivalent of a Homebrew formula, an Apt dpkg, or a Yum RPM file.
+>
+> [Using Helm][7]
+
+Charts are quick to create, and I find them straightforward to maintain. If you have one that is accessible from a public version control site, you can publish it to the [stable repository][8] to give it greater visibility. In order for a Chart to be added to stable, it must meet a number of [technical requirements][9]. In the end, if it is considered properly maintained by the Helm maintain, it can then be published to [Helm Hub][10].
+
+Since we want to use the community-curated stable charts, we will make that easier by adding a shortcut:
+
+
+```
+$ helm repo add stable
+"stable" has been added to your repositories
+```
+
+### Running our first Helm Chart
+
+Since I’ve already covered the basic Helm usage in [this article][11], I’ll focus on how to edit and use charts in this article. To follow along, you’ll need Helm installed and access to some Kubernetes environment, like minikube (which you can walk through [here][12] or [here][13]).
+
+Starting I will be picking one chart. Usually, in my article I use Jenkins as my example, and I would gladly do this if the chart wasn’t really complex. This time I’ll be using a basic chart and will be creating a small wiki, using [mediawiki and its chart][14].
+
+So how do I get this chart? Helm makes that as easy as a pull.
+
+By default, charts are compressed in a .tgz file, but we can unpack that file to customize our wiki by using the **\--untar** flag.
+
+
+```
+$ helm pull stable/mediawiki --untar
+$ ls
+mediawiki/
+$ cd mediawiki/
+$ ls
+Chart.yaml README.md requirements.lock templates/
+OWNERS charts/ requirements.yaml values.yaml
+```
+
+Now that we have this we can begin customizing the chart.
+
+### Editing your Helm Chart
+
+When the file was untared there was a massive amount of files that came out. While it does look frightening, there really is only one file we should be working with and that's the **values.yaml** file.
+
+Everything that was unpacked was a list of template files that has all the information for the basic application configurations. All the template files actually depend on what is configured in the values.yaml file. Most of these templates and chart files actually are for creating service accounts in the cluster and the various sets of required application configurations that would usually be put together if you were to build this application on a regular server.
+
+But on to the values.yaml file and what we should be changing in it. Open it in your favorite text editor or IDE. We see a [YAML][15] file with a ton of configuration. If we zoom in just on the container image file, we see its repository, registry, and tags amongst other details.
+
+
+```
+## Bitnami DokuWiki image version
+## ref:
+##
+image:
+ registry: docker.io
+ repository: bitnami/mediawiki
+ tag: 1.34.0-debian-10-r31
+ ## Specify a imagePullPolicy
+ ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'
+ ## ref:
+ ##
+ pullPolicy: IfNotPresent
+ ## Optionally specify an array of imagePullSecrets.
+ ## Secrets must be manually created in the namespace.
+ ## ref:
+ ##
+ # pullSecrets:
+ # - myRegistryKeySecretName
+```
+
+As you can see in the file each configuration for the values is well-defined. Our pull policy is set to **IfNotPresent**. This means if I run a **helm pull** command, it will not overwrite my existing version. If it’s set to always, the image will default to the latest version of the image on every pull. I’ll be using the default in this case, as in the past I have run into images being broken if it goes to the latest version without me expecting it (remember to version control your software, folks).
+
+### Customizing our Helm Chart
+
+So let’s configure this values file with some basic changes and make it our own. I’ll be changing some naming conventions, the wiki username, and the mediawiki site name. _Note: This is another snippet from values.yaml. All of this customization happens in that one file._
+
+
+```
+## User of the application
+## ref:
+##
+mediawikiUser: cherrybomb
+
+## Application password
+## Defaults to a random 10-character alphanumeric string if not set
+## ref:
+##
+# mediawikiPassword:
+
+## Admin email
+## ref:
+##
+mediawikiEmail: [root@example.com][16]
+
+## Name for the wiki
+## ref:
+##
+mediawikiName: Jess's Home of Helm
+```
+
+After this, I’ll make some small modifications to our database name and user account. I changed the defaults to "jess" so you can see where changes were made.
+
+
+```
+externalDatabase:
+ ## Database host
+ host:
+
+ ## Database port
+ port: 3306
+
+ ## Database user
+ user: jess_mediawiki
+
+ ## Database password
+ password:
+
+ ## Database name
+ database: jess_mediawiki
+
+##
+## MariaDB chart configuration
+##
+##
+##
+mariadb:
+ ## Whether to deploy a mariadb server to satisfy the applications database requirements. To use an external database set this to false and configure the externalDatabase parameters
+ enabled: true
+ ## Disable MariaDB replication
+ replication:
+ enabled: false
+
+ ## Create a database and a database user
+ ## ref:
+ ##
+ db:
+ name: jess_mediawiki
+ user: jess_mediawiki
+```
+
+And finally, I’ll be adding some ports in our load balancer to allow traffic from the local host. I'm running on minikube and find the **LoadBalancer** option works well.
+
+
+```
+service:
+ ## Kubernetes svc type
+ ## For minikube, set this to NodePort, elsewhere use LoadBalancer
+ ##
+ type: LoadBalancer
+ ## Use serviceLoadBalancerIP to request a specific static IP,
+ ## otherwise leave blank
+ ##
+ # loadBalancerIP:
+ # HTTP Port
+ port: 80
+ # HTTPS Port
+ ## Set this to any value (recommended: 443) to enable the https service port
+ # httpsPort: 443
+ ## Use nodePorts to requets some specific ports when usin NodePort
+ ## nodePorts:
+ ## http: <to set explicitly, choose port between 30000-32767>
+ ## https: <to set explicitly, choose port between 30000-32767>
+ ##
+ # nodePorts:
+ # http: "30000"
+ # https: "30001"
+ ## Enable client source IP preservation
+ ## ref
+ ##
+ externalTrafficPolicy: Cluster
+```
+
+Now that we have made the configurations to allow traffic and create the database, we know that we can go ahead and deploy our chart.
+
+### Deploy and enjoy!
+
+Now that we have our custom version of the wiki, it's time to create a deployment. Before we get into that, let’s first confirm that nothing else is installed with Helm, to make sure my cluster has available resources to run our wiki.
+
+
+```
+$ helm ls
+NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
+```
+
+There are no other deployments through Helm right now, so let's proceed with ours.
+
+
+```
+$ helm install jesswiki -f values.yaml stable/mediawiki
+NAME: jesswiki
+LAST DEPLOYED: Thu Mar 5 12:35:31 2020
+NAMESPACE: default
+STATUS: deployed
+REVISION: 2
+NOTES:
+1\. Get the MediaWiki URL by running:
+
+ NOTE: It may take a few minutes for the LoadBalancer IP to be available.
+ Watch the status with: 'kubectl get svc --namespace default -w jesswiki-mediawiki'
+
+ export SERVICE_IP=$(kubectl get svc --namespace default jesswiki-mediawiki --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}")
+ echo "Mediawiki URL: http://$SERVICE_IP/"
+
+2\. Get your MediaWiki login credentials by running:
+
+ echo Username: user
+ echo Password: $(kubectl get secret --namespace default jesswiki-mediawiki -o jsonpath="{.data.mediawiki-password}" | base64 --decode)
+$
+```
+
+Perfect! Now we will navigate to the wiki, which is accessible at the cluster IP address. To confirm that address:
+
+
+```
+kubectl get svc --namespace default -w jesswiki-mediawiki
+NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
+jesswiki-mediawiki LoadBalancer 10.103.180.70 <pending> 80:30220/TCP 17s
+```
+
+Now that we have the IP, we go ahead and check to see if it’s up:
+
+![A working wiki installed through helm charts][17]
+
+Now we have our new wiki up and running, and we can enjoy our new application with our personal edits. Use the command from the output above to get the password and start to fill in your wiki.
+
+### Conclusion
+
+Helm is a powerful package manager that makes installing and uninstalling applications on top of Kubernetes as simple as a single command. Charts add to the experience by giving us curated and tested templates to install applications with our unique customizations. Keep exploring what Helm and Charts have to offer and let me know what you do with them in the comments.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/helm-kubernetes-charts
+
+作者:[Jessica Cherry][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/jrepka
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/kubernetes_containers_ship_lead.png?itok=9EUnSwci (Ships at sea on the web)
+[2]: https://www.google.com/url?q=https://helm.sh/&sa=D&ust=1583425787800000
+[3]: https://www.google.com/url?q=https://www.cncf.io/&sa=D&ust=1583425787800000
+[4]: https://www.google.com/url?q=https://opensource.com/article/20/2/kubectl-helm-commands&sa=D&ust=1583425787801000
+[5]: https://www.google.com/url?q=https://github.com/helm/helm/releases/tag/v3.1.1&sa=D&ust=1583425787801000
+[6]: https://www.google.com/url?q=https://github.com/helm/helm&sa=D&ust=1583425787802000
+[7]: https://helm.sh/docs/intro/using_helm/
+[8]: https://www.google.com/url?q=https://github.com/helm/charts&sa=D&ust=1583425787803000
+[9]: https://github.com/helm/charts/blob/master/CONTRIBUTING.md#technical-requirements
+[10]: https://www.google.com/url?q=https://hub.helm.sh/&sa=D&ust=1583425787803000
+[11]: https://www.google.com/url?q=https://opensource.com/article/20/2/kubectl-helm-commands&sa=D&ust=1583425787803000
+[12]: https://www.google.com/url?q=https://opensource.com/article/18/10/getting-started-minikube&sa=D&ust=1583425787804000
+[13]: https://www.google.com/url?q=https://opensource.com/article/19/7/security-scanning-your-devops-pipeline&sa=D&ust=1583425787804000
+[14]: https://www.google.com/url?q=https://github.com/helm/charts/tree/master/stable/mediawiki&sa=D&ust=1583425787805000
+[15]: https://en.wikipedia.org/wiki/YAML
+[16]: mailto:root@example.com
+[17]: https://opensource.com/sites/default/files/uploads/lookitworked.png (A working wiki installed through helm charts)
diff --git a/sources/tech/20200310 Getting started with Emacs.md b/sources/tech/20200310 Getting started with Emacs.md
new file mode 100644
index 0000000000..bb5ceffb86
--- /dev/null
+++ b/sources/tech/20200310 Getting started with Emacs.md
@@ -0,0 +1,181 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Getting started with Emacs)
+[#]: via: (https://opensource.com/article/20/3/getting-started-emacs)
+[#]: author: (Seth Kenlon https://opensource.com/users/seth)
+
+Getting started with Emacs
+======
+10 tips for diving into the world of this useful group of open source
+text editors.
+![Computer keyboard typing][1]
+
+Many people say they want to learn [Emacs][2], but many of them shy away after the briefest encounter. It's not because Emacs is bad or even that complex. The problem, I believe, is that people don't actually want to learn Emacs; they want to be comfortable with Emacs traditions. They want to understand the arcane keyboard shortcuts and unfamiliar terminology. They want to use Emacs as they believe it's "meant to be used."
+
+I sympathize with this because that's how I felt about Emacs. I thought that all true Emacs users only ran it inside a terminal, and never used arrow keys or menus, much less a mouse. That's a great way to discourage yourself from getting started with Emacs. There are enough unique .emacs config files out there to prove that if there's one common strain among Emacs users, it's that everyone uses Emacs differently.
+
+Learning Emacs is easy. It's loving Emacs that's hard. To love Emacs, you have to discover the features it has that you've been looking for, sometimes without knowing you've been missing them. And that takes experience.
+
+The only way to get that experience is to start at the beginning—by actively using Emacs. Here are ten tips to help you figure out what works best for you.
+
+### Start with the GUI
+
+One of the greatest things about Emacs (and its friendly competitor, [Vim][3], too) is that it can be run in a terminal, which is useful when you SSH into a server, but not very significant on computers built within the last 15 years or so. The GUI version of Emacs can be run on extremely [low-powered devices][4], and it has lots of pragmatic features that both novice and experienced users can appreciate.
+
+For example, if you don't know how to copy a word with just keyboard shortcuts in Emacs, the Edit menu's Copy, Cut, and Paste selections provide the path of least resistance. There's no reason to punish yourself for choosing Emacs. Use its menus, use your mouse to select regions and click in-buffer buttons, and don't let unfamiliarity stand in your way of being productive.
+
+![Emacs slackware][5]
+
+These features are built into Emacs because users use them. You should use them when you need them and work your way up to the obscure commands you think you might need when you eventually use Emacs over SSH on a VT100 terminal with no Alt or arrow keys.
+
+### Get used to the terminology
+
+Emacs has special terms for its UI elements. The evolution of personal computing didn't build upon the same terms, so many are relatively foreign to the modern computer user, and others are the same but have different meanings. Here are some of the most common terms:
+
+ * Frame: In Emacs, the frame is what modern computing calls a "window."
+ * Buffer: A buffer is a communication channel for Emacs. It may serve as a command-line for an Emacs process, or a shell, or just the contents of a file.
+ * Window: A window is your view into a buffer.
+ * Mini-buffer: The primary command-line, located at the bottom of the Emacs window.
+
+
+
+![Emacs tutorial map][6]
+
+### Making sense of Emacs modifier keys
+
+On a PC keyboard, the Ctrl key is referred to as C, and the Alt key is referred to as M. These aren't the C and M keys, and because they're always paired with an accompanying letter or symbol key, they're easy to recognize in the documentation.
+
+For example, C-x means Ctrl+X in modern keyboard notation, and M-x is Alt+X. You press the keys together just as you do when you're cutting text from any application.
+
+There's another level of keyboard shortcuts, though, quite unlike anything on modern computers. Sometimes, a keyboard shortcut isn't just one key combo and instead consists of a series of key presses.
+
+For instance, C-x C-f means to press Ctrl+X as usual, and then Ctrl+C as usual.
+
+Sometimes, a keyboard shortcut has a mixture of key types. The combo C-x 3 means to press Ctrl+X as usual, and then the number 3 key.
+
+The way Emacs can do these fancy power combos is because certain keys put Emacs into a special command mode. If you press C-X (that's Ctrl+X), you're telling Emacs to enter an idle state, waiting for a second key or keyboard shortcut.
+
+Emacs documentation, both official and unofficial, is full of keyboard shortcuts. Practice mentally translating C to Ctrl and M to Alt, and all those docs will make a lot more sense to you.
+
+### Alternate shortcuts for cut, copy, and paste
+
+Canonically, copying text is performed with a series of keyboard shortcuts that depend on how you want to copy or cut.
+
+For instance, you can cut a whole word with M-d (Emacs lingo for Alt+d), or a whole line with C-k (Ctrl+K), or a highlighted region with M-m (Alt+M). You can get used to that if you want, but if you like Ctrl+C and Ctrl+X and Ctrl-V, then you can use those instead.
+
+Enabling modern cut-copy-paste requires activating a feature called CUA (Common User Access). To activate CUA, click on the Options menu and select Use CUA Keys. With this enabled, C-c copies highlighted text, C-x cuts highlighted text, and C-v pastes text. This mode is only actually active when you've selected text, so you can still learn the usual C-x and C-c bindings that Emacs normally uses.
+
+### It's OK to share
+
+Emacs is an application and has no awareness of your feelings or loyalty towards it. If you want to use Emacs only for tasks that "feel" right for Emacs, and different editor (like Vim) for other tasks, you can do that.
+
+Your interactions with an application influence how you work, so if the pattern of keypresses required in Emacs doesn't agree with a specific task, then don't force yourself to use Emacs for that task. Emacs is just one of many open source tools available to you, and there's no reason to limit yourself to just one tool.
+
+### Explore new functions
+
+Most of what Emacs does is an elisp function that can be invoked from a menu selection, keyboard shortcut, or in some cases, a specific event. All functions can be executed from the mini-buffer (the command-line at the bottom of the Emacs frame). You could, in theory, even navigate your cursor by typing in functions like **forward-word** and **backward-word** and **next-line** and **previous-line**, and so on. It would be unbearably inefficient, but that's the kind of direct access to the code you're running. In a way, Emacs is its own API.
+
+You can find out about new functions by reading about Emacs on community blogs, or you can take a more direct approach and use the describe-function function. To get help on any function, press M-x (that's Alt+X) and then type describe-function, and then press Return or Enter. You are prompted for a function name, and then shown a description of that function.
+
+You can get a list of all available functions by typing M-x (Alt+X), followed by ?.
+
+You can also get pop-up descriptions of functions as you type them by pressing M-x and then typing **auto-complete-mode**, and then pressing Return or Enter. With this mode active, as you type any Emacs function into your document, you're offered auto-completion options, along with a description of the function.
+
+![Emacs function][7]
+
+When you find a useful function and use it, Emacs tells you the keyboard binding for it, if one is set. If one doesn't exist, you can assign one yourself by opening your $HOME/.emacs configuration file and entering a keyboard shortcut assignment. The syntax is global-set-key, followed by the keyboard shortcut you want to use, followed by the function you want to invoke.
+
+For example, to assign the screenwriter-slugline function to a keyboard binding:
+
+
+```
+`(global-set-key (kbd “C-c s”) 'screenwriter-slugline)`
+```
+
+Reload your configuration file, and the keyboard shortcut is available to you:
+
+
+```
+`M-x load-file ~/.emacs`
+```
+
+### Panic button
+
+As you use Emacs and try new functions, you're bound to start invoking something you didn't mean to invoke. The universal panic button in Emacs is C-g (that's Ctrl+G).
+I remember this by associating G with GNU, and I imagine I'm calling upon GNU to rescue me from a poor decision, but feel free to make up your own mnemonic.
+
+If you press C-g a few times, the Emacs mini-buffer returns to a latent state, pop-up windows are hidden, and you're back to the safety of a plain old boring text editor.
+
+### Ignore the keyboard shortcuts
+
+There are too many potential keyboard shortcuts to summarize them all here, much less for you ever to hope to memorize. That's by design. Emacs is meant to be customized, and when people write plugins for Emacs, they get to define their own special keyboard shortcuts.
+
+The idea isn't to memorize all shortcuts right away. Your goal, instead, is to get comfortable using Emacs. The more comfortable you become in Emacs, the more you'll get tired of resorting to the menu bar all the time, and you'll start to memorize the combos important to you.
+
+Everyone has their own favorite shortcuts based on what they typically do in Emacs. Someone who spends all day writing code in Emacs may know all the keyboard shortcuts for running a debugger or for launching language-specific modes, but know nothing about Org-mode or Artist-mode. It's natural, and it's fine.
+
+### Practice Emacs when you use Bash
+
+One advantage to knowing Emacs keyboard shortcuts is that many of them also apply in Bash:
+
+ * C-a—go to the beginning of a line
+ * C-e—go to the end of a line
+ * C-k—cut the whole line
+ * M-f—go forward a word
+ * M-b—go back a word
+ * M-d—cut a word
+ * C-y—yank back (paste) the most recently cut content
+ * M-Shift-U—capitalize a word
+ * C-t—swap two characters (for example, sl becomes ls)
+
+
+
+There are many more examples, and it an make your interactions with your Bash terminal faster than you ever imagined.
+
+### Packages
+
+Emacs has a built-in package manager to help you discover new plugins. Its package manager contains modes to help you edit specific types of text (for instance, if you edit JSON files frequently, you might try ejson-mode), embedded applications, themes, spellchecking options, linters, and more. This is where Emacs has the potential to become crucial to your daily computing; once you find a great Emacs package, you may not be able to live without it.
+
+![Emacs emoji][8]
+
+You can browse packages by pressing M-x (that's Alt+X) and then typing **package-list-packages** command and then pressing Return or Enter. The package manager updates its cache each time you launch it, so be patient the first time you use it while it downloads a list of available packages. Once loaded, you can navigate with your keyboard or mouse (remember, Emacs is a GUI application). Each package name is a button, so either move your cursor over it and press Return or just click it with your mouse. You can read about the package in the new window that appears in your Emacs frame, and then install it with the Install button.
+
+Some packages need special configuration, which is sometimes listed in its description, but other times require you to visit the package's home page to read more about it. For example, the auto-complete package ac-emoji installs easily but requires you to have a symbol font defined. It works either way, but you only see the corresponding emoji if you have the font installed, and you might not know that unless you visit its homepage.
+
+### Tetris
+
+Emacs has games, believe it or not. There's Sudoku, quizzes, minesweeper, a just-for-fun psychotherapist, and even Tetris. These aren't particularly useful, but interacting with Emacs on any level is great practice, and games are a great way to maximize your time spent in Emacs.
+
+![Emacs tetris][9]
+
+Tetris is also how I was introduced to Emacs in the first place, so of all versions of the game, it's the Emacs version that's truly my favorite.
+
+### Using Emacs
+
+GNU Emacs is popular because it's impossibly flexible and highly extensible. People get so accustomed to Emacs keyboard shortcuts that they habitually try to use them in all other applications, and they build applications into Emacs, so they never have to leave in the first place. If you want Emacs to play an important role in your computing life, the ultimate key is to embrace the unknown and start using Emacs. Stumble through it until you've discovered how to make it work for you, and then settle in for 40 years of comfort.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/getting-started-emacs
+
+作者:[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/sites/default/files/styles/image-full-size/public/lead-images/keyboaord_enter_writing_documentation.jpg?itok=kKrnXc5h (Computer keyboard typing)
+[2]: https://opensource.com/downloads/emacs-cheat-sheet
+[3]: https://opensource.com/downloads/cheat-sheet-vim
+[4]: https://opensource.com/article/17/2/pocketchip-or-pi
+[5]: https://opensource.com/sites/default/files/uploads/emacs-slackware.jpg (Emacs slackware)
+[6]: https://opensource.com/sites/default/files/uploads/emacs-tutorial-map.png (Emacs tutorial map)
+[7]: https://opensource.com/sites/default/files/uploads/emacs-function.jpg (Emacs function)
+[8]: https://opensource.com/sites/default/files/uploads/emacs-emoji_0.jpg (Emacs emoji)
+[9]: https://opensource.com/sites/default/files/uploads/emacs-tetris.jpg (Emacs tetris)
diff --git a/sources/tech/20200310 Run Kubernetes on a Raspberry Pi with k3s.md b/sources/tech/20200310 Run Kubernetes on a Raspberry Pi with k3s.md
new file mode 100644
index 0000000000..2079a18983
--- /dev/null
+++ b/sources/tech/20200310 Run Kubernetes on a Raspberry Pi with k3s.md
@@ -0,0 +1,203 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Run Kubernetes on a Raspberry Pi with k3s)
+[#]: via: (https://opensource.com/article/20/3/kubernetes-raspberry-pi-k3s)
+[#]: author: (Lee Carpenter https://opensource.com/users/carpie)
+
+Run Kubernetes on a Raspberry Pi with k3s
+======
+Create your own three-node Kubernetes cluster with these easy-to-follow
+instructions.
+![A ship wheel with someone steering][1]
+
+For a long time, I've been interested in building a [Kubernetes][2] cluster out of a stack of inexpensive Raspberry Pis. Following along with various tutorials on the web, I was able to get Kubernetes installed and working in a three Pi cluster. However, the RAM and CPU requirements on the master node overwhelmed my Pi. This caused poor performance when doing various Kubernetes tasks. It also made an in-place upgrade of Kubernetes impossible.
+
+As a result, I was very excited to see the [k3s project][3]. K3s is billed as a lightweight Kubernetes for use in resource-constrained environments. It is also optimized for ARM processors. This makes running a Raspberry Pi-based Kubernetes cluster much more feasible. In fact, we are going to create one in this article.
+
+### Materials needed
+
+To create the Kubernetes cluster described in this article, we are going to need:
+
+ * At least one Raspberry Pi (with SD card and power adapter)
+ * Ethernet cables
+ * A switch or router to connect all our Pis together
+
+
+
+We will be installing k3s from the internet, so they will need to be able to access the internet through the router.
+
+### An overview of our cluster
+
+For this cluster, we are going to use three Raspberry Pis. The first we'll name **kmaster** and assign a static IP of 192.168.0.50 (since our local network is 192.168.0.0/24). The first worker node (the second Pi), we'll name **knode1** and assign an IP of 192.168.0.51. The final worker node we'll name **knode2** and assign an IP of 192.168.0.52.
+
+Obviously, if you have a different network layout, you may use any network/IPs you have available. Just substitute your own values anywhere IPs are used in this article.
+
+So that we don't have to keep referring to each node by IP, let's add their host names to our **/etc/hosts** file on our PC.
+
+
+```
+echo -e "192.168.0.50\tkmaster" | sudo tee -a /etc/hosts
+echo -e "192.168.0.51\tknode1" | sudo tee -a /etc/hosts
+echo -e "192.168.0.52\tknode2" | sudo tee -a /etc/hosts
+```
+
+### Installing the master node
+
+Now we're ready to install the master node. The first step is to install the latest Raspbian image. I am not going to explain that here, but I have a [detailed article][4] on how to do this if you need it. So please go install Raspbian, enable the SSH server, set the hostname to **kmaster**, and assign a static IP of 192.168.0.50.
+
+Now that Raspbian is installed on the master node, let's boot our master Pi and **ssh** into it:
+
+
+```
+`ssh pi@kmaster`
+```
+
+Now we're ready to install **k3s**. On the master Pi, run:
+
+
+```
+`curl -sfL https://get.k3s.io | sh -`
+```
+
+When the command finishes, we already have a single node cluster set up and running! Let's check it out. Still on the Pi, run:
+
+
+```
+`sudo kubectl get nodes`
+```
+
+You should see something similar to:
+
+
+```
+NAME STATUS ROLES AGE VERSION
+kmaster Ready master 2m13s v1.14.3-k3s.1
+```
+
+### Extracting the join token
+
+We want to add a couple of worker nodes. When installing **k3s** on those nodes we will need a join token. The join token exists on the master node's filesystem. Let's copy that and save it somewhere we can get to it later:
+
+
+```
+`sudo cat /var/lib/rancher/k3s/server/node-token`
+```
+
+### Installing the worker nodes
+
+Grab some SD cards for the two worker nodes and install Raspbian on each. For one, set the hostname to **knode1** and assign an IP of 192.168.0.51. For the other, set the hostname to **knode2** and assign an IP of 192.168.0.52. Now, let's install **k3s**.
+
+Boot your first worker node and **ssh** into it:
+
+
+```
+`ssh pi@knode1`
+```
+
+On the Pi, we'll install **k3s** as before, but we will give the installer extra parameters to let it know that we are installing a worker node and that we'd like to join the existing cluster:
+
+
+```
+curl -sfL | K3S_URL= \
+K3S_TOKEN=join_token_we_copied_earlier sh -
+```
+
+Replace **join_token_we_copied_earlier** with the token from the "Extracting the join token" section. Repeat these steps for **knode2**.
+
+### Access the cluster from our PC
+
+It'd be annoying to have to **ssh** to the master node to run **kubectl** anytime we wanted to inspect or modify our cluster. So, we want to put **kubectl** on our PC. But first, let's get the configuration information we need from our master node. **Ssh** into **kmaster** and run:
+
+
+```
+`sudo cat /etc/rancher/k3s/k3s.yaml`
+```
+
+Copy this configuration information and return to your PC. Make a directory for the config:
+
+
+```
+`mkdir ~/.kube`
+```
+
+Save the copied configuration as **~/.kube/config**. Now edit the file and change the line:
+
+
+```
+`server: https://localhost:6443`
+```
+
+to be:
+
+
+```
+`server: https://kmaster:6443`
+```
+
+For security purpose, limit the file's read/write permissions to just yourself:
+
+
+```
+`chmod 600 ~/.kube/config`
+```
+
+Now let's install **kubectl** on our PC (if you don't already have it). The Kubernetes site has [instructions][5] for doing this for various platforms. Since I'm running Linux Mint, an Ubuntu derivative, I'll show the Ubuntu instructions here:
+
+
+```
+sudo apt update && sudo apt install -y apt-transport-https
+curl -s | sudo apt-key add -
+echo "deb kubernetes-xenial main" | \
+sudo tee -a /etc/apt/sources.list.d/kubernetes.list
+sudo apt update && sudo apt install kubectl
+```
+
+If you're not familiar, the above commands add a Debian repository for Kubernetes, grab its GPG key for security, and then update the list of packages and install **kubectl**. Now, we'll get notifications of any updates for **kubectl** through the standard software update mechanism.
+
+Now we can check out our cluster from our PC! Run:
+
+
+```
+`kubectl get nodes`
+```
+
+You should see something like:
+
+
+```
+NAME STATUS ROLES AGE VERSION
+kmaster Ready master 12m v1.14.3-k3s.1
+knode1 Ready worker 103s v1.14.3-k3s.1
+knode1 Ready worker 103s v1.14.3-k3s.1
+```
+
+Congratulations! You have a working 3-node Kubernetes cluster!
+
+### The k3s bonus
+
+If you run **kubectl get pods --all-namespaces**, you will see some extra pods for [Traefik][6]. Traefik is a reverse proxy and load balancer that we can use to direct traffic into our cluster from a single entry point. Kubernetes allows for this but doesn't provide such a service directly. Having Traefik installed by default is a nice touch by Rancher Labs. This makes a default **k3s** install fully complete and immediately usable!
+
+We're going to explore using Traefik through Kubernetes **ingress** rules and deploy all kinds of goodies to our cluster in future articles. Stay tuned!
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/kubernetes-raspberry-pi-k3s
+
+作者:[Lee Carpenter][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/carpie
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/ship_wheel_gear_devops_kubernetes.png?itok=xm4a74Kv (A ship wheel with someone steering)
+[2]: https://opensource.com/resources/what-is-kubernetes
+[3]: https://k3s.io/
+[4]: https://carpie.net/articles/headless-pi-with-static-ip-wired-edition
+[5]: https://kubernetes.io/docs/tasks/tools/install-kubectl/
+[6]: https://traefik.io/
diff --git a/sources/tech/20200311 Directing Kubernetes traffic with Traefik.md b/sources/tech/20200311 Directing Kubernetes traffic with Traefik.md
new file mode 100644
index 0000000000..76a457be59
--- /dev/null
+++ b/sources/tech/20200311 Directing Kubernetes traffic with Traefik.md
@@ -0,0 +1,394 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Directing Kubernetes traffic with Traefik)
+[#]: via: (https://opensource.com/article/20/3/kubernetes-traefik)
+[#]: author: (Lee Carpenter https://opensource.com/users/carpie)
+
+Directing Kubernetes traffic with Traefik
+======
+A step-by-step walkthrough on ingressing traffic into a
+Kubernetes-Raspberry Pi cluster.
+![Digital creative of a browser on the internet][1]
+
+In this article, we will deploy a couple of simple websites and learn how to ingress traffic from the outside world into our cluster using Traefik. After that, we will learn how to remove Kubernetes resources as well. Let’s get started!
+
+### Materials needed
+
+To follow along with the article, you only need [the k3s Raspberry Pi cluster][2] we built in a previous article. Since your cluster will be pulling images from the web, the cluster will need to be able to access the internet.
+
+Some configuration files and sample HTML files will be shown in this article for explanation purposes. All sample files can be downloaded [here][3].
+
+### Deploying a simple website
+
+Previously, we did a direct deploy with **kubectl**. This is not the typical way to deploy things, however. Generally, YAML configuration files are used, and that is what we will use in this article. We will start at the top and create our configuration files in a top-down approach.
+
+### Deployment configuration
+
+First up is the deployment configuration. The configuration is shown below, and the explanation follows. I typically use the samples from the [Kubernetes documentation][4] as a starting point and then modify them to suit my needs. For example, the configuration below was modified after copying the sample from the [deployment docs][5].
+
+Create a file, **mysite.yaml**, with the following contents:
+
+
+```
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: mysite-nginx
+ labels:
+ app: mysite-nginx
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: mysite-nginx
+ template:
+ metadata:
+ labels:
+ app: mysite-nginx
+ spec:
+ containers:
+ - name: nginx
+ image: nginx
+ ports:
+ - containerPort: 80
+```
+
+Most of this is boilerplate. The important parts, we have named our deployment **mysite-nginx** with an **app** label of **mysite-nginx **as well. We have specified that we want one **replica** which means there will only be one pod created. We also specified **one container**, which we named **nginx**. We specified the **image** to be **nginx**. This means, on deployment, k3s will download the **nginx** image from DockerHub and create a pod from it. Finally, we specified a **containerPort** of **80**, which just means that inside the container the pod will listen on port **80**.
+
+I emphasized "inside the container" above because it is an important distinction. As we have the container configured, it is only accessible inside the container, and it is further restricted to an internal network. This is necessary to allow multiple containers to listen on the same container ports. In other words, with this configuration, some other pod could listen on its container port 80 as well and not conflict with this one. To provide formal access to this pod, we need a **service** configuration.
+
+### Service configuration
+
+In Kubernetes, a **service** is an abstraction. It provides a means to access a pod or set of pods. One connects to the service and the service routes to a single pod or load balances to multiple pods if multiple pod replicas are defined.
+
+The service can be specified in the same configuration file, and that is what we will do here. Separate configuration areas with **`---`**. Add the following to **mysite.yaml**:
+
+
+```
+\---
+apiVersion: v1
+kind: Service
+metadata:
+ name: mysite-nginx-service
+spec:
+ selector:
+ app: mysite-nginx
+ ports:
+ - protocol: TCP
+ port: 80
+```
+
+In this configuration, we have named our service **mysite-nginx-service**. We provided a `selector` of **app: mysite-nginx**. This is how the service chooses the application containers it routes to. Remember, we provided an **app** label for our container as **mysite-nginx**. This is what the service will use to find our container. Finally, we specified that the service protocol is **TCP** and the service listens on port **80**.
+
+### Ingress configuration
+
+The ingress configuration specifies how to get traffic from outside our cluster to services inside our cluster. Remember, k3s comes pre-configured with Traefik as an ingress controller. Therefore, we will write our ingress configuration specific to Traefik. Add the following to **mysite.yaml **( and don’t forget to separate with **`---`**):
+
+
+```
+\---
+apiVersion: networking.k8s.io/v1beta1
+kind: Ingress
+metadata:
+ name: mysite-nginx-ingress
+ annotations:
+ kubernetes.io/ingress.class: "traefik"
+spec:
+ rules:
+ - http:
+ paths:
+ - path: /
+ backend:
+ serviceName: mysite-nginx-service
+ servicePort: 80
+```
+
+In this configuration, we have named the ingress record **mysite-nginx-ingress**. And we told Kubernetes that we expect **traefik** to be our ingress controller with the **kubernetes.io/ingress.class** annotation.
+
+In the **rules** section, we are basically saying, when **http** traffic comes in, and the **path** matches **`/`** (or anything below that), route it to the **backend** service specified by the **serviceName mysite-nginx-service**, and route it to **servicePort 80**. This connects incoming HTTP traffic to the service we defined earlier.
+
+### Something to deploy
+
+That is really it as far as configuration goes. If we deployed now, we would get the default **nginx** page, but that is not what we want. Let’s create something simple but custom to deploy. Create the file **index.html** with the following contents:
+
+
+```
+<html>
+<head><title>K3S!</title>
+ <style>
+ html {
+ font-size: 62.5%;
+ }
+ body {
+ font-family: sans-serif;
+ background-color: midnightblue;
+ color: white;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ height: 100vh;
+ }
+ div {
+ text-align: center;
+ font-size: 8rem;
+ text-shadow: 3px 3px 4px dimgrey;
+ }
+ </style>
+</head>
+<body>
+ <div>Hello from K3S!</div>
+</body>
+</html>
+```
+
+We have not yet covered storage mechanisms in Kubernetes, so we are going to cheat a bit and just store this file in a Kubernetes config map. This is not the recommended way to deploy a website, but it will work for our purposes. Run the following:
+
+
+```
+`kubectl create configmap mysite-html --from-file index.html`
+```
+
+This command creates a `configmap` resource named **mysite-html** from the local file **index.html**. This essentially stores a file (or set of files) inside a Kubernetes resource that we can call out in configuration. It is typically used to store configuration files (hence the name), so we are abusing it a bit here. In a later article, we will discuss proper storage solutions in Kubernetes.
+
+With the config map created, let’s mount it inside our **nginx** container. We do this in two steps. First, we need to specify a **volume**, calling out the config map. Then we need to mount the volume into the **nginx** container. Complete the first step by adding the following under the **spec** label, just after **containers** in **mysite.yaml**:
+
+
+```
+ volumes:
+ - name: html-volume
+ configMap:
+ name: mysite-html
+```
+
+This tells Kubernetes that we want to define a **volume**, with the name **html-volume** and that volume should contain the contents of the **configMap** named **html-volume** (which we created in the previous step).
+
+Next, in the **nginx** container specification, just under **ports**, add the following:
+
+
+```
+ volumeMounts:
+ - name: html-volume
+ mountPath: /usr/share/nginx/html
+```
+
+This tells Kubernetes, for the **nginx** container, we want to mount a **volume** named **html-volume** at the path (in the container) **/usr/share/nginx/html**. Why **/usr/share/nginx/html**? That is where the **nginx** image serves HTML from. By mounting our volume at that path, we have replaced the default contents with our volume contents.
+
+For reference, the **deployment** section of the configuration file should now look like this:
+
+
+```
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: mysite-nginx
+ labels:
+ app: mysite-nginx
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: mysite-nginx
+ template:
+ metadata:
+ labels:
+ app: mysite-nginx
+ spec:
+ containers:
+ - name: nginx
+ image: nginx
+ ports:
+ - containerPort: 80
+ volumeMounts:
+ - name: html-volume
+ mountPath: /usr/share/nginx/html
+ volumes:
+ - name: html-volume
+ configMap:
+ name: mysite-html
+```
+
+### Deploy it!
+
+Now we are ready to deploy! We can do that with:
+
+
+```
+`kubectl apply -f mysite.yaml`
+```
+
+You should see something similar to the following:
+
+
+```
+deployment.apps/mysite-nginx created
+service/mysite-nginx-service created
+ingress.networking.k8s.io/mysite-nginx-ingress created
+```
+
+This means that Kubernetes created resources for each of the three configurations we specified. Check on the status of the pods with:
+
+
+```
+`kubectl get pods`
+```
+
+If you see a status of **ContainerCreating**, give it some time and run **kubectl get pods** again. Typically, the first time, it will take a while because k3s has to download the **nginx** image to create the pod. After a while, you should get a status of **Running**.
+
+### Try it!
+
+Once the pod is running, it is time to try it. Open up a browser and type **kmaster** into the address bar.
+
+![][6]
+
+Congratulations! You’ve deployed a website on your k3s cluster!
+
+### Another one
+
+So now we have a whole k3s cluster running a single website. But we can do more! What if we have another website we want to serve on the same cluster? Let’s see how to do that.
+
+Again, we need something to deploy. It just so happens that my dog has a message she has wanted the world to know for some time. So, I crafted some HTML just for her (available from the samples zip file). Again, we will use the config map trick to host our HTML. This time we are going to poke a whole directory (the **html** directory) into a config map, but the invocation is the same.
+
+
+```
+`kubectl create configmap mydog-html --from-file html`
+```
+
+Now we need to create a configuration file for this site. It is almost exactly the same as the one for **mysite.yaml**, so start by copying **mysite.yaml** to **mydog.yaml**. Now edit **mydog.yaml** to be:
+
+
+```
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: mydog-nginx
+ labels:
+ app: mydog-nginx
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: mydog-nginx
+ template:
+ metadata:
+ labels:
+ app: mydog-nginx
+ spec:
+ containers:
+ - name: nginx
+ image: nginx
+ ports:
+ - containerPort: 80
+ volumeMounts:
+ - name: html-volume
+ mountPath: /usr/share/nginx/html
+ volumes:
+ - name: html-volume
+ configMap:
+ name: mydog-html
+\---
+apiVersion: v1
+kind: Service
+metadata:
+ name: mydog-nginx-service
+spec:
+ selector:
+ app: mydog-nginx
+ ports:
+ - protocol: TCP
+ port: 80
+\---
+apiVersion: networking.k8s.io/v1beta1
+kind: Ingress
+metadata:
+ name: mydog-nginx-ingress
+ annotations:
+ kubernetes.io/ingress.class: "traefik"
+ traefik.frontend.rule.type: PathPrefixStrip
+spec:
+ rules:
+ - http:
+ paths:
+ - path: /mydog
+ backend:
+ serviceName: mydog-nginx-service
+ servicePort: 80
+```
+
+We can do most of the edits by simply doing a search and replace of **mysite** to **mydog**. The two other edits are in the ingress section. We changed **path** to **/mydog **and we added an annotation, **traefik.frontend.rule.type: PathPrefixStrip**.
+
+The specification of the path **/mydog** instructs Traefik to route any incoming request that requests a path starting with **/mydog** to the **mydog-nginx-service**. Any other path will continue to be routed to **mysite-nginx-service.**
+
+The new annotation, **PathPrefixStrip**, tells Traefik to strip off the prefix **/mydog** before sending the request to **mydog-nginx-service**. We did this because the **mydog-nginx** application doesn’t expect a prefix. This means we could change where the service was mounted simply by changing the prefix in the ingress record.
+
+Now we can deploy like we did before:
+
+
+```
+`kubectl apply -f mydog.yaml`
+```
+
+And now, my dog’s message should be available at .
+
+![][7]
+
+Phew! The message is out! Maybe we can all get some sleep tonight.
+
+So now, we have a k3s cluster hosting two websites with Traefik making decisions, based on path names, as to which service to pass the request to! We are not limited to path-based routing, however. We could use hostname based routing as well, which we will explore in a future article.
+
+Also, the websites we just hosted are standard unencrypted HTML sites. Everything these days is encrypted with SSL/TLS. In our next article, we will add support to our k3s cluster to host SSL/TLS HTTPS sites as well!
+
+### Cleaning up
+
+Before you go, since this article mostly dealt with sample sites, I would like to show you how to delete things in case you don’t want the samples hanging around on your cluster.
+
+For most configurations, you can undo the configuration simply by running the **delete** command with the same configuration file you deployed with. So let’s clean up both **mysite** and **mydog**.
+
+
+```
+kubectl delete -f mysite.yaml
+kubectl delete -f mydog.yaml
+```
+
+Since we manually created the config maps, we’ll need to delete those manually as well.
+
+
+```
+kubectl delete configmap mysite-html
+kubectl delete configmap mydog-html
+```
+
+Now if we do a **kubectl get pods**, we should see that our nginx pods are no longer around.
+
+
+```
+$ kubectl get pods
+No resources found in default namespace.
+```
+
+Everything is cleaned up.
+
+Tell me what thoughts you have on this project in the comments below.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/kubernetes-traefik
+
+作者:[Lee Carpenter][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/carpie
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_web_internet_website.png?itok=g5B_Bw62 (Digital creative of a browser on the internet)
+[2]: https://opensource.com/article/20/3/kubernetes-raspberry-pi
+[3]: https://gitlab.com/carpie/ingressing_with_k3s/-/archive/master/ingressing_with_k3s-master.zip
+[4]: https://kubernetes.io/docs/
+[5]: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#creating-a-deployment
+[6]: https://opensource.com/sites/default/files/uploads/mysite.jpg
+[7]: https://opensource.com/sites/default/files/uploads/mydog.jpg
diff --git a/sources/tech/20200311 Using the Quarkus Framework on Fedora Silverblue - Just a Quick Look.md b/sources/tech/20200311 Using the Quarkus Framework on Fedora Silverblue - Just a Quick Look.md
new file mode 100644
index 0000000000..1d72cd1d03
--- /dev/null
+++ b/sources/tech/20200311 Using the Quarkus Framework on Fedora Silverblue - Just a Quick Look.md
@@ -0,0 +1,209 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Using the Quarkus Framework on Fedora Silverblue – Just a Quick Look)
+[#]: via: (https://fedoramagazine.org/using-the-quarkus-framework-on-fedora-silverblue-just-a-quick-look/)
+[#]: author: (Stephen Snow https://fedoramagazine.org/author/jakfrost/)
+
+Using the Quarkus Framework on Fedora Silverblue – Just a Quick Look
+======
+
+![Using the Quarkus Framework on Fedora Silverblue – Just a Quick Look][1]
+
+[Quarkus][2] is a framework for Java development that is described on their web site as:
+
+> A Kubernetes Native Java stack tailored for OpenJDK HotSpot and GraalVM, crafted from the best of breed Java libraries and standards
+>
+> – Feb. 5, 2020
+
+Silverblue — a Fedora Workstation variant with a container based workflow central to its functionality — should be an ideal host system for the Quarkus framework.
+
+There are currently two ways to use Quarkus with Silverblue. It can be run in a pet container such as Toolbox/Coretoolbox. Or it can be run directly in a terminal emulator. This article will focus on the latter method.
+
+### Why Quarkus
+
+[According to Quarkus.io][3]: “Quarkus has been designed around a containers first philosophy. What this means in real terms is that Quarkus is optimized for low memory usage and fast startup times.” To achieve this, they employ first class support for Graal/Substrate VM, build time Metadata processing, reduction in reflection usage, and native image preboot. For details about why this matters, read [Container First][3] at Quarkus.
+
+### Prerequisites
+
+A few prerequisites will need to configured before you can start using Quarkus. First, you need an IDE of your choice. Any of the popular ones will do. VIM or Emacs will work as well. The Quarkus site provides full details on how to set up the three major Java IDE’s (Eclipse, Intellij Idea, and Apache Netbeans). You will need a version of JDK installed. JDK 8, JDK 11 or any distribution of OpenJDK is fine. GrallVM 19.2.1 or 19.3.1 is needed for compiling down to native. You will also need Apache Maven 3.53+ or Gradle. This article will use Maven because that is what the author is more familiar with. Use the following command to layer Java 11 OpenJDK and Maven onto Silverblue:
+
+```
+$ rpm-ostree install java-11-openjdk* maven
+```
+
+Alternatively, you can download your favorite version of Java and install it directly in your home directory.
+
+After rebooting, configure your _JAVA_HOME_ and _PATH_ environment variables to reference the new applications. Next, go to the [GraalVM download page][4], and get GraalVM version 19.2.1 or version 19.3.1 for Java 11 OpenJDK. Install Graal as per the instructions provided. Basically, copy and decompress the archive into a directory under your home directory, then modify the _PATH_ environment variable to include Graal. You use it as you would any JDK. So you can set it up as a platform in the IDE of your choice. Now is the time to setup the native image if you are going to use one. For more details on setting up your system to use Quarkus and the Quarkus native image, check out their [Getting Started tutorial][5]. With these parts installed and the environment setup, you can now try out Quarkus.
+
+### Bootstrapping
+
+Quarkus recommends you create a project using the bootstrapping method. Below are some example commands entered into a terminal emulator in the Gnome shell on Silverblue.
+
+```
+$ mvn io.quarkus:quarkus-maven-plugin:1.2.1.Final:create \
+ -DprojectGroupId=org.jakfrost \
+ -DprojectArtifactId=silverblue-logo \
+ -DclassName="org.jakfrost.quickstart.GreetingResource" \
+ -Dpath="/hello"
+$ cd silverblue-logo
+```
+
+The bootstrapping process shown above will create a project under the current directory with the name _silverblue-logo_. After this completes, start the application in development mode:
+
+```
+$ ./mvnw compile quarkus:dev
+```
+
+With the application running, check whether it responds as expected by issuing the following command:
+
+```
+$ curl -w '\n' http://localhost:8080/hello
+```
+
+The above command should print _hello_ on the next line. Alternatively, test the application by browsing to __ with your web browser. You should see the same lonely _hello_ on an otherwise empty page. Leave the application running for the next section.
+
+### Injection
+
+Open the project in your favorite IDE. If you are using Netbeans, simply open the project directory where the _pom.xml_ file resides. Now would be a good time to have a look at the _pom.xml_ file.
+
+Quarkus uses ArC for its dependency injection. ArC is a dependency of quarkus-resteasy, so it is already part of the core Quarkus installation. Add a companion bean to the project by creating a java class in your IDE called _GreetingService.java_. Then put the following code into it:
+
+```
+import javax.enterprise.context.ApplicationScoped;
+
+@ApplicationScoped
+public class GreetingService {
+
+ public String greeting(String name) {
+ return "hello " + name;
+ }
+
+}
+```
+
+The above code is a verbatim copy of what is used in the injection example in the Quarkus Getting Started tutorial. Modify _GreetingResource.java_ by adding the following lines of code:
+
+```
+import javax.inject.Inject;
+import org.jboss.resteasy.annotations.jaxrs.PathParam;
+
+@Inject
+ GreetingService service;//inject the service
+
+ @GET //add a getter to use the injected service
+ @Produces(MediaType.TEXT_PLAIN)
+ @Path("/greeting/{name}")
+ public String greeting(@PathParam String name) {
+ return service.greeting(name);
+ }
+```
+
+If you haven’t stopped the application, it will be easy to see the effect of your changes. Just enter the following _curl_ command:
+
+```
+$ curl -w '\n' http://localhost:8080/hello/greeting/Silverblue
+```
+
+The above command should print _hello Silverblue_ on the following line. The URL should work similarly in a web browser. There are two important things to note:
+
+ 1. The application was running and Quarkus detected the file changes on the fly.
+ 2. The injection of code into the app was very easy to perform.
+
+
+
+### The native image
+
+Next, package your application as a native image that will work in a _podman_ container. Exit the application by pressing **CTRL-C**. Then use the following command to package it:
+
+```
+$ ./mvnw package -Pnative -Dquarkus.native.container-runtime=podman
+```
+
+Now, build the container:
+
+```
+$ podman build -f src/main/docker/Dockerfile.native -t silverblue-logo/silverblue-logo
+```
+
+Now run it with the following:
+
+```
+$ podman run -i --rm -p 8080:8080 localhost/silverblue-logo/silverblue-logo
+```
+
+To get the container build to successfully complete, it was necessary to copy the _/target_ directory and contents into the _src/main/docker/_ directory. Investigation as to the reason why is still required, and though the solution used was quick and easy, it is not an acceptable way to solve the problem.
+
+Now that you have the container running with the application inside, you can use the same methods as before to verify that it is working.
+
+Point your browser to the URL and you should get a _index.html_ that is automatically generated by Quarkus every time you create or modify an application. It resides in the _src/main/resources/META-INF/resources/_ directory. Drop other HTML files in this _resources_ directory to have Quarkus serve them on request.
+
+For example, create a file named _logo.html_ in the _resources_ directory containing the below markup:
+
+```
+
+
+
+
+ Silverblue
+
+
+
+
+
+
+
+
+
+```
+
+Next, save the below image alongside the _logo.html_ file with the name _fedora-silverblue-logo.png_:
+
+![][6]
+
+Now view the results at .
+
+#### Testing your application
+
+Quarkus supports junit 5 tests. Look at your project’s _pom.xml_ file. In it you should see two test dependencies. The generated project will contain a simple test, named _GreetingResourceTest.java_. Testing for the native file is only supported in _prod_ mode. However, you can test the _jar_ file in _dev_ mode. These tests are RestAssured, but you can use whatever test library you wish with Quarkus. Use Maven to run the tests:
+
+```
+$ ./mvnw test
+```
+
+More details can be found in the Quarkus [Getting Started][7] tutorial.
+
+#### Further reading and tutorials
+
+Quarkus has an extensive collection of [tutorials and guides][8]. They are well worth the time to delve into the breadth of this microservices framework.
+
+Quarkus also maintains a [publications][9] page that lists some very interesting articles on actual use cases of Quarkus. This article has only just scratched the surface of the topic. If what was presented here has piqued your interest, then follow the above links for more information.
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/using-the-quarkus-framework-on-fedora-silverblue-just-a-quick-look/
+
+作者:[Stephen Snow][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/jakfrost/
+[b]: https://github.com/lujun9972
+[1]: https://fedoramagazine.org/wp-content/uploads/2020/02/quarkus-816x345.jpg
+[2]: https://quarkus.io/
+[3]: https://quarkus.io/vision/container-first
+[4]: https://www.graalvm.org/downloads/
+[5]: https://quarkus.io/get-started/
+[6]: https://fedoramagazine.org/wp-content/uploads/2020/02/fedora-silverblue-logo.png
+[7]: https://quarkus.io/guides/getting-started
+[8]: https://quarkus.io/guides/
+[9]: https://quarkus.io/publications/
diff --git a/sources/tech/20200311 What you need to know about variables in Emacs.md b/sources/tech/20200311 What you need to know about variables in Emacs.md
new file mode 100644
index 0000000000..d66ba374f4
--- /dev/null
+++ b/sources/tech/20200311 What you need to know about variables in Emacs.md
@@ -0,0 +1,243 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (What you need to know about variables in Emacs)
+[#]: via: (https://opensource.com/article/20/3/variables-emacs)
+[#]: author: (Clemens Radermacher https://opensource.com/users/clemera)
+
+What you need to know about variables in Emacs
+======
+Learn how Elisp deals with variables and to use them in your scripts and
+configurations.
+![Programming keyboard.][1]
+
+GNU Emacs is written in C and Emacs Lisp (Elisp), a dialect of the Lisp programming language. Because it's a text editor that happens to be an Elisp sandbox, it is helpful to understand how basic programming concepts work in Elisp.
+
+If you're new to [Emacs][2], visit Sacha Chua's excellent list of [resources for Emacs beginners][3]. This article assumes you're familiar with common Emacs terminology and that you know how to read and evaluate basic snippets of Elisp code. Ideally, you should also have heard of variable scope and how it works in another programming language. The examples also assume you use a fairly recent Emacs version ([v.25 or later][4]).
+
+The [Elisp manual][5] includes everything there is to know, but it is written for people who already know what they are looking for (and it is really great for that). But many people want resources that explain Elisp concepts at a higher level and reduce the amount of information to the most useful bits. This article is my attempt to respond to that—to give readers a good grasp of the basics so they can use them for their configuration and make it easier for people to look up some detail in the manual.
+
+### Global variables
+
+User options defined with **defcustom** and variables defined with **defvar** or **defconst** are global. One important aspect of variables declared by **defcustom** or **defvar** is that reevaluating them won't reset a variable if it is already bound. For example, if you establish a binding for **my-var** in your init file like this:
+
+
+```
+`(setq my-var nil)`
+```
+
+evaluating the following form won't reset the variable to **t**:
+
+
+```
+`(defvar my-var t)`
+```
+
+Note that there is _one exception_: If you evaluate the declaration above with **C-M-x** that calls **eval-defun**, the value will be reset to **t**. This way, you can enforce setting the value if you need to. This behavior is intentional: As you might know, many features in Emacs load only on demand (i.e., they are autoloaded). If the declarations in those files reset variables to their default value, this would override any settings in your init.
+
+### User options
+
+A user option is simply a global variable that is declared with **defcustom**. Unlike variables declared with **defvar**, such a variable is configurable with the **M-x customize** interface. As far as I know, most people don't use it much because it feels clunky. Once you know how to set variables in your init file, there's no compelling reason to use it. One detail many users aren't aware of is that setting user options with **customize** might execute code, and this is sometimes used to run additional setup instructions:
+
+
+```
+(defcustom my-option t
+ "My user option."
+ :set (lambda (sym val)
+ (set-default sym val)
+ (message "Set %s to %s" sym val)))
+```
+
+If you evaluate this code and change the value using the **customize** interface with **M-x customize-option RET my-option RET **the lambda will be called, and the message in the echo area will tell you the symbol and value of the option.
+
+If you use **setq** in your init file, to change the value of such an option, the setter function will _not_ run. To set such an option correctly with Elisp, you need to use the function **customize-set-variable**. Alternatively, people use various versions of **csetq** macros in their configs to automatically take care of this (you can use GitHub code search to discover more sophisticated variants if you like):
+
+
+```
+(defmacro csetq (sym val)
+ `(funcall (or (get ',sym 'custom-set) 'set-default) ',sym ,val))
+```
+
+If you are using the [use-package][6] macro, the **:custom** keyword will handle this for you.
+
+After putting the code above into your init file, you can use **csetq** to set variables in a way that respects any existing setter functions. You can prove this by watching the message in the echo area when using this macro to change the option defined above:
+
+
+```
+`(csetq my-option nil)`
+```
+
+### Dynamic binding and lexical binding
+
+If you use other programming languages, you may not be aware of the differences between dynamic and lexical binding. Most programming languages today use lexical binding, and there is no need to know the difference when you learn about variable scope/lookup.
+
+Emacs Lisp is special in this regard because dynamic binding is the default, and lexical binding must be enabled explicitly. There are historical reasons for this, and in practice, you should _always_ enable lexical binding because it is faster and less error-prone. To enable it, simply put the following comment line as the first line in your Emacs Lisp file:
+
+
+```
+`;;; -*- lexical-binding: t; -*-`
+```
+
+Alternatively, you can call M-x **add-file-local-variable-prop-line**, which will insert the comment line above when you choose the variable **lexical-binding** with value **t**.
+
+When a file with such a specially formatted line is loaded, Emacs sets the variable accordingly, which means the code in that buffer is loaded with lexical binding enabled. Interactively, you can use **M-x eval-buffer**, which takes the lexical binding setting into account.
+
+Now that you know how to enable lexical binding, it's smart to learn what the terms mean. With dynamic binding, the last binding established during program execution is used for variable lookup. You can test this by putting the following code in an empty buffer and executing **M-x eval-buffer**:
+
+
+```
+(defun a-exists-only-in-my-body (a)
+ (other-function))
+
+(defun other-function ()
+ (message "I see `a', its value is %s" a))
+
+(a-exists-only-in-my-body t)
+```
+
+You may be surprised to see that the lookup of variable **a** in the **other-function** is successful.
+
+If you retry the preceding example with the special lexical-binding comment at the top, the code will throw a "variable is void" error because **other-function** does not know about the **a** variable. If you're coming from another programming language, this is the behavior you would expect.
+
+With lexical binding, the scope is defined by the surrounding source code. This is not only for performance reasons—experience and time have shown that this behavior is preferred.
+
+### Special variables and dynamic binding
+
+As you may know, **let** is used to temporary establish local bindings:
+
+
+```
+(let ((a "I'm a")
+ (b "I'm b"))
+ (message "Hello, %s. Hello %s" a b))
+```
+
+Here is the thing: Variables declared with **defcustom**, **defvar**, or **defconst** are called _special variables_, and they continue to use dynamic binding regardless of whether lexical binding is enabled:
+
+
+```
+;;; -*- lexical-binding: t; -*-
+
+(defun some-other-function ()
+ (message "I see `c', its value is: %s" c))
+
+(defvar c t)
+
+(let ((a "I'm lexically bound")
+ (c "I'm special and therefore dynamically bound"))
+ (some-other-function)
+ (message "I see `a', its values is: %s" a))
+```
+
+To see both messages in the example above, switch to the ***Messages*** buffer using **C-h e**.
+
+Local variables bound with **let** or function arguments follow the lookup rules defined by the **lexical-binding** variable, but global variables defined with **defvar**, **defconst**, or **defcustom** can be changed deep down in the call stack for the duration of the **let** body.
+
+This behavior allows for convenient ad-hoc customizations and is often used in Emacs, which isn't surprising given that Emacs Lisp started out with dynamic binding being the only option. Here is a common example showing how you can temporarily write to a read-only buffer:
+
+
+```
+(let ((inhibit-read-only t))
+ (insert ...))
+```
+
+Here is another often-seen example for performing case-sensitive searches:
+
+
+```
+(let ((case-fold-search nil))
+ (some-function-which-uses-search ...))
+```
+
+Dynamic binding allows you to change the behavior of functions in ways the authors of those functions may have never anticipated. It's a powerful tool and a great feature for a program that is designed and used like Emacs.
+
+There is one caveat to be aware of: You might accidentally use a local variable name that is declared as a special variable elsewhere. One trick to prevent such conflicts is to avoid dashes in local variables' names. In my current Emacs session, this leaves only a handful of potential conflicting candidates:
+
+
+```
+(let ((vars ()))
+ (mapatoms
+ (lambda (cand)
+ (when (and (boundp cand)
+ (not (keywordp cand))
+ (special-variable-p cand)
+ (not (string-match "-"
+ (symbol-name cand))))
+ (push cand vars))))
+ vars) ;; => (t obarray noninteractive debugger nil)
+```
+
+### Buffer-local variables
+
+Each buffer can have a local binding for a variable. This means any variable lookup made while this buffer is current will reveal the buffer's local value of that variable instead of the default value. Local variables are an important feature in Emacs; for example, they are used by major modes to establish their buffer-local behavior and settings.
+
+You have already seen a buffer-local variable in this article: the special comment line for **lexical-binding** that binds the buffer locally to **t**. In Emacs, such buffer-local variables defined in special comment lines are also called _file-local variables_.
+
+Any global variable can be shadowed by a buffer-local variable. Take, for example, the **my-var** variable defined above, which you can set locally like this:
+
+
+```
+(setq-local my-var t)
+;; or (set (make-local-variable 'my-var) t)
+```
+
+**my-var** is local to the buffer, which is current when you evaluate the code above. If you call **describe-variable** on it, the documentation tells you both the local value and the global one. Programmatically, you can check the local value using **buffer-local-value** and the default value with **default-value**. To remove the local version, you could invoke **M-x kill-local-variable**.
+
+Another important property to be aware of is that once a variable is buffer-local, any further use of **setq** (while this buffer is current) will continue to set the local value. To set the default value, you would need to use **setq-default**.
+
+Because local variables are meant for buffer customization, they're used most often in mode hooks. A typical example would be something like this:
+
+
+```
+(add-hook 'go-mode-hook
+ (defun go-setup+ ()
+ (setq-local compile-command
+ (if (string-suffix-p "_test.go" buffer-file-name)
+ "go test -v"
+ (format "go run %s"
+ (shell-quote-argument
+ (file-name-nondirectory buffer-file-name)))))))
+```
+
+This sets the compile command used by **M-x compile** for go-mode buffers.
+
+Another important aspect is that some variables are _automatically_ buffer-local. This means as soon as you **setq** such a variable, it sets a local binding for the current buffer. This feature shouldn't be used often (because this implicit behavior isn't nice), but if you want, you can create such automatically local variables like this:
+
+
+```
+(defvar-local my-automatical-local-var t)
+;; or (make-variable-buffer-local 'my-automatical-local-var)
+```
+
+The variable **indent-tabs-mode** is a built-in example of this. If you use **setq** in your init file to change the value of this variable, it won't affect the default value at all. Only the value for the buffer that is current while loading your init file will be changed. Therefore, you need to use **setq-default** to change the default value of **indent-tabs-mode**.
+
+### Closing words
+
+Emacs is a powerful editor, and it only gets more powerful the more you change it to suit your needs. Now you know how Elisp deals with variables and how you can use them in your own scripts and configurations.
+
+* * *
+
+_This previously appeared on [With-Emacs][7] under a CC BY-NC-SA 4.0 license and has been adapted (with a merge request) and republished with the author's permission._
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/variables-emacs
+
+作者:[Clemens Radermacher][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/clemera
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/programming_keyboard_coding.png?itok=E0Vvam7A (Programming keyboard.)
+[2]: https://www.gnu.org/software/emacs/
+[3]: http://sachachua.com/blog/p/27144
+[4]: https://www.gnu.org/software/emacs/download.html
+[5]: https://www.gnu.org/software/emacs/manual/html_node/elisp/
+[6]: https://github.com/jwiegley/use-package#customizing-variables
+[7]: https://with-emacs.com/posts/tutorials/almost-all-you-need-to-know-about-variables/
diff --git a/sources/tech/20200313 How to set up the Raspberry Pi Zero for travel.md b/sources/tech/20200313 How to set up the Raspberry Pi Zero for travel.md
new file mode 100644
index 0000000000..5b6ca689d7
--- /dev/null
+++ b/sources/tech/20200313 How to set up the Raspberry Pi Zero for travel.md
@@ -0,0 +1,472 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How to set up the Raspberry Pi Zero for travel)
+[#]: via: (https://opensource.com/article/20/3/raspberry-pi-zero)
+[#]: author: (Peter Garner https://opensource.com/users/petergarner)
+
+How to set up the Raspberry Pi Zero for travel
+======
+You don't have to invest large amounts of money to build a relatively
+powerful system that can be taken on the road and used productively.
+![Airplane flying with a globe background][1]
+
+For some time now, I've been a huge fan of the [Raspberry Pi][2] computer in all of its various forms. I have a number of them, and each has a server role to play. Most of the time, they work extremely well, and I'm safe in the knowledge that the small amount of power they consume is keeping the bills down.
+
+If you've read my blog before, you may have read my account of how I [migrated my desktop computing][3] to a Pi 3. This worked well for quite a while, but I finally had to accept that editing large graphics and multimedia files was a problem, so I replaced it with an [Intel NUC][4]. My hankering for Pi experimentation was still there, though, and I decided to do a "what-if" exercise and see if it could survive on the road. And that's when I dragged my Pi Zero out of retirement from my spares box.
+
+### Why travel with a Raspberry Pi
+
+_"Why would I want to do this? Surely the trend is to travel with as powerful a device as possible?"_
+
+Well, it's like this. Last year, my employer issued a decree that in order to conform to its security policy, we would no longer be able to check laptops in as luggage, and not long after, the US government decided to summarily ban carrying laptops in hand baggage to and from certain countries, y'know, for security. So how do we get around that one? The sensible option would be to not travel with a laptop and use a hot-desk style spare at the destination. After all, everything is in the cloud now, right? Or, you could carry your important, commercially sensitive data on a CD/DVD or memory stick, but only if it's encrypted to a standard and your employer's data handling policy allows that.
+
+The problem is multi-faceted though: What if your role is such that you need to be able to fix software/systems on-the-go and you don't always have access to a "spare" laptop? On the occasions when I travel (by train), I have to lug my laptop with me, and it's a pain over the course of a day. Then there's the loss/theft/damage problem. Laptops can be easy targets, they can get left on trains, or you could be mugged. Or there's the "[evil maid][5]" scenario, in which someone interferes with your device without your knowledge. The list goes on.
+
+So, here's what you can get with a Pi Zero portable computer:
+
+ * It's small enough to fit in hand baggage or your pocket.
+ * It's cheap enough at $8 to buy another if yours gets lost/stolen/damaged.
+ * The entire OS and data are held on a "disk" that is as small as a fingernail, is cheap, and is easily bought in a wide variety of retail outlets. If need be, you can create a new one from a borrowed card from a phone.
+ * A full development environment with the ability to work offline or online. It can also act as an SSH server so that more than one person can use it at once.
+ * Safe storage: If you are paranoid or traveling on certain airlines, you can remove the "disk" and store it in your wallet or on your person. If your computer is stolen in transit, go and buy another one off the shelf: you're already set up with the OS.
+ * Network-tolerant: Around the world, there are country-specific WiFi frequencies, and a simple text-file change enables you to be compliant within minutes.
+ * Keyboard independent: You can use a compliant Bluetooth keyboard, but when you need to do something more demanding, you can just plug any USB keyboard into the spare USB connector using an On-The-Go cable.
+ * Power supply tolerant: My 3300mAh power bank can run the Pi Zero for about eight hours, but if all else fails, you can use a TV's USB connector to power it. Generally speaking, if a TV has HDMI, it will also have a USB socket, and the Zero only draws about 120mA. Or use someone's phone charger!
+ * Finally, if you're unfortunate enough to lose/damage your "disk," you can easily create another by downloading your 2GB image from a secure location in the cloud and burning it to a new card. Try doing _that_ with a normal laptop.
+
+
+
+That's motivation enough for me!
+
+Here is my finished product, with a beer coaster for scale.
+
+![Pi Zero W setup][6]
+
+### How I set up the Pi Zero for travel
+
+The cheap-as-chips Pi Zero has always been a bit of an odd beast, in my opinion. It features a single-core CPU and has a frugal 512MB of memory, some of which it has to share with the onboard video. The Raspbian OS currently based on Debian Stretch is touted as being suitable for the Zero with the LXDE-based "Pixel" GUI desktop, and indeed it can be loaded and started—but in reality, the poor thing really struggles to manage a GUI _and_ run useful software.
+
+Nevertheless, I was determined to give it a good try and set it up with the apps that have the smallest memory footprint. I'd already been around this loop with the Pi 3, so it was more of the same—only even more so! Bearing in mind this was to be a road warrior's computer, here's what I wanted to have on it:
+
+Web browser | Lightweight but with privacy in mind
+---|---
+Email | IMAP-capable and seamlessly supporting GPG
+XMPP/Jabber client | No-nonsense messaging
+VPN client | I'm on the road, remember
+Tor client | Always useful...
+Music | I carry a few MP3s, but internet radio is cool, too
+Multiple desktops | Useful with a small screen
+Editor/IDE | Hey, it's a working computer!
+FTP/SFTP client | Hey, it's a working computer!
+
+All in all, it's a very useful bundle for my purposes, and if I achieve a balanced environment, it could actually work.
+
+### Hardware
+
+The hardware was a bit of a challenge. The battery was not a problem, as I have a variety of rechargeable power packs with varying capacity, so it is really just a question of picking a suitable one for the day. The only prerequisite was that the battery should be able to take a charge while being used, and all my Jackery brand batteries do this.
+
+For my "disk," I opted for my in-house standard 32GB SanDisk Extreme microSDHC. They're very reliable, and the size is big enough to hold a lot of software and data while still remaining affordable.
+
+The video output would, I anticipated, be HDMI-out using the Zero's mini-HDMI connector. This suited my purposes well, as the majority of hotel TVs use this interface. Audio would also go via HDMI.
+
+That left the human interface devices (HID), and this, predictably, caused the most consternation. I hate Bluetooth with a passion, and with the Zero's limited connectors, I'd have to bite the bullet and use a Bluetooth keyboard and mouse, preferably a combined one—and small. There's no point in having a tiny computer if you have lug a great honking keyboard around as well, so my unhappy quest began.
+
+### Bluetooth woes
+
+The Zero has a limited number of USB connectors on board—just one, if you allow for the power connector, which obviously means you have limited connection options. You could always use a USB extender hub, but then that's more to carry—including another power supply. That basically leaves you trying to connect a keyboard and mouse via Bluetooth. I don't believe the hype about how it can "_easily connect a wide variety of devices together,_" and I wrestle with a variety of allegedly standard devices trying to get the bloody things to play nicely together. Part of the problem with the Pi (I think) is that there's some unintended interaction between WiFi and Bluetooth that causes weird stuff to happen. My problem was that I was able to connect to the Pi using a keyboard _or_ a mouse, but not both reliably at the same time. And yes, I have a variety of allegedly standards-following Bluetooth devices, none of which decided to work together properly.
+
+At this point, I was wondering if there was a Bluetooth Samaritan's Helpline, but there wasn't, so what the heck was I going to do?! Temporarily, I resorted to using an Apple USB keyboard with two USB sockets; this was useful for setup but not for being on the road. In the end, I spent hours browsing eBay and Amazon, and then I found it: a "_3- in-1 Mini Wireless Bluetooth Keyboard Mouse Touchpad For Windows iOS Android UK - Backlit, Ultra-thin, Built-in Rechargeable Battery, QWERTY_." Perfect on paper, but would it work? I sent off the money, and four days later, a slim package arrived from China. And it bloody well worked!! First time, every time, it got on with the Pi like pie and chips. I promptly ordered another one—accidents happen, and I wouldn't want to be left in the lurch.
+
+So, with my hardware lineup complete, I could settle down to setting up the Pi proper.
+
+### The GUI and the Pi
+
+Going back to my software requirements, I thought long and hard about the smallest desktop environment and went with the supplied LXDE desktop, which I'd used several times on other projects. Although the Pi struggled a bit with screen handling, it generally performed well, and I started setting up my software.
+
+Web browser 1
+
+Midori: a good compromise between size and modernity. Supports private browsing and is bundled with the Pi
+
+Web browser 2
+
+Links2 in graphic mode: lightweight, fast, secure, works with proxies
+
+Email
+
+Sylpheed: small, light, and works well with GPG
+
+XMPP/Jabber client
+
+Profanity. It's great!
+
+VPN client
+
+OpenVPN
+
+Tor client
+
+Ha! Links2 again
+
+Music
+
+SMPlayer: the GUI for MPlayer
+
+Editor/IDE
+
+Geany: small and light but powerful
+
+Image viewer/editor
+
+Pinta
+
+FTP/SFTP client
+
+Filezilla
+
+**Other stuff:**
+
+Midnight Commander
+
+Not just a file manager (more later)
+
+Tor proxy server
+
+Always on, so I can use Tor as needed
+
+Nmap
+
+I sometimes need to test stuff
+
+vnStat
+
+Monitor data usage on the wlan0 interface
+
+SSH/SFTP server
+
+Standard issue on this distro
+
+UFW
+
+Firewall; can't be too careful!
+
+Gopher client
+
+Gopherspace! It's still out there, and I use the _original_ Gopher client!
+
+All of the above are tried, tested, and very stable packages. The web browser decision was a calculated one: the Zero doesn't _really_ have what it takes to negotiate a modern ~~bloated, ad-ridden~~ website, and honestly, I have a phone that can handle that sort of thing. Likewise, the decision to run a Tor proxy: it's very handy to be able to access Marianas Web, and using Links2 as a browser means that the risk is minimal.
+
+Sylpheed is a mature package that I believe has largely been replaced by Claws but is actually less demanding of resources. GPG integrated seamlessly with it, and I was able to exchange signed/encrypted messages with ease. It renders both plain-text and HTML messages well, and the interface is uncluttered.
+
+I needed a _simple_ XMPP/Jabber client. The problem I've found with many apps of this type is that they try to incorporate multiple messaging standards when I only really need XMPP. Profanity is ideal as it does one job and does it very well.
+
+### System setup
+
+I spent a considerable amount of time setting up the OS for the best performance; a task made easier because I have set up numerous Raspberry Pis before. In such a small (as in memory) system, the decision to use a swap file was not taken lightly, and unfortunately, using a GUI desktop meant that the swap is in frequent use. The alternative is to not have one and hope that the system doesn't freeze up too much. I went with the suggested default of 100MB.
+
+I then looked at logging. As this was supposed to be a small, portable system, I didn't see much point in having extensive logging, especially as it would have a negative effect on the SDHC card in the long term. One solution was a combination of disabling logging in apps wherever possible and sacrificing a little memory to create a tmpfs in-memory filesystem. This would have the added advantage that it would be recreated on each boot. So, I worked out that 8MB could be used for this and duly updated **/etc/fstab**. This works extremely well.
+
+
+```
+`tmpfs /var/log tmpfs defaults,noatime,nosuid,mode=0755,size=8m 0 0`
+```
+
+I also had to update **/etc/rc.local** to provide some essential directories on startup; this kept the rsyslog and Tor daemons happy.
+
+
+```
+mkdir -p /var/log/rsyslog
+mkdir -p /var/log/tor/
+mkdir -p /var/log/vnstat/
+chown vnstat.root /var/log/vnstat/
+chown debian-tor /var/log/tor/
+```
+
+With all that in place, the little computer was almost ready for Prime Time. But there was a problem. I've already mentioned the frugal amount of memory on the Zero, and even with the GUI and apps pared down to the bone, I was regularly using swap space. To make matters worse, much worse, my carefully set up desktop menus were having problems.
+
+The Pi desktop comes with an _incredible_ amount of software installed, mainly to satisfy its original purpose as an educational machine. I decided early on to edit the menus to remove a lot of the "junk" and replace it with my list of apps, so I fired up the Main Menu Editor app. Normally this is quite responsive, but on the resource-challenged Zero, it had worrying lags and pauses as I made changes. Ultimately, it meant that my ad-hoc menus were corrupted, and worse still, the default Pi menus had been reinstated. Searching for help with this problem revealed that the menu system is convoluted, and if an update is not saved properly, the defaults will be substituted.
+
+I looked at the structure of the menus as best I could and decided that trying to pick the frigging things apart was more trouble than it was worth. So, I ditched LXDE/Pixel and installed XFCE (and its even lighter-weight GUI) in its place. This time, the menu editor seemed more stable, but as I made the changes, I realized that yes, it was happening again. At that point, I had a tantrum and threw my toys out of the pram. I'd reached a crossroads in my road-warrior setup: it worked very well apart from the menus, and I felt I couldn't go back after all that work, so, with a heavy heart, I had a drastic rethink. It was supposed to be a hacker's machine, right? It was Linux and, to many like-minded people, that meant a text-based interface, right?
+
+So I did what I had to do: I ditched the accursed GUI! Yes, go back to the '90s, maybe even earlier, and Run it Like a Boss.™ The main problem I had in my mind was that I'd no longer have nice, safe, icon-driven apps and multiple desktops to work with. My WiFi/network switcher would be no more, and worse still, I'd have to try and manage Bluetooth from the command line. That was going to be a major challenge, but I decided to proceed anyway, and I had a cloned copy of my microSDHC just in case I lost my nerve.
+
+### Set it up again
+
+Incidentally, if I were using a full-spec Raspberry Pi 3, I wouldn't have been in this situation. But it was my choice, so… This exercise started out well. I was already rebooting into the terminal login prompt, and the Bluetooth keyboard was working, so I was able to log in (previously, I'd run **startx** to get to the desktop). Since I no longer had the desktop bloat to worry about, my memory usage was a mere 78MB and no swap usage; I felt better already. But what about the apps that make life easy? I did more hunting around, and here's what I came up with.
+
+Web browser
+
+Links2 _not_ in graphic mode: lightweight, fast, secure, works with proxies
+
+Email
+
+(Neo)Mutt: powerful, extensible and works well with GPG
+
+XMPP/Jabber client
+
+Profanity. It's great!
+
+VPN client
+
+OpenVPN
+
+Tor client
+
+Ha! Links2 again
+
+Music
+
+Midnight Commander + mpg123
+
+Editor/IDE
+
+Nano: I'm using it to write this
+
+FTP/SFTP client
+
+Midnight Commander
+
+File manager
+
+Midnight Commander
+
+**Other stuff**
+
+Tor proxy server
+
+Always on, so I can use Tor as needed
+
+Nmap
+
+I sometimes need to test stuff
+
+vnStat
+
+Monitor data usage on the wlan0 interface
+
+SSH/SFTP server
+
+Standard issue on this distro
+
+Gopher client
+
+Gopherspace! It's still out there, and I use the _original_ Gopher client!
+
+**Graphics workarounds**
+
+fbcat
+
+Takes a screenshot using the framebuffer device
+
+fbi
+
+Linux framebuffer imageviewer: displays images in a terminal
+
+fbgs
+
+Displays PostScript/PDF files using the Linux framebuffer device on a terminal
+
+pnmtopng
+
+Converts a PPM into a PNG file
+
+You'll notice that there's not too much change there, with a few notable exceptions to display graphical content.
+
+### Do it again, and do it properly
+
+Things looked good, but I still had some issues to solve.
+
+#### Desktops
+
+"But what about the multiple desktops?!" I hear you asking, "How will you view images or connect to WiFi networks?" I needed to find a solution, and fast. For the multiple desktop thing, I decided to install tmux, the Linux Terminal Multiplexer. There are so many good reasons to run tmux on a Linux system, but my key reasons are that it makes multi-screen working possible, and it uses very little memory. It also enables me to connect to the Pi via SSH and take over the session, as you can see below.
+
+![tmux running on Raspberry Pi][7]
+
+#### Music
+
+I must say that it's very important to me to be able to listen to music while I'm working or relaxing, so the loss of (S)MPlayer was a major blow. I was able to listen to single MP3s or complete playlists. I was able to stream internet radio. Sigh. Midnight Commander came to the rescue with its ability to handle various file types. The secret is in the Extension File menu, which looks like this for me:
+
+
+```
+shell/i/.mp3
+ Open=/usr/lib/mc/ext.d/sound.sh open mp3
+regex/i/\\.(m3u|pls)$
+ Open=/usr/lib/mc/ext.d/sound.sh open playlist
+```
+
+And my sound.sh looks like this:
+
+
+```
+#!/bin/bash
+do_open_action() {
+ filetype=$1
+ case "${filetype}" in
+ playlist)
+ mpg123 -C -@ "${MC_EXT_FILENAME}"
+ ;;
+ m3u)
+ mpg123 -C -@ "${MC_EXT_FILENAME}"
+ ;;
+ mp3)
+ mpg123 -C "${MC_EXT_FILENAME}"
+ ;;
+ *)
+ ;;
+ esac
+ }
+case "${action}" in
+open)
+ ("${MC_XDG_OPEN}" "${MC_EXT_FILENAME}" >/dev/null 2>&1) || \
+ do_open_action "${filetype}"
+ ;;
+*)
+ ;;
+esac
+```
+
+Tapping Enter on an MP3 will play the file, or tapping on an M3U playlist will play whatever's in the playlist. I used the **-C** option so that I could have access to mpg123's controls. Sorted!
+
+#### SFTP/FTP clients
+
+Midnight Commander again! You can set up a client connection entry with the built-in menu and use **CTL+\** to select it from a drop-down. The FTP site is rendered in one of the panels as a directory structure, and you can just treat it as you would a local filesystem. SFTP is a bit harder, as you have to set it up as an SSH connection and then copy as required; it's OK if you have password authentication, but for public key authentication, I found it less involved to use SFTP from the command line. For reference, this is the syntax:
+
+
+```
+sftp://[user@]machine:[port]/[remote-dir]
+
+The user, port and remote-dir elements are optional.
+```
+
+![MC FTP client example][8]
+
+#### WiFi selector
+
+In the GUI world, I had had a nice, icon-based WiFi network manager app that I could use to switch between networks. The text-mode alternative is the bizarrely named wicd-curses*.* It's an app that communicates with wicd (wireless control daemon) using cursor keys, and it works very well. I had to disable the dhcpcd service using systemctl to get it to work, but at least it lets me select the appropriate network, including my home network or my phone's wireless hotspot when I'm out on the road. Here's [how to do it][9].
+
+![wicd-curses WiFi app][10]
+
+#### Email and web browsing
+
+For email and web browsing, I use Mutt (Neomutt) and Links2, respectively, and they just work.
+
+#### Gopher
+
+Trust me; you're not old enough to remember Gopher, the text mode forerunner of the WWW. Strictly speaking, it was before my time as well, but I run a thriving Gopher server, so I need a client. Here's what a Gopher server looks like running on a Raspberry Pi.
+
+
+```
+ gopher://gopher.petergarner.net:70
+
+__/\\\\\\\\\\\\\\\\\\_______/\\\\\\\\\\\\\\\\\\\\\\\\\\__________________/\\\\\\____
+_/\\\\\///////\\\\\\____\/\\\\\/////////\\\\\\______________/\\\\\\\\\\____
+_\/\\\\\\_____\/\\\\\\___\/\\\\\\_______\/\\\\\\__/\\\\\\_______/\\\\\/\\\\\\____
+_\/\\\\\\\\\\\\\\\\\\\\\/____\/\\\\\\\\\\\\\\\\\\\\\\\\\/___\///______/\\\\\/\/\\\\\\____
+_\/\\\\\//////\\\\\\____\/\\\\\/////////_____/\\\\\\_____/\\\\\/__\/\\\\\\____
+_\/\\\\\\____\//\\\\\\___\/\\\\\\_____________\/\\\\\\____/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\_
+_\/\\\\\\_____\//\\\\\\__\/\\\\\\_____________\/\\\\\\\\__///////////\\\\\//__
+_\/\\\\\\______\//\\\\\\_\/\\\\\\_____________\/\\\\\\_______________\/\\\\\\___
+_\///________\///__\///______________\///_________________\///___
+
+ Welcome to... "The Rpi4 Gopher"
+ ... your source for local information, and beyond!
+
+ --> [14] About this server (and legal)/
+
+ -- Content
+
+ [18] Tech-related/
+ [19] Politics and Propaganda (from all sides)/
+ [20] Cyber and Internet related/
+ [21] Stuff (filed under "miscellany")/
+.....
+```
+
+### Performance
+
+Overall, I'm pleased to say that my switch to text mode has been very beneficial with userland tasks handled responsively. As you can see from a typical **top** display, there's plenty of available and cached memory remaining from the original 512MB. Right now, I'm listening to a playlist, writing this article in an SSH-connected tmux session, running top**,** and Mutt is handling emails.
+
+On a regular basis, that's all I'll probably need to do, but it's great to have the option to develop and test software on the go, if I need to. Here's a simple Python script to get the Pi's CPU serial number (type):
+
+
+```
+>>> #!/usr/bin/env python
+...
+>>> import subprocess
+>>>
+>>> def GetCPUserial():
+... cpuinfo = subprocess.check_output(["/bin/cat", "/proc/cpuinfo"])
+... cpuinfo = cpuinfo.replace("\t","")
+... cpuinfo = cpuinfo.split("\n")
+... [ legend, cpuserial ] = cpuinfo[11].split(' ')
+... return cpuserial
+...
+>>> print GetCPUserial()
+9000c1
+>>>
+
+[/code] [code]
+
+top - 15:55:47 up 5:49, 6 users, load average: 0.21, 0.25, 0.34
+Tasks: 112 total, 1 running, 110 sleeping, 1 stopped, 0 zombie
+%Cpu(s): 3.9 us, 5.8 sy, 0.0 ni, 90.3 id, 0.0 wa, 0.0 hi, 0.0 si,
+
+KiB Mem : 493252 total, 37984 free, 73248 used, 382020 buff/cache
+KiB Swap: 102396 total, 102392 free, 4 used. 367336 avail Mem
+```
+
+I take regular backups, of course, using the indispensable [rpi-clone][11]. The beauty of this app is that I can copy the entire microSDHC card to another while the Pi is running. It also has the advantage that if I use a smaller capacity card, it will automatically and safely take this into account. I use a 32GB card, but I can dump it to an 8GB card because I'm only using about 4GB. The converse is true for a larger destination card. If you add only one utility to your Pi, this should be it—it's saved me more grief than _anything_ I've ever used! You can also use it to create distribution copies of your system.
+
+#### Battery life
+
+I can only describe the battery life as "impressive." Once the Zero is booted up, it takes an average 0.15A / 0.65W with the following running:
+
+ * System
+ * Bluetooth
+ * WiFi
+ * Audio (HDMI) subsystem
+ * Video (HDMI) subsystem
+
+
+
+I've measured 20 hours of mixed usage from my 6000mAh Jackery Jetpack power bank, and if I disable WiFi and just use it in "local" mode, possibly more. It's certainly practical to use it with my smaller, 3300mAh Anker battery, which unfortunately isn't rechargeable while in use. I also have a 20,000mAh battery for long trips: I have yet to try that out.
+
+### Taking it on the road
+
+In terms of computing as a challenge, setting up the Zero has been a really valuable exercise. It's taught me to become acquainted with the operating system and app software at a low level in order to squeeze the maximum amount of memory from the system. It's also taught me that I don't have to invest large amounts of money to build a relatively powerful system that can be taken on the road and used productively.
+
+Now that I've almost finished setting it up, it's time to actually _take_ it on the road and see how it runs in the field. Hey, maybe I'll actually take into a field and see if I can do some work and listen to music.
+
+* * *
+
+_This was originally published on [Peter Garner's blog][12] under a CC BY-NC-ND 4.0 license and is reused here with the author's permission._
+
+Having recently co-authored a book about building things with the Raspberry Pi ( Raspberry Pi Hacks...
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/raspberry-pi-zero
+
+作者:[Peter Garner][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/petergarner
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/plane_travel_world_international.png?itok=jG3sYPty (Airplane flying with a globe background)
+[2]: https://opensource.com/resources/raspberry-pi
+[3]: https://www.petergarner.net/projects/Mac_Mini_to_rpi-part_1.pdf
+[4]: https://en.wikipedia.org/wiki/Next_Unit_of_Computing
+[5]: http://threatbrief.com/evil-maid-attack/
+[6]: https://opensource.com/sites/default/files/uploads/pi-zero-on-the-road.jpg (Pi Zero W setup)
+[7]: https://opensource.com/sites/default/files/uploads/tmux-on-pi.png (tmux running on Raspberry Pi)
+[8]: https://opensource.com/sites/default/files/uploads/ftp-client-mc.png (MC FTP client example)
+[9]: https://www.raspberrypi.org/forums/viewtopic.php?t=150124#p987430
+[10]: https://opensource.com/sites/default/files/uploads/wifi-selector.png (wicd-curses WiFi app)
+[11]: https://github.com/billw2/rpi-clone
+[12]: https://petergarner.net/notes/index.php?thisnote=20180202-Travels%20with%20a%20Pi
diff --git a/sources/tech/20200313 How to whiteboard collaboratively with Drawpile.md b/sources/tech/20200313 How to whiteboard collaboratively with Drawpile.md
new file mode 100644
index 0000000000..dba4bce1f8
--- /dev/null
+++ b/sources/tech/20200313 How to whiteboard collaboratively with Drawpile.md
@@ -0,0 +1,118 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How to whiteboard collaboratively with Drawpile)
+[#]: via: (https://opensource.com/article/20/3/drawpile)
+[#]: author: (Seth Kenlon https://opensource.com/users/seth)
+
+How to whiteboard collaboratively with Drawpile
+======
+Need to whiteboard or draw something with others? Give Drawpile a try.
+![markers for a whiteboard][1]
+
+Thanks to applications like [Krita][2] and [MyPaint][3], open source software users have all the tools they need to create stunning digital paintings. They are so good that you can see [art created with Krita][4] in some of your [favorite RPG books][5]. And it's getting better all the time; for example, [GIMP][6] 2.10 adopted MyPaint's brush engine, so users can benefit from MyPaint without even installing the whole application.
+
+But what about collaborative illustration? What do two or more artists do when they want to work together on one piece? What does your work team use when you need to whiteboard during a business meeting? Those are the questions, and the answer is [Drawpile][7].
+
+![Drawpile's UI][8]
+
+Nyarlathotep by Sophia Eberhard
+
+Drawpile is a drawing application for Linux, Windows, and macOS. It's got a respectable brush engine and all the basic editorial tools (selection tools, flips and flops, mirror, and so on) to make it a good freehand digital paint application. But its most powerful feature is its easy multi-user mode. If you have Drawpile installed, you can host a drawing session from your computer or on a Drawpile server, allowing other users to join you in your virtual studio. This goes well beyond a screen-share session, which would just allow other users to _view_ your painting, and it's not a remote desktop with just one cursor. Drawpile enables several users, each with their own brush, to work on the same canvas at the same time over a network that can span the globe.
+
+### Installing Drawpile
+
+If you're using Linux, Drawpile is available as a [Flatpak][9] from [Flathub.org][10].
+
+On Windows and macOS, download and install Drawpile from [Drawpile's download page][11]. When you first launch it on macOS, you must right-click on its icon and select **Open** to accept that it hasn't been signed by a registered Apple developer.
+
+### Drawing with Drawpile
+
+The Drawpile interface is simple and minimal. Along the right side of the application window are docked palettes, and along the top is a toolbar. Most of the tools available to you are visible: paint brushes, paint buckets, lines, Bézier curves, and so on.
+
+For quick access to brushes, Drawpile allows you to assign a unique brush, along with all of its settings (including color), to the number keys **1** through **5** on your keyboard. It's an efficient and easy way to quickly move between drawing tools. The **6** key holds an eraser.
+
+Drawpile also has layers, so you can keep different parts of your painting separate until you combine them for your final render. If you're an animator, you can even use Drawpile's onion skin and flipbook features (both available in the **Layer** menu) to do rudimentary frame-by-frame animation. Unlike Krita, Drawpile doesn't feature an [animation timeline][12], but it's enough for quick and fun animations.
+
+### Custom brushes
+
+Drawpile isn't Krita or MyPaint, so its brush engine is simple in comparison. The preset brushes have the usual properties, though, including:
+
+ * **Opacity** adjusts how your strokes blend with existing paint
+ * **Hardness** defines the edges of your stroke
+ * **Smudging** allows existing strokes to be affected by your brush
+ * **Color pickup** allows your paint to pick up color from existing strokes
+ * **Spacing** controls how often the full brush cursor is sampled during a stroke
+
+
+
+Most of these are pressure-sensitive, so if you're using a drawing tablet (Wacom, for instance), then your brush strokes are dynamic depending upon pen pressure. The tablet support is borrowed from Krita, and it makes a big difference (although it's probably overkill for mock-ups or whiteboarding sessions).
+
+When you find a brush setting you like, you can add it to your brush set so you can use it again later. To add a brush, click the **Menu** button in the top-right corner of the docked **Brushes** palette and select **Add brush**.
+
+![Adding a brush in Drawpile][13]
+
+If the **Brushes** palette isn't visible, go to the **View** menu in the top menu bar and select **Brushes** from the **Docks** submenu.
+
+### Collaborative drawing
+
+To participate in a shared drawing session, go to the **Session** menu and click either **Host** to host a session or **Join** to join in on an existing one.
+
+#### Hosting a session
+
+If you're hosting a session, give your session a title and an optional password (or leave it blank to allow anyone in). In the **Server** section, set whether you're hosting the session from your computer or from someone else's server. You can host sessions on **pub.drawpile.net** for free, but all of your data will be sent out to the internet, which could affect performance. If you have a good internet connection, the lag is negligible, but if you're not confident in your internet speed or there's no reason to go out to the internet because your collaborators are in the same building as you, then you can host your session locally.
+
+![Settings for hosting a session][14]
+
+If you host locally, you must provide your IP address or computer name (ending in **.local**) to your collaborators so their Drawpile apps can find your computer. You can find your computer name in the **Sharing** preferences of the GNOME desktop if you're on Linux:
+
+![Sharing Drawpile in GNOME][15]
+
+You must enable Remote Login, and possibly adjust your [firewall settings][16] to allow other users to get through.
+
+On macOS and Windows, you may be running a firewall, and you may need to provide additional sharing permissions in your control panel or system settings.
+
+#### Joining a session
+
+If you're joining a session, you need to know either the URL or the IP address of the session you're trying to join. A URL is like a website address, such as syntheticdreams.net/listing. An IP address is the numerical version of a URL, such as 93.184.216.34. Some IP addresses are internal to your building, while others exist out on the internet. If you haven't been invited to a drawing session, you might be able to find a public group on Drawpile's [Communities][17] page.
+
+### Drawing with friends
+
+Open source has always been about sharing. Drawpile is not only software you can share with your friends and colleagues; it's software that allows you to work with them in a fun and creative way. Try Drawpile for your next project or boardroom meeting!
+
+Nick Hamilton talks about what he loves about the open source digital painting tool, Krita, prior...
+
+Akkana Peck shares three of her favorite GIMP tools.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/drawpile
+
+作者:[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/sites/default/files/styles/image-full-size/public/lead-images/markers_whiteboard_draw.png?itok=hp6v1gHC (markers for a whiteboard)
+[2]: https://krita.org/en/
+[3]: http://mypaint.org
+[4]: https://krita.org/en/item/interview-with-alexandru-sabo/
+[5]: https://paizo.com/products/btpy9g9x?Pathfinder-Roleplaying-Game-Bestiary-5
+[6]: https://www.gimp.org/
+[7]: https://drawpile.net
+[8]: https://opensource.com/sites/default/files/uploads/drawpile-ui.jpg (Drawpile's UI)
+[9]: https://opensource.com/article/19/10/how-build-flatpak-packaging
+[10]: https://flathub.org/apps/details/net.drawpile.drawpile
+[11]: https://drawpile.net/download/
+[12]: https://opensource.com/life/16/10/animation-krita
+[13]: https://opensource.com/sites/default/files/uploads/drawpile-brush-add.jpg (Adding a brush in Drawpile)
+[14]: https://opensource.com/sites/default/files/uploads/drawpile-session-host.png (Settings for hosting a session)
+[15]: https://opensource.com/sites/default/files/uploads/gnome-sharing.png (Sharing Drawpile in GNOME)
+[16]: https://opensource.com/article/19/7/make-linux-stronger-firewalls
+[17]: https://drawpile.net/communities
diff --git a/sources/tech/20200313 Open source alternative for multi-factor authentication- privacyIDEA.md b/sources/tech/20200313 Open source alternative for multi-factor authentication- privacyIDEA.md
new file mode 100644
index 0000000000..382aa368e5
--- /dev/null
+++ b/sources/tech/20200313 Open source alternative for multi-factor authentication- privacyIDEA.md
@@ -0,0 +1,85 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Open source alternative for multi-factor authentication: privacyIDEA)
+[#]: via: (https://opensource.com/article/20/3/open-source-multi-factor-authentication)
+[#]: author: (Cornelius Kölbel https://opensource.com/users/cornelius-k%C3%B6lbel)
+
+Open source alternative for multi-factor authentication: privacyIDEA
+======
+As technology changes, so too will our need to adapt our authentication
+mechanisms.
+![Three closed doors][1]
+
+Two-factor authentication, or multi-factor authentication, is not a topic only for nerds anymore. Many services on the internet provide it, and many end-users demand it. While the average end-user might only realize that his preferred web site either offers MFA or it does not, there is more to it behind the scene.
+
+The two-factor market is changing, and changing rapidly. New authentication methods arise, classical vendors are merging, and products have disappeared.
+
+The end-user might not be bothered at all, but organizations and companies who want to require multi-factor authentication for their users may wonder where to turn to and which horse to bet on.
+
+Companies like Secure Computing, Aladdin, SafeNet, Cryptocard, Gemalto, and Thales have been providing authentication solutions for organizations for some decades and have been involved in a round dance of [mergers and acquisitions][2] during the last ten years. And the user was the one who suffered. While the IT department thought it was rolling out a reliable software of a successful vendor, a few years later, they were confronted with the product being end-of-life.
+
+### How the cloud changes things
+
+In 1986, RSA released RSA SecurID, a physical hardware token displaying magic numbers based on an unknown, proprietary algorithm. But, almost 20 years later, thanks to the Open Authentication Initiative, HOTP (RFC4226) and TOTP (RFC6238) were specified—originally for OTP hardware tokens.
+
+SMS Passcode, which specialized in authenticating by sending text messages, was founded in 2005; no hardware token required. While other on-premises solutions kept the authentication server and the enrollment in a confined environment, with SMS Passcode, the authentication information (a secret text message) was transported via the mobile network to the user.
+
+The iPhone 1 was released in 2007, and the Android phone quickly followed. DUO Security was founded in 2009 as a specific cloud MFA provider, with the smartphone acting as a second factor. Both vendors concentrated on a new second factor—the phone with a text message or the smartphone with an app—and they offered and used infrastructure that was not part of the company's network anymore.
+
+Classical on-premises vendors started to move to the cloud, either by offering their new services or acquiring smaller vendors with cloud solutions, such as SafeNet's [acquisition of Cryptocard in 2012][3]. It seemed tempting for classical vendors to offer cloud services—no software updates on-premises, no support cases, unlimited scaling, and unlimited revenue.
+
+Even the old top dog, RSA, now offers a "Cloud Authentication Service." And doesn't it make sense to put authentication services in the cloud? The data is hosted at cloud services like Azure, the identities are hosted in the cloud at Azure AD, so why not put authentication there with Azure MFA? This approach might make sense for companies with a complete cloud-centric approach, but it also probably locks you into one specific vendor.
+
+Cloud seems a big topic also for multi-factor authentication. But what if you want to stay on-prem?
+
+### The state of multi-factor authentication technology
+
+Multi-factor authentication has also come a long way since 1986, when RSA introduced its first OTP tokens. A few decades ago, well-paid consultants made a living by rolling PKI concepts, since smartcard authentication needed a working certificate infrastructure.
+
+After having OTP keyfob tokens and smartphones with HOTP and TOTP apps and even push notification, the current state-of-the-art authentication seems to be FIDO2/WebAuthn. While U2F was specified by the FIDO Alliance alone, WebAuthn was specified by no one else than W3C, and the good news is, the base requirements have been integrated into all browsers except Internet Explorer.
+
+However, applications still need to add a lot of code when supporting Webauthn. But WebAuthn allows for new authentication devices like TPM chips in tablets, computers, and smartphones or cheap and small hardware devices. But U2F also looked good back then, and even it did not make the breakthrough. Will WebAuthn do it?
+
+So these are challenging times since currently, you probably cannot use WebAuthn, but in two years, you'll probably want to. Thus, you need a system that allows you to adapt your authentication mechanisms.
+
+### Getting actual requirements
+
+This is one of the first requirements when you are about to choose a flexible multi-factor authentication solution. It will not work out to solely rely on text messages, or on one single smartphone app or only WebAuthn tokens. The smartphone app may vanish; the WebAuthn devices might not be applicable in all situations.
+
+When looking at the mergers and acquisitions, we learned that it did happen and can happen again; that the software goes end-of-life, or the vendors cease their cloud services. And sometimes it is only the last few months that hurt, when the end of sales means that you cannot buy any new user licenses or onboard any new users! To get a lasting solution, you need to be independent on cloud services and vendor decisions. The safest way to do so is to go for an open source solution.
+
+But when going for an open source solution, you want to get a reliable system, reliable meaning that you can be sure to get updates that do not break and that bugs will be fixed, and there are people to be asked.
+
+### An open source alternative: privacyIDEA
+
+Concentrated experiences in the two-factor market since 2004 have been incorporated into the open source software alternative: [privacyIDEA][4].
+
+privacyIDEA is an open source solution providing a wide variety of different authentication technologies. It started with HOTP and TOTP tokens, but it also supports SMS, email, push notifications, SSH keys, X.509 certificates, Yubikeys, Nitrokeys, U2F, and a lot more. Currently, the support for WebAuthn is added.
+
+The modular structure of the token types (being Python classes) allows new types to be added quickly, making it the most flexible in regards to authentication methods. It runs on-premises at a central location in your network. This way, you stay flexible, have control over your network, and keep pace with the latest developments.
+
+privacyIDEA comes with a mighty and flexible policy framework that allows you to adapt privacyIDEA to your needs. The unique event handler modules enable you to fit privacyIDEA into your existing workflows or create new workflows that work the best for your scenario. It is also plays nice with the others and integrates with identity and authentication solutions like FreeRADIUS, simpleSAMLphp, Keycloak, or Shibboleth. This flexibility may be the reason organizations like the World Wide Web Consortium and companies like Axiad are using privacyIDEA.
+
+privacyIDEA is developed [on GitHub][5] and backed by a Germany-based company providing services and support worldwide.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/open-source-multi-factor-authentication
+
+作者:[Cornelius Kölbel][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/cornelius-k%C3%B6lbel
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/EDU_UnspokenBlockers_1110_A.png?itok=x8A9mqVA (Three closed doors)
+[2]: https://netknights.it/en/consolidation-of-the-market-and-migrations/
+[3]: https://www.infosecurity-magazine.com/news/safenet-acquires-cryptocard/
+[4]: https://privacyidea.org
+[5]: https://github.com/privacyidea/privacyidea
diff --git a/sources/tech/20200314 Adding a display to a travel-ready Raspberry Pi Zero.md b/sources/tech/20200314 Adding a display to a travel-ready Raspberry Pi Zero.md
new file mode 100644
index 0000000000..f8dcb26208
--- /dev/null
+++ b/sources/tech/20200314 Adding a display to a travel-ready Raspberry Pi Zero.md
@@ -0,0 +1,281 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Adding a display to a travel-ready Raspberry Pi Zero)
+[#]: via: (https://opensource.com/article/20/3/pi-zero-display)
+[#]: author: (Peter Garner https://opensource.com/users/petergarner)
+
+Adding a display to a travel-ready Raspberry Pi Zero
+======
+A small eInk display turns a Raspberry Pi into a self-contained,
+pocket-sized travel computer.
+![Pi Zero][1]
+
+In my earlier article, I explained how I [transformed a Raspberry Pi Zero][2] into a minimal, portable, go-anywhere computer system that, although small, can actually achieve useful things. I've since made iterations that have proved interesting and made the little Pi even more useful. Read on to learn what I've done.
+
+### After the road trip
+
+My initial Pi Zero setup [proved its worth][3] on a road trip to Whitby, but afterward, it was largely consigned to the "pending" shelf, waiting for another assignment. It was powered up weekly to apply updates, but other than that, it was idle. Then one day, as I was flicking through emails from various Pi suppliers, I came across a (slightly) reduced e-Ink display offer: hmmm… and there was a version for the Pi Zero as well. What could I do with one?
+
+ModMyPi was selling a rather neat [display and driver board combination][4] and a [small case][5] with a transparent window on top. I read the usual reviews, and apart from one comment about the _boards being a very tight fit_, it sounded positive. I ordered it, and it turned up a few days later. I had noted from the product description that the display board didn't have GPIO headers installed, so I ordered a Pi Zero WH (wireless + headers pre-installed) to save me the bother of soldering one on.
+
+### Some assembly required
+
+As with most of these things, some self-assembly was required, so I carefully opened the boxes and laid out the parts on the desk. The case was nicely made apart from ridiculous slots for a watch strap (?!) and some strange holes in the side to allow tiny fingers to press the five I/O buttons on the display. "_Could I get a top without holes?"_ I inquired on the review page. "_No."_ Okay then.
+
+With the case unpacked, it was time to open the display box. A nicely designed board was first out, and there were clear instructions on the Pi-Supply website. The display was so thin (0.95mm) that I nearly threw it out with the bubble wrap.
+
+The first job was to mount the display board on the Pi Zero. I checked to make sure I could attach the display cable to the driver board when it was joined to the Pi and decided that, with my sausage fingers, I'd attach the display first and leave it flapping in the breeze while I attached the driver board to the Pi. I carefully got the boards lined up on the GPIO pins, and, with those in place, I folded over the display "screen" to sit on top of the board. With the piggy-backed boards in place, I then _verrrry_ carefully shoe-horned the assembly into place in the case. Tight fit? Yeah, you're not kidding, but I got it all safely in place and snapped the top on, and nothing appeared to be broken. Phew!
+
+### How to set up your display
+
+I'm going to skip a chunk of messing about here and refer you to the maker's [instructions][6] instead. Suffice to say that after a few installs, reboots, and coffees, I managed to get a working e-Ink display! Now all I had to do was figure out what to do with it.
+
+One of the main challenges of working with a small device like [my "TravelPi"][2] is that you don't have access to as much screen real estate as you would on a larger machine. I like the size and power of the device though, so it's really a compromise as to what you get out of it. For example, there's a single screen accessible via the HDMI port, and I've used tmux to split that into four separate, usable panes. If I really need to view something else urgently, I could always **Ctrl+Z** into another prompt and do the necessary configs, but that's messy.
+
+I wanted to see various settings and maybe look at some system settings, and the e-Ink display enabled me to do all that! As you can see from the image below, I ended up with a very usable info panel that is updated by a simple(-ish) Python script (**qv**) either manually or by a crontab entry every 10 minutes. The manufacturer states that the update frequency should be "no more than 1Hz if you want your display to last for a long time." Ten minutes is fine, thank you.
+
+Here's what I wanted to be able to see at a glance:
+
+Hostname | And device serial number
+---|---
+IP address | Current internal IP address
+VPN status | Inactive/country/IP address
+Tor status | Inactive/IP address
+"Usage" | Percentage disk space and memory used
+Uptime | So satisfying to see those long uptimes
+
+And here it is: a display that's the same size as the Pi Zero and 1" deep.
+
+![PiZero Display][7]
+
+### How to populate the display
+
+Now I needed to populate the display. As seems to be the norm these days, the e-Ink support software is in Python, which, of course, is installed as standard with most Linux distros. _Disclaimer:_ Python is not my first (dev) language, but the code below works for me. It'll probably work for you, too.
+
+
+```
+#!/usr/bin/env python
+
+import os
+import sys
+import time
+import datetime
+import socket
+import netifaces as ni
+import psutil
+import subprocess
+
+from netifaces import AF_INET, AF_INET6, AF_LINK, AF_PACKET
+from papirus import PapirusText, PapirusTextPos, Papirus
+from subprocess import check_output
+from datetime import timedelta
+
+rot = 0
+screen = Papirus(rotation = rot)
+fbold = '/usr/share/fonts/truetype/dejavu/DejaVuSansMono-Bold.ttf'
+fnorm = '/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf'
+text = PapirusTextPos(rotation = rot)
+
+def GetBootTime():
+ return datetime.datetime.fromtimestamp(psutil.boot_time())
+
+def GetUptime():
+ with open('/proc/uptime','r') as f:
+ uptime_seconds = float(f.readline().split()[0])
+ u = str(timedelta(seconds = uptime_seconds))
+ duration,junk = u.split(".")
+ hr,mi,sc = duration.split(":")
+ return "%sh %sm %ss" % ( hr,mi,sc )
+
+def getHostname():
+ hostname = socket.gethostname()
+ return hostname
+
+def getWiFiIPaddress():
+ try:
+ ni.interfaces()
+ [ 'wlan0', ]
+ return ni.ifaddresses('wlan0')[AF_INET][0]['addr']
+ except:
+ return 'inactive'
+
+def getVPNIPaddress():
+ try:
+ ni.interfaces()
+ [ 'tun0', ]
+ return ni.ifaddresses('tun0')[AF_INET][0]['addr']
+ except:
+ return 'inactive'
+
+def GetTmuxEnv():
+ if 'TMUX_PANE' in os.environ:
+ return ' (t)'
+ return ' '
+
+def GetCPUserial():
+ cpuinfo = subprocess.check_output(["/bin/cat", "/proc/cpuinfo"])
+ cpuinfo = cpuinfo.replace("\t","")
+ cpuinfo = cpuinfo.split("\n")
+ [ legend, cpuserial ] = cpuinfo[12].split(' ')
+ cpuserial = cpuserial.lstrip("0")
+ return cpuserial
+
+def GetMemUsed():
+ memUsed = psutil.virtual_memory()[2]
+ return memUsed
+
+def GetDiskUsed():
+ diskUsed = psutil.disk_usage('/')[3]
+ return diskUsed
+
+def CheckTor():
+ try:
+ TS = "active: pid %s" %check_output(['pidof','tor'])
+ except:
+ TS = 'inactive'
+ return TS
+
+def CheckVPN():
+ return VPNlo
+# ---------------------------------------------------------------------------
+def main():
+ pass
+
+if __name__ == '__main__':
+ main()
+
+VPNlo = 'inactive'
+
+if (len(sys.argv) == 2):
+ try:
+ VPNlo = sys.argv[1]
+ except:
+ VPNlo = 'inactive'
+
+text = PapirusTextPos(False,rotation=rot)
+text.AddText("%s %s %s"% (getHostname(),GetCPUserial(),GetTmuxEnv()),x=1,y=0,size=12,invert=True,fontPath=fbold)
+text.AddText("IP %s" % getWiFiIPaddress(),x=1,y=16,size=12,fontPath=fnorm)
+if ( getVPNIPaddress() == 'inactive' ):
+ text.AddText("VPN %s" % CheckVPN(),x=1,y=30,size=12,fontPath=fnorm)
+else:
+ text.AddText("VPN %s" % getVPNIPaddress(),x=1,y=30,size=12,fontPath=fnorm)
+text.AddText("TOR %s" % CheckTor(),x=1,y=44,size=12,fontPath=fnorm)
+text.AddText("MEM %s% DISK %s% used" % (GetMemUsed(),GetDiskUsed()),x=1,y=58,size=12,fontPath=fnorm,maxLines=1)
+text.AddText("UPTIME %s" % GetUptime(),x=1,y=72,size=12,fontPath=fnorm)
+text.WriteAll()
+
+sys.exit(0)
+```
+
+Normally, the script runs without any arguments and is called by a series of Bash scripts that I've written to start up various subsystems; these are, in turn, called from a menu system written in Whiptail, which is pretty versatile. In the case of the VPN system, I have a list of access points to choose from and that update the location on the display. Initially, I call the display updater with the location name (e.g., Honolulu), but at that point, I can't display the VPN IP address because I don't know it:
+
+
+```
+ dispupdate.py ${accesspoint}
+ openvpn --config $PATH/Privacy-${accesspoint}.conf --auth-user-pass credfile
+```
+
+When the display updater runs again (outside the VPN startup script), the IP address is readable from the **tun0** interface and the display is updated with the IP address. I may change this later, but it works fine now. I use the **PapirusTextPos** function (rather than **PapirusText**), as this allows multiple lines to be written before the display is updated, leading to a much faster write. The **text.WriteAll()** function does the actual update.
+
+### Adding more software
+
+I was very pleased with my initial choice of applications, but since I'd managed to slim the whole installation down to 1.7GB, I had plenty of available space. So, I decided to see if there was anything else that could be useful. Here's what I added:
+
+Irssi | IRC client
+---|---
+FreeBSD games | There are still many text-mode games to enjoy
+nmon | A _very_ comprehensive top-alike utility for all aspects of the system
+Newsbeuter | Text-mode Atom/RSS feed reader
+
+And I still have about 300MB free space to take me up to 2GB, so I may add more.
+
+### We keed to talk about ~~Kevin~~ Bluetooth
+
+Observant readers will remember my hatred for Bluetooth and trying to pair terminal-based software with a Bluetooth device. When I bought a new Pi, I realized that I had to pair the damn thing up with the keyboards again. Oh, woe is me! But a search-engine session and a calming coffee enabled me to actually do it! It goes something like this:
+
+
+```
+sudo su
+bluetoothctl {enter}
+
+[bluetooth]#
+
+[bluetooth]# scan on
+Discovery started
+[CHG] Controller B8:27:EB:XX:XX:XX Discovering: yes
+
+[bluetooth]# agent on
+Agent registered
+[NEW] Device B2:2B:XX:XX:XX:XX Bluetooth Keyboard
+Attempting to pair with B2:2B:XX:XX:XX:XX
+[CHG] Device B2:2B:XX:XX:XX:XX Connected: yes
+[agent] PIN code: 834652
+[CHG] Device B2:2B:XX:XX:XX:XX Modalias: usb:v05ACp0220d0001
+[CHG] Device B2:2B:XX:XX:XX:XX UUIDs: zzzzz
+[CHG] Device B2:2B:XX:XX:XX:XX UUIDs: yyyyy
+[CHG] Device B2:2B:XX:XX:XX:XX ServicesResolved: yes
+[CHG] Device B2:2B:XX:XX:XX:XX Paired: yes
+Pairing successful
+[CHG] Device B2:2B:XX:XX:XX:XX ServicesResolved: no
+[CHG] Device B2:2B:XX:XX:XX:XX Connected: no
+
+[bluetooth]# trust B2:2B:XX:XX:XX:XX
+[CHG] Device B2:2B:XX:XX:XX:XX Trusted: yes
+Changing B2:2B:XX:XX:XX:XX trust succeeded
+[CHG] Device B2:2B:XX:XX:XX:XX RSSI: -53
+
+[bluetooth]# scan off
+[CHG] Device B2:2B:XX:XX:XX:XX RSSI is nil
+Discovery stopped
+[CHG] Controller B8:27:EB:XX:XX:XX Discovering: no
+
+[bluetooth]# exit
+Agent unregistered
+
+$
+```
+
+I was gobsmacked! No, really. I paired my other keyboard and am now considering pairing a speaker, but we'll see. I had a beer that night to celebrate my new-found "l33t" tech skills! Here is an [excellent guide][8] on how to do it.
+
+### One more hardware mod
+
+Until recently, I've been using as large a good-quality microSDHC card as I could afford, and in case of problems, I created a backup copy using the rsync-based rpi-clone. However, after reading various articles on the 'net where people complain about corrupted cards due to power problems, unclean shutdowns, and other mishaps, I decided to invest in a higher-quality card that hopefully will survive all this and more. This is important if you're traveling long distances and _really_ need your software to work at the destination.
+
+After a long search, I found the [ATP Industrial-Grade MicroSD/MicroSDHC][9] cards, which are rated military-spec for demanding applications. That sounded perfect. However, with quality comes a cost, as well as (in this case) limited capacity. In order to keep my wallet happy, I limited myself to an 8GB card, which may not sound like a lot for a working computer, but bearing in mind I have a genuine 5.3GB of that 8GB free, it works just fine. I also have a level of reassurance that bigger but lower-quality cards can't give me, and I can create an ISO of that card that's small enough to email if need be. Result!
+
+### What's next?
+
+The Zero goes from strength to strength, only needing to go out more. I've gone technically about as far as I can for now, and any other changes will be small and incremental.
+
+* * *
+
+_This was originally published on [Peter Garner's blog][10] under a CC BY-NC-ND 4.0 and is reused here with the author's permission._
+
+The new issue of the official Raspberry Pi magazine, The MagPi, comes with a free computer stuck to...
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/pi-zero-display
+
+作者:[Peter Garner][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/petergarner
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/zero-osdc-lead.png?itok=bK70ON2W (Pi Zero)
+[2]: https://opensource.com/article/20/3/raspberry-pi-zero-w-road
+[3]: https://petergarner.net/notes/index.php?thisnote=20180511-Travels+with+a+Pi+%282%29
+[4]: https://www.modmypi.com/raspberry-pi/screens-and-displays/epaper/papirus-zero-epaper--eink-screen-phat-for-pi-zero-medium
+[5]: https://www.modmypi.com/raspberry-pi/cases-183/accessories-1125/watch-straps/pi-supply-papirus-zero-case
+[6]: https://github.com/PiSupply/PaPiRus
+[7]: https://opensource.com/sites/default/files/uploads/pizerodisplay.jpg (PiZero Display)
+[8]: https://www.sigmdel.ca/michel/ha/rpi/bluetooth_01_en.html
+[9]: https://www.digikey.com/en/product-highlight/a/atp/industrial-grade-microsd-microsdhc-cards
+[10]: https://petergarner.net/notes/index.php?thisnote=20190205-Travels+with+a+Pi+%283%29
diff --git a/sources/tech/20200315 Getting started with shaders- signed distance functions.md b/sources/tech/20200315 Getting started with shaders- signed distance functions.md
new file mode 100644
index 0000000000..acba8687fd
--- /dev/null
+++ b/sources/tech/20200315 Getting started with shaders- signed distance functions.md
@@ -0,0 +1,243 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Getting started with shaders: signed distance functions!)
+[#]: via: (https://jvns.ca/blog/2020/03/15/writing-shaders-with-signed-distance-functions/)
+[#]: author: (Julia Evans https://jvns.ca/)
+
+Getting started with shaders: signed distance functions!
+======
+
+Hello! A while back I learned how to make fun shiny spinny things like this using shaders:
+
+![][1]
+
+My shader skills are still extremely basic, but this fun spinning thing turned out to be a lot easier to make than I thought it would be to make (with a lot of copying of code snippets from other people!).
+
+The big idea I learned when doing this was something called “signed distance functions”, which I learned about from a very fun tutorial called [Signed Distance Function tutorial: box & balloon][2].
+
+In this post I’ll go through the steps I used to learn to write a simple shader and try to convince you that shaders are not that hard to get started with!
+
+### examples of more advanced shaders
+
+If you haven’t seen people do really fancy things with shaders, here are a couple:
+
+ 1. this very complicated shader that is like a realistic video of a river:
+ 2. a more abstract (and shorter!) fun shader with a lot of glowing circles:
+
+
+
+### step 1: my first shader
+
+I knew that you could make shaders on shadertoy, and so I went to . They give you a default shader to start with that looks like this:
+
+![][3]
+
+Here’s the code:
+
+```
+void mainImage( out vec4 fragColor, in vec2 fragCoord )
+{
+ // Normalized pixel coordinates (from 0 to 1)
+ vec2 uv = fragCoord/iResolution.xy;
+
+ // Time varying pixel color
+ vec3 col = 0.5 + 0.5*cos(iTime+uv.xyx+vec3(0,2,4));
+
+ // Output to screen
+ fragColor = vec4(col,1.0);
+}
+```
+
+This doesn’t do anythign that exciting, but it already taught me the basic structure of a shader program!
+
+### the idea: map a pair of coordinates (and time) to a colour
+
+The idea here is that you get a pair of coordinates as an input (`fragCoord`) and you need to output a RGBA vector with the colour of that. The function can also use the current time (`iTime`), which is how the picture changes over time.
+
+The neat thing about this programming model (where you map a pair of coordinates and the time to) is that it’s extremely trivially parallelizable. I don’t understand a lot about GPUs but my understanding is that this kind of task (where you have 10000 trivially parallelizable calculations to do at once) is exactly the kind of thing GPUs are good at.
+
+### step 2: iterate faster with `shadertoy-render`
+
+After a while of playing with shadertoy, I got tired of having to click “recompile” on the Shadertoy website every time I saved my shader.
+
+I found a command line tool that will watch a file and update the animation in real time every time I save called [shadertoy-render][4]. So now I can just run:
+
+```
+shadertoy-render.py circle.glsl
+```
+
+and iterate way faster!
+
+### step 3: draw a circle
+
+Next I thought – I’m good at math! I can use some basic trigonometry to draw a bouncing rainbow circle!
+
+I know the equation for a circle (`x**2 + y**2 = whatever`!), so I wrote some code to do that:
+
+![][5]
+
+Here’s the code: (which you can also [see on shadertoy][6])
+
+```
+void mainImage( out vec4 fragColor, in vec2 fragCoord )
+{
+ // Normalized pixel coordinates (from 0 to 1)
+ vec2 uv = fragCoord/iResolution.xy;
+ // Draw a circle whose center depends on what time it is
+ vec2 shifted = uv - vec2((sin(iGlobalTime) + 1)/2, (1 + cos(iGlobalTime)) / 2);
+ if (dot(shifted, shifted) < 0.03) {
+ // Varying pixel colour
+ vec3 col = 0.5 + 0.5*cos(iGlobalTime+uv.xyx+vec3(0,2,4));
+ fragColor = vec4(col,1.0);
+ } else {
+ // make everything outside the circle black
+ fragColor = vec4(0,0,0,1.0);
+ }
+}
+```
+
+This takes the dot product of the coordinate vector `fragCoord` with itself, which is the same as calculating `x^2 + y^2`. I played with the center of the circle a little bit in this one too – I made the center `vec2((sin(iGlobalTime) + 1)/2, (1 + cos(faster)) / 2)`, which means that the center of the circle also goes in a circle depending on what time it is.
+
+### shaders are a fun way to play with math!
+
+One thing I think is fun about this already (even though we haven’t done anything super advanced!) is that these shaders give us a fun visual way to play with math – I used `sin` and `cos` to make something go in a circle, and if you want to get some better intuition about how trigonometric work, maybe writing shaders would be a fun way to do that!
+
+I love that you get instant visual feedback about your math code – if you multiply something by 2, things get bigger! or smaller! or faster! or slower! or more red!
+
+### but how do we do something really fancy?
+
+This bouncing circle is nice but it’s really far from the super fancy things I’ve seen other people do with shaders. So what’s the next step?
+
+### idea: instead of using if statements, use signed distance functions!
+
+In my circle code above, I basically wrote:
+
+```
+if (dot(uv, uv) < 0.03) {
+ // code for inside the circle
+} else {
+ // code for outside the circle
+}
+```
+
+But the problem with this (and the reason I was feeling stuck) is that it’s not clear how it generalizes to more complicated shapes! Writing a bajillion if statements doesn’t seem like it would work well. And how do people render those 3d shapes anyway?
+
+So! **Signed distance functions** are a different way to define a shape. Instead of using a hardcoded if statement, instead you define a **function** that tells you, for any point in the world, how far away that point is from your shape. For example, here’s a signed distance function for a sphere.
+
+```
+float sdSphere( vec3 p, float center )
+{
+ return length(p)-center;
+}
+```
+
+Signed distance functions are awesome because they’re:
+
+ * simple to define!
+ * easy to compose! You can take a union / intersection / difference with some simple math if you want a sphere with a chunk taken out of it.
+ * easy to rotate / stretch / bend!
+
+
+
+### the steps to making a spinning top
+
+When I started out I didn’t understand what code I needed to write to make a shiny spinning thing. It turns out that these are the basic steps:
+
+ 1. Make a signed distance function for the shape I want (in my case an octahedron)
+ 2. Raytrace the signed distance function so you can display it in a 2D picture (or raymarch? The tutorial I used called it raytracing and I don’t understand the difference between raytracing and raymarching yet)
+ 3. Write some code to texture the surface of your shape and make it shiny
+
+
+
+I’m not going to explain signed distance functions or raytracing in detail in this post because I found this [AMAZING tutorial on signed distance functions][2] that is very friendly and honestly it does a way better job than I could do. It explains how to do the 3 steps above and the code has a ton of comments and it’s great.
+
+ * The tutorial is called “SDF Tutorial: box & balloon” and it’s here:
+ * Here are tons of signed distance functions that you can copy and paste into your code (and ways to compose them to make other shapes)
+
+
+
+### step 4: copy the tutorial code and start changing things
+
+Here I used the time honoured programming practice here of “copy the code and change things in a chaotic way until I get the result I want”.
+
+My final shader of a bunch of shiny spinny things is here:
+
+The animation comes out looking like this:
+
+![][7]
+
+Basically to make this I just copied the tutorial on signed distance functions that renders the shape based on the signed distance function and:
+
+ * changed `sdfBalloon` to `sdfOctahedron` and made the octahedron spin instead of staying still in my signed distance function
+ * changed the `doBalloonColor` colouring function to make it shiny
+ * made there be lots of octahedrons instead of just one
+
+
+
+### making the octahedron spin!
+
+Here’s some the I used to make the octahedron spin! This turned out to be really simple: first copied an octahedron signed distance function from [this page][8] and then added a `rotate` to make it rotate based on time and then suddenly it’s spinning!
+
+```
+vec2 sdfOctahedron( vec3 currentRayPosition, vec3 offset ){
+ vec3 p = rotate((currentRayPosition), offset.xy, iTime * 3.0) - offset;
+ float s = 0.1; // what is s?
+ p = abs(p);
+ float distance = (p.x+p.y+p.z-s)*0.57735027;
+ float id = 1.0;
+ return vec2( distance, id );
+}
+```
+
+### making it shiny with some noise
+
+The other thing I wanted to do was to make my shape look sparkly/shiny. I used a noise funciton that I found in [this github gist][9] to make the surface look textured.
+
+Here’s how I used the noise function. Basically I just changed parameters to the noise function mostly at random (multiply by 2? 3? 1800? who knows!) until I got an effect I liked.
+
+```
+float x = noise(rotate(positionOfHit, vec2(0, 0), iGlobalTime * 3.0).xy * 1800.0);
+float x2 = noise(lightDirection.xy * 400.0);
+float y = min(max(x, 0.0), 1.0);
+float y2 = min(max(x2, 0.0), 1.0) ;
+vec3 balloonColor = vec3(y , y + y2, y + y2);
+```
+
+### writing shaders is fun!
+
+That’s all! I had a lot of fun making this thing spin and be shiny. If you also want to make fun animations with shaders, I hope this helps you make your cool thing!
+
+As usual with subjects I don’t know tha well, I’ve probably said at least one wrong thing about shaders in this post, let me know what it is!
+
+Again, here are the 2 resources I used:
+
+ 1. “SDF Tutorial: box & balloon”: (which is really fun to modify and play around with)
+ 2. Tons of signed distance functions that you can copy and paste into your code
+
+
+
+--------------------------------------------------------------------------------
+
+via: https://jvns.ca/blog/2020/03/15/writing-shaders-with-signed-distance-functions/
+
+作者:[Julia Evans][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://jvns.ca/
+[b]: https://github.com/lujun9972
+[1]: https://jvns.ca/images/spinny.gif
+[2]: https://www.shadertoy.com/view/Xl2XWt
+[3]: https://jvns.ca/images/colour.gif
+[4]: https://github.com/alexjc/shadertoy-render
+[5]: https://jvns.ca/images/circle.gif
+[6]: https://www.shadertoy.com/view/tsscR4
+[7]: https://jvns.ca/images/octahedron2.gif
+[8]: http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm
+[9]: https://gist.github.com/patriciogonzalezvivo/670c22f3966e662d2f83
diff --git a/sources/tech/20200315 How I migrated from a Mac Mini to a Raspberry Pi.md b/sources/tech/20200315 How I migrated from a Mac Mini to a Raspberry Pi.md
new file mode 100644
index 0000000000..0e1c7196fa
--- /dev/null
+++ b/sources/tech/20200315 How I migrated from a Mac Mini to a Raspberry Pi.md
@@ -0,0 +1,184 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How I migrated from a Mac Mini to a Raspberry Pi)
+[#]: via: (https://opensource.com/article/20/3/mac-raspberry-pi)
+[#]: author: (Peter Garner https://opensource.com/users/petergarner)
+
+How I migrated from a Mac Mini to a Raspberry Pi
+======
+Learn more about Linux by turning a Raspberry Pi Model 2 into a workable
+desktop computer.
+![Vector, generic Raspberry Pi board][1]
+
+Some time ago, I decided to move my computing environment from a Mac Mini PowerPC to a Raspberry Pi Model 2. This article describes my reasons for doing so and how I did it. While it is quite technical in places, if you're considering switching from an existing system to something decidedly lean and mean, there are things that you need to know before making that leap. There are lots of links to click as well, which will lead you to the software and apps that I mention.
+
+Enjoy!
+
+## Saying goodbye to the Mac
+
+I have to admit, I've never really been an Apple fanboi, especially following a short (and ultimately unsatisfactory) fling with a plastic polycarbonate MacBook back in 2006. Although it was beautifully designed, and the software "Just Worked," I was understandably upset when it decided to expire shortly after the warranty period expired (design faults, apparently). Ah well.
+
+I swore never to "invest" in an Apple machine again—until I discovered a used Mac Mini PowerPC on eBay that could be had for around $100 in 2012. It was new back in 2005 but had apparently been refurbished. "What have I got to lose, especially at that price?" I asked myself. Nobody answered, so I placed a last-minute bid, won it, and invested about the same sum of money again in bumping the memory up to 1GB and buying the OS on DVD. The OS X version was 10.4.7 Tiger, and the architecture was Power PC. It was sedate but reliable, and I was happy. It didn't take a lot of power either; some 60 watts at full load, so that was a bonus. I spent many happy hours tinkering with it and trying to find software that was supported on a device that old.
+
+Predictably though, as my computing requirements grew and the Mac got older, it started to get noticeably slower, and I was aware that even simple tasks—such as asking it to run a web browser and display an HTTPS page—were causing it problems. When I finally managed to find antivirus software for it, I became aware of just how noisy the Mini's cooling fan was as the CPU struggled with the extra load.
+
+A quick check of the performance monitors revealed thousands of memory-paging faults, and I realized that my old friend was soon destined for the knackers yard. Of course, that meant searching for a replacement, and that's when the fun started.
+
+## A(nother) small computer
+
+My main problem was that I didn't have a big budget. I looked at eBay again and found a number of Mac Minis for sale, all around the $500 mark, and many of those were early basic-spec Intel units that, like my old Mac, people had simply grown out of. Essentially, I wanted something like the old Mini, ideally with similar power consumption. A new one was out of the question, obviously.
+
+Let me state that my computer requirements are pretty undemanding, and for photo/graphics work, I have another computer that consumes power like there's no tomorrow and gives off enough heat to keep me warm in winter. And then I got to thinking about the [Raspberry Pi Model 2][2]. Now before you laugh, I have around six of the things running various servers, and they do just fine. One runs a small web server, another runs a mail server, and so on. Each one costs around $30, and most use a cheap microSDHC card, so if one fails, I can easily swap it out for another, and I can usually buy a suitable card at a local supermarket—try doing that when your laptop drive fails! I also have a Netgear ReadyNAS 102 with a couple of 2TB hard drives to act as my bulk storage.
+
+Suddenly, my plan looked as though it might be viable after all!
+
+## Spec'ing it out
+
+The specification was a bit of a no-brainer: The Model 2 Pi comes with 1GB of memory standard, the Ethernet runs at 100Mbps maximum, the clock speed is 900MHz, there are four USB ports, and that's yer lot, mate. You can overclock it, but I've never wanted to try this for various reasons.
+
+I had a Pi in my spares drawer, so no problem there. I ordered a posh aluminum case made by [Flirc][3] that was on offer for $20 and duly slotted in the Pi. The power supply unit (PSU) had to be a genuine two-amp device, and again, I had a spare lying around. If you take your Pi ownership seriously, I recommend the [Anker 40W][4] five-port desktop charger: it has intelligent power management, and I'm running five Pis from one unit. Incidentally, if you inadvertently use a PSU that can't deliver the required current, you'll keep seeing a square, multi-colored icon in the top-right corner of your screen, so be warned.
+
+The microSDHC "disk" was more of an issue, though. I always use SanDisk, and this time I wanted something fast, especially as this was to be a "desktop" machine. In the end, I went for a [SanDisk 8GB Extreme Pro UHS-1][5] card that promised up to 90 to 95 Mbps write/read performance. "8GB? That's not a lot of space," I hear you Windows users cry, and because this is Linux, there doesn't need to be.
+
+The way I envisioned it, I'd set up the Pi normally and use it primarily as a boot disk. I'd host all my documents and media files on the network-attached storage (NAS) box, and all would be well. The NAS shares would be accessed via network filesystem (NFS), and I'd just mount them as directories on the Pi.
+
+Quite early on, I elected to move my entire home directory onto the NAS, and this has worked well, with some quirks. The problem I faced was a Pi quirk, and although I was sure there was a fix, I wanted to get it up and running before the Mac finally crapped out. When the Pi boots, it seems to enable the networking part quite late in the sequence, and I found that I couldn't do my NFS mounts because the networking interface hadn't come up yet. Rather than hack around with tricky scripts, I decided to simply mount the NFS shares by hand after I'd logged in after a successful boot. This seemed to work, and it's the solution I'm using now. Now that I had a basic strategy, it was time to implement it on the "live" machine.
+
+That's the beauty of working with the Raspberry Pi—you can quickly hack together a testbed and have a system up and running in under 30 minutes.
+
+Regarding video, I bought an HDMI-to-DVI cable to use with my Dell monitor, and in GUI desktop mode, this comes up as 1280x1024—plenty good enough for my use. If you have a monster flat-screen TV, you can always use that instead.
+
+## My software environment
+
+### Operating system
+
+I ultimately decided on [Arch Linux for ARM][6] 7H as the operating system. I'm a [Raspbian][7] veteran, but I didn't need the educational software that comes with it (I have other Pis for that). Arch provides a minimal environment but is full-featured, well-supported, and powerful; it also has bucket-loads of software available. After its initial installation, I'd used just over 1.2GB of space, and even now, with all my software on the microSDHC, I'm only using 2.8GB of my 8GB card. Please note that the Pi 2 is officially Arch Linux ARM 7, not 6.
+
+### Desktop
+
+I wanted a graphical desktop environment (even though I'm a command-line sorta guy), but it needed to be in keeping with the lean and mean ethos. I'd used [LXDE][8] before and was happy with it, so I installed it; GNOME and KDE were just too big.
+
+### Web browser
+
+The web browser was a bit of a problem, but after trying the default Midori, Epiphany, and a couple of others, I decided on [Firefox][9]. It's a bit flabby, but it follows standards well, and if you're going to digitally sign LibreOffice ODT documents, you'll need it anyway. One problem on a machine of this power is the tremendous toll that web-based ads place on the overall memory usage. In fact, a badly ad'ed page can make the browser stop completely, so I had to make those ads disappear. One way would be to install an ad-blocker plugin, but that's another hit on available memory, so a simpler method was called for.
+
+As this is a Linux box, I simply downloaded an [ad-blocking hosts file][10]. This is an amazing piece of community work that consists of over 15,000 hostnames for basically any server that spits out ads. All the entries point to an IP address of 0.0.0.0, so there's no time wasted and your bandwidth's your own again. It's a free download and can be added to the end of an existing hosts file. Of course, the major value, as far as I'm concerned, is that page load times are much quicker.
+
+The screen capture below shows an ad-free Firefox overlaid with the same page in [ELinks][11].
+
+![Firefox and eLinks browsers on Raspberry Pi][12]
+
+No ads in either, but if you don't need all the eye candy rendered by Firefox, ELinks will provide a super-clean experience. (Normally, all that whitespace in the Firefox image is filled with ads.) The ELinks browser is an interesting hybrid browser that is primarily text-based and is similar to the classic pure-text Lynx browser.
+
+### Messaging
+
+It would be overkill, and undesirable from a security point of view, to have Microsoft Skype on the Pi, so I decided on a Jabber/XMPP client, [Psi][13]. Psi has the advantage of not having a multitude of dependencies, and it also works really well. It's easy to take part in multi-user chats, and I have another Pi hosting a Jabber server to test it on. There's no character-mode version, unfortunately, and most of the text-based clients I tried had problems, so it's a GUI-only situation at the moment. No matter; it works well and doesn't use a lot of resources.
+
+### Email
+
+I also tried a number of email applications: this was easily the most important application. Eventually, I chose [Claws Mail][14]. Sadly, it doesn't do HTML mail, but it's rock-solid reliable. I have to say that I can't get the GNU Privacy Guard (GPG) plugin working properly yet due to some unresolved version issues, but I can always encrypt messages in a terminal, if need be.
+
+### Audio
+
+Music is important to me, and I chose [SMPlayer][15] as my media player. It supports many options, including playlists for local and networked files and internet radio streaming. It does the job well.
+
+### Video
+
+I'll not go into the video player in any great detail. Bearing in mind the hardware specs of the Pi, reliably playing back a video stream, even on the same network, was problematic. I decided that if I wanted to watch videos, I had other devices more suited to it. I did try and experiment with the **gpu_mem** setting in the **[/boot/config.txt][16]**, switching it from the default 64MB to 96MB. I was prepared to borrow a bit of application memory for the video player, but even that didn't seem to make it work well. In the end, I kept that setting so that the desktop environment would run more smoothly, and so far, I haven't had problems. The irony of this is that I have another Pi that has a [DLNA][17] server installed, and this can stream video exceedingly well—not just to one client, but several. In its defense, though, it doesn't have a desktop environment to contend with. So, for now, I don't bother trying to play video.
+
+### Image processing
+
+I need to do simple, lightweight photo and image editing, and I knew from prior experience that GIMP and similar packages would bring the Pi to its knees. I found an app called [Pinta][18], which resembles an enhanced Microsoft Paint, but with more cojones. As someone with a large image collection, I also needed a slideshow application. After much evaluation, I decided on [feh][19]. Normally run from a terminal within the GUI desktop, it has an incredible array of options that can help you produce an image slideshow, and again, it has low memory requirements.
+
+### Office suite
+
+And then there was an office suite. On the old Mac Mini, I was happily (and legally) running a copy of Microsoft Mac Office 2004, and I was truly sorry to lose that. I just needed a Microsoft Word and Excel equivalent, but I had to bear in mind the Pi's limitations. Sure, there are standalone versions of word-processor and spreadsheet applications, but there was nothing that really gave me confidence that I could edit a full-featured document.
+
+I already knew of [LibreOffice][20], but I had my doubts about it because of its Java Runtime Environment (JRE) requirement, or so I thought. Thankfully, JRE was optional, and as long as I didn't want to use (database) connection pooling of macros, there was no need to enable it. I also used as many built-in options as possible, rejecting skins and themes; this brought the overall memory footprint down to a reasonable level, and hey, I'm writing this on LibreOffice Writer now! I adopted the attitude that if it has a built-in theme, use it!
+
+Here's the current [memory overview][21] (in MB) from within the GUI desktop:
+
+![Raspberry Pi GUI memory usage][22]
+
+### Miscellaneous
+
+Other desktop software I've installed (not much as I wanted in order to keep this a minimal installation) is:
+
+ * [FileZilla][23]: SFTP/FTP client
+ * [PuTTY][24]: SSH/telnet terminal frontend
+ * [Mousepad][25]: A versatile plain-text editor, similar to Wordpad or Notepad, but much more powerful **[Note: this link was broken. Is this ok?]**
+
+
+
+Overall, the entire setup works as intended. I've found that it performs well, if a little slow sometimes, but this is to be expected, as it's running on a Raspberry Pi with a 900MHz clock speed and 1GB of memory. As long you're aware of and prepared to accept the limitations, you can have a cheap, very functional system that doesn't take up all your desk space.
+
+## Lacking in characters
+
+Life with a Pi desktop is not all about the GUI; it's a very competent command-line environment too, should you need one. As a Linux developer and geek, I am very comfortable in a character-mode environment, and this is where the Pi really comes into its own. The performance you can expect in the command-line environment, at least in my configuration, is dependent on a number of factors. I'm limited to a certain extent by the Pi's network-interface speed and the overall performance of my Netgear ReadyNAS 102, another slightly underpowered, consumer-grade ARM box. The one thing that did please me, though, was the noticeable increase in speed over the Mac Mini!
+
+Running in a native terminal environment, this is the typical memory usage (in MB) you might expect:
+
+![Raspberry Pi terminal memory usage][26]
+
+One thing to note is the lack of a swap partition. It's generally accepted that any type of swap system on a Raspberry Pi is a Very Bad Thing™ and will wear out your SD card in no time. I considered setting up a swap partition on the NAS box, but I ruled this out early on, as it would very negatively impact the network as a whole, and as with the NFS mount issue, the swap partition would need to be mounted before the network came up. So no go.
+
+Having lived with Raspberry Pis for some time now, let's just say that one has to learn to set things up carefully in the first place to avoid the need, and ultimately, it can teach you to manage computers better.
+
+As part of my efforts to make the Pi as useful as possible, I had to envision a scenario where whatever I was working on was either so resource-hungry that I couldn't run a GUI desktop or the GUI was just not required. That meant reproducing as many of the desktop-only apps in a character-mode environment. In fact, this was easier than finding the equivalent desktop apps.
+
+Here is my current lineup:
+
+ * **File manager:** [Midnight Commander][27]; if you're old enough to remember Norton Commander, you'll know what it looks like.
+ * **File transfer:** SSH/SFTP; normally handled by PuTTY and FileZilla on the desktop, you just use these two commands as provided.
+ * **Web browser:** Lynx or Links are classic character-mode browsers that significantly speed up the internet experience.
+ * **Music player:** Yes, you can play music in a character-mode terminal! [Mpg123][28] is the name of the app, and when it's run as **mpg123 -C**, it allows full keyboard control of all playback functions. If you want to be really cool, you can alter the way Midnight Commander handles MP3 files by editing **/etc/mc/mc.ext** and adding the code snippet below. This allows you to browse and play your music collection with ease. [code] shell/i/.mp3
+ Open=/usr/bin/mpg123 -C %f
+ View=%view{ascii} /usr/lib/mc/ext.d/sound.sh view mp3
+```
+ * **Office:** Don't be silly! Oh wait, though; I installed the character-mode spreadsheet app called **sc** (Supercalc?), and there's always Vi if you want to edit a text document, but don't expect to able to edit any Microsoft files. If your need is truly great, you can install a supplementary application called Antiword, which will let you view a .doc file.
+ * **Email:** A bit of a problem, as the Claws Mail mailbox format is not directly compatible with my character-mode app of choice, Mutt. There's a workaround, but I'm only going to do it if I get some spare time. For sending quick emails, I installed ssmtp, which is described as "a send-only sendmail emulator for machines which normally pick their mail up from a centralized mail hub." The setup is minimal, and overhead is practically nil, as normally it's invoked only when mail is being sent. So, you can do things like typing **echo "The donuts are on my desk" | mail -s"Important News" [everybody@myoffice.com][29]** from the command line without firing up a GUI mail app.
+
+
+
+For everything else, it's just a question of flipping back to the GUI desktop. Speaking of which…
+
+![Raspberry Pi GUI desktop environment][30]
+
+Quite a busy screen, but the Raspberry Pi handles it well. Here, I'm using LibreOffice to write this article, there's a network status box, Firefox is on the mpg123 website, and there's a terminal running top showing how much memory (isn't) being used. The drop-down menu on the left shows the office suite apps.
+
+## Other scenarios and thoughts
+
+### What's where
+
+With any hybrid system like this, it's important to remember what is located where so that, in the event of any problems, recovery will be easier. In my current configuration, the microSDHC card contains only the operating system, and as much as possible, any system-configuration files are also on there. Your own userland data will be on the NAS in your home directory. Ideally, you should be to replace or update the software on the microSDHC without having any adverse effects on your computing environment as a whole, but in IT, it's never that straightforward.
+
+In the X11 GUI desktop system, although there is a default config file in **/etc/X11**, you will invariably have a customized version containing your own preferences. (This is by design.) Your own file on the NAS, however, will reference files on the microSDHC:
+
+![Location of files][31]
+
+The overall effect is that if you change one environment for another, you will invariably experience a change (or loss) in functionality. Hopefully, the changes will be minor, but you do need to be aware of the sometimes ambiguous links.
+
+Please remember that the **root** user will _always_ be on the microSDHC, and if your NAS box fails for any reason, you'll still be able to boot your system and at least do some recovery work.
+
+### NAS alternatives
+
+While I'm in my home office, I have full access to my NAS box, which represents what (in today's terminology) would be a personal cloud. I much prefer this solution to a commercial cloud that is invariably managed by a company of unknown origin, location, security, and motives. For those reasons, I will always host my data where I can see it and physically get to it as required. Having said that, you may not be as paranoid as I am and will want to hook up your Pi desktop to an external cloud share.
+
+In that case, using an NFS mount as a basis for your home directory should mean that it's simply a matter of editing your **/etc/fstab** to point the NFS client at a different location. In my setup, the NAS box is called, er, NASBOX, and the local NFS share mountpoint is called **/NASmount**. When you create your non-root user, you'll simply move their home directory to an existing directory called **/NASmount**:
+```
+
+
+NASBOX:/data/yourshare /NASmount nfs
+nfsvers=3,rsize=8192,wsize=8192,timeo=60,intr,auto 0 0
+
+mount -t nfs -v NASBOX:/data/yourshare /NASmount
+
+```
+and then your directory tree could look like this:
+```
+`/NASmount/home/user`
+```
+So, by simply changing the **/etc/fstab** entry, you could quickly be hooked up to someone else's cloud. This, as they say, is left as an exercise for the re
\ No newline at end of file
diff --git a/sources/tech/20200316 How to test failed authentication attempts with test-driven development.md b/sources/tech/20200316 How to test failed authentication attempts with test-driven development.md
new file mode 100644
index 0000000000..abe34d97e2
--- /dev/null
+++ b/sources/tech/20200316 How to test failed authentication attempts with test-driven development.md
@@ -0,0 +1,288 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How to test failed authentication attempts with test-driven development)
+[#]: via: (https://opensource.com/article/20/3/failed-authentication-attempts-tdd)
+[#]: author: (Alex Bunardzic https://opensource.com/users/alex-bunardzic)
+
+How to test failed authentication attempts with test-driven development
+======
+Mountebank makes it easier to test the "less happy path" in your code.
+![Programming keyboard.][1]
+
+Testing often begins with what we hope happens. In my [previous article][2], I demonstrated how to virtualize a service you depend on when processing the "happy path" scenario (that is, testing the outcome of a successful login attempt). But we all know that software fails in spectacular and unexpected ways. Now's the time to take a closer look into how to process the "less happy paths": what happens when someone tries to log in with the wrong credentials?
+
+In the first article linked above, I walked through building a user authentication module. (Now is a good time to review that code and get it up and running.) This module does not do all the heavy lifting; it mostly relies on another service to do those tougher tasks—enable user registration, store the user accounts, and authenticate the users. The module will only be sending HTTP POST requests to this additional service's endpoint; in this case, **/api/v1/users/login**.
+
+What do you do if the service you're dependent on hasn't been built yet? This scenario creates a blockage. In the previous post, I explored how to remove that blockage by using service virtualization enabled by [mountebank][3], a powerful test environment.
+
+This article walks through the steps required to enable the processing of user authentication in cases when a user repeatedly attempts to log in. The third-party authentication service allows only three attempts to log in, after which it ceases to service the HTTP request arriving from the offending domain.
+
+### How to simulate repeat requests
+
+Mountebank makes it very easy to simulate a service that listens on a network port, matches the method and the path defined in the request, then handles it by sending back an HTTP response. To follow along, be sure to get mountebank running as we [did in the previous article][2]. As I explained there, these values are declared as JSONs that are posted to ****, mountebank's endpoint for processing authentication requests.
+
+But the challenge now is how to simulate the scenario when the HTTP request keeps hitting the same endpoint from the same domain. This is necessary to simulate a user who submits invalid credentials (username and password), is informed they are invalid, tries different credentials, and is repeatedly rejected (or foolishly attempts to log in with the same credentials that failed on previous attempts). Eventually (in this case, after a third failed attempt), the user is barred from additional tries.
+
+Writing executable code to simulate such a scenario would have to model very elaborate processing. However, when using mountebank, this type of simulated processing is extremely simple to accomplish. It is done by creating a rolling buffer of responses, and mountebank responds in the order the buffer was created. Here is an example of one way to simulate repeat requests in mountebank:
+
+
+```
+{
+ "port": 3001,
+ "protocol": "http",
+ "name": "authentication imposter",
+ "stubs": [
+ {
+ "predicates": [
+ {
+ "equals": {
+ "method": "post",
+ "path": "/api/v1/users/login"
+ }
+ }
+ ],
+ "responses": [
+ {
+ "is": {
+ "statusCode": 200,
+ "body": "Successfully logged in."
+ }
+ },
+ {
+ "is": {
+ "statusCode": 400,
+ "body": "Incorrect login. You have 2 more attempts left."
+ }
+ },
+ {
+ "is": {
+ "statusCode": 400,
+ "body": "Incorrect login. You have 1 more attempt left."
+ }
+ },
+ {
+ "is": {
+ "statusCode": 400,
+ "body": "Incorrect login. You have no more attempts left."
+ }
+ }
+ ]
+ }
+ ]
+}
+```
+
+The rolling buffer is simply an unlimited collection of JSON responses where each response is represented with two key-value pairs: **statusCode** and **body**. In this case, four responses are defined. The first response is the happy path (i.e., user successfully logged in), and the remaining three responses represent failed use cases (i.e., wrong credentials result in status code 400 and corresponding error messages).
+
+### How to test repeat requests
+
+Modify the tests as follows:
+
+
+```
+using System;
+using Xunit;
+using app;
+namespace tests
+{
+ public class UnitTest1
+ {
+ Authenticate auth = [new][4] Authenticate();
+ [Fact]
+ public void SuccessfulLogin()
+ {
+ var given = "valid credentials";
+ var expected = " Successfully logged in.";
+ var actual= auth.Login(given);
+ Assert.Equal(expected, actual);
+ }
+ [Fact]
+ public void FirstFailedLogin()
+ {
+ var given = "invalid credentials";
+ var expected = "Incorrect login. You have 2 more attempts left.";
+ var actual = auth.Login(given);
+ Assert.Equal(expected, actual);
+ }
+ [Fact]
+ public void SecondFailedLogin()
+ {
+ var given = “invalid credentials";
+ var expected = "Incorrect login. You have 1 more attempt left.";
+ var actual = auth.Login(given);
+ Assert.Equal(expected, actual);
+ }
+ [Fact]
+ public void ThirdFailedLogin()
+ {
+ var given = " invalid credentials";
+ var expected = "Incorrect login. You have no more attempts left.";
+ var actual = auth.Login(given);
+ Assert.Equal(expected, actual);
+ }
+ }
+}
+```
+
+Now, run the tests to confirm that your code still works:
+
+![Failed test][5]
+
+Whoa! The tests now all fail. Why?
+
+If you take a closer look, you'll see a revealing pattern:
+
+![Reason for failed test][6]
+
+Notice that ThirdFailedLogin is executed first, followed by the SuccessfulLogin, followed by FirstFailedLogin, followed by SecondFailedLogin. What's going on here? Why is the third test running before the first test?
+
+The testing framework ([xUnit][7]) is executing all tests in parallel, and the sequence of execution is unpredictable. You need tests to run in order, which means you cannot test these scenarios using the vanilla xUnit toolkit.
+
+### How to run tests in the right sequence
+
+To force your tests to run in a certain sequence that you define (instead of running in an unpredictable order), you need to extend the vanilla xUnit toolkit with the NuGet [Xunit.Extensions.Ordering][8] package. Install the package on the command line with:
+
+
+```
+`$ dotnet add package Xunit.Extensions.Ordering --version 1.4.5`
+```
+
+or add it to your **tests.csproj** config file:
+
+
+```
+``
+```
+
+Once that's taken care of, make some modifications to your **./tests/UnitTests1.cs** file. Add these four lines at the beginning of your **UnitTests1.cs **file:
+
+
+```
+using Xunit.Extensions.Ordering;
+[assembly: CollectionBehavior(DisableTestParallelization = true)]
+[assembly: TestCaseOrderer("Xunit.Extensions.Ordering.TestCaseOrderer", "Xunit.Extensions.Ordering")]
+[assembly: TestCollectionOrderer("Xunit.Extensions.Ordering.CollectionOrderer", "Xunit.Extensions.Ordering")]
+```
+
+Now you can specify the order you want your tests to run. Initially, simulate the happy path (i.e., the **SuccessfulLogin()**) by annotating the test with:
+
+
+```
+[Fact, Order(1)]
+public void SuccessfulLogin() {
+```
+
+After you test a successful login, test the first failed login:
+
+
+```
+[Fact, Order(2)]
+public void FirstFailedLogin()
+```
+
+And so on. You can add the order of the test runs by simply adding the **Order(x)** (where **x** denotes the order you want the test to run) annotation to your Fact.
+
+This annotation guarantees that your tests will run in the exact order you want them to run, and now you can (finally!) completely test your integration scenario.
+
+The final version of your test is:
+
+
+```
+using System;
+using Xunit;
+using app;
+using Xunit.Extensions.Ordering;
+[assembly: CollectionBehavior(DisableTestParallelization = true)]
+[assembly: TestCaseOrderer("Xunit.Extensions.Ordering.TestCaseOrderer", "Xunit.Extensions.Ordering")]
+[assembly: TestCollectionOrderer("Xunit.Extensions.Ordering.CollectionOrderer", "Xunit.Extensions.Ordering")]
+namespace tests
+{
+ public class UnitTest1
+ {
+ Authenticate auth = [new][4] Authenticate();
+ [Fact, Order(1)]
+ public void SuccessfulLogin()
+ {
+ var given = "[elon_musk@tesla.com][9]";
+ var expected = "Successfully logged in.";
+ var actual= auth.Login(given);
+ Assert.Equal(expected, actual);
+ }
+ [Fact, Order(2)]
+ public void FirstFailedLogin()
+ {
+ var given = "[mickey@tesla.com][10]";
+ var expected = "Incorrect login. You have 2 more attempts left.";
+ var actual = auth.Login(given);
+ Assert.Equal(expected, actual);
+ }
+ [Fact, Order(3)]
+ public void SecondFailedLogin()
+ {
+ var given = "[mickey@tesla.com][10]";
+ var expected = "Incorrect login. You have 1 more attempt left.";
+ var actual = auth.Login(given);
+ Assert.Equal(expected, actual);
+ }
+ [Fact, Order(4)]
+ public void ThirdFailedLogin()
+ {
+ var given = "[mickey@tesla.com][10]";
+ var expected = "Incorrect login. You have no more attempts left.";
+ var actual = auth.Login(given);
+ Assert.Equal(expected, actual);
+ }
+ }
+}
+```
+
+Run the test again—everything passes!
+
+![Passing test][11]
+
+### What are you testing exactly?
+
+This article has focused on test-driven development (TDD), but let's review it from another methodology, Extreme Programming (XP). XP defines two types of tests:
+
+ 1. Programmer tests
+ 2. Customer tests
+
+
+
+So far, in this series of articles on TDD, I have focused on the first type of tests (i.e., programmer tests). In this and the previous article, I switched my lenses to examine the most efficient ways of doing customer tests.
+
+The important point is that programmer (or producer) tests are focused on precision work. We often refer to these precision tests as "micro tests," while others may call them "unit tests." Customer tests, on the other hand, are more focused on a bigger picture; we sometimes refer to them as "approximation tests" or "end-to-end tests."
+
+### Conclusion
+
+This article demonstrated how to write a suite of approximation tests that integrate several discrete steps and ensure that the code can handle all edge cases, including simulating the customer experience when repeatedly attempting to log in and failing to obtain the necessary clearance. This combination of TDD and tools like xUnit and mountebank can lead to well-tested and thus more reliable application development.
+
+In future articles, I'll look into other usages of mountebank for writing customer (or approximation) tests.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/failed-authentication-attempts-tdd
+
+作者:[Alex Bunardzic][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/alex-bunardzic
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/programming_keyboard_coding.png?itok=E0Vvam7A (Programming keyboard.)
+[2]: https://opensource.com/article/20/3/service-virtualization-test-driven-development
+[3]: http://www.mbtest.org/
+[4]: http://www.google.com/search?q=new+msdn.microsoft.com
+[5]: https://opensource.com/sites/default/files/uploads/testfails_0.png (Failed test)
+[6]: https://opensource.com/sites/default/files/uploads/failurepattern.png (Reason for failed test)
+[7]: https://xunit.net/
+[8]: https://www.nuget.org/packages/Xunit.Extensions.Ordering/#
+[9]: mailto:elon_musk@tesla.com
+[10]: mailto:mickey@tesla.com
+[11]: https://opensource.com/sites/default/files/uploads/testpasses.png (Passing test)
diff --git a/sources/tech/20200316 How to upload an OpenStack disk image to Glance.md b/sources/tech/20200316 How to upload an OpenStack disk image to Glance.md
new file mode 100644
index 0000000000..82fb71244b
--- /dev/null
+++ b/sources/tech/20200316 How to upload an OpenStack disk image to Glance.md
@@ -0,0 +1,848 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How to upload an OpenStack disk image to Glance)
+[#]: via: (https://opensource.com/article/20/3/glance)
+[#]: author: (Jair Patete https://opensource.com/users/jpatete)
+
+How to upload an OpenStack disk image to Glance
+======
+Make images available to your private cloud, and more.
+![blank background that says your image here][1]
+
+[Glance][2] is an image service that allows you to discover, provide, register, or even delete disk and/or server images. It is a fundamental part of managing images on [OpenStack][3] and [TripleO][4] (which stands for "OpenStack-On-OpenStack").
+
+If you have used a recent version of the OpenStack platform, you may already have launched your first Overcloud using TripleO, as you interact with Glance when uploading the Overcloud disk images inside the Undercloud's OpenStack (i.e., the node inside your cloud that is used to install the Overcloud, add/delete nodes, and do some other handy things).
+
+In this article, I'll explain how to upload an image to Glance. Uploading an image to the service makes it available for the instances in your private cloud. Also, when you're deploying an Overcloud, it makes the image(s) available so the bare-metal nodes can be deployed using them.
+
+In an Undercloud, execute the following command:
+
+
+```
+`$ openstack overcloud image upload --image-path /home/stack/images/`
+```
+
+This uploads the following Overcloud images to Glance:
+
+ 1. overcloud-full
+ 2. overcloud-full-initrd
+ 3. overcloud-full-vmlinuz
+
+
+
+After some seconds, the images will upload successfully. Check the result by running:
+
+
+```
+(undercloud) [stack@undercloud ~]$ openstack image list
++--------------------------------------+------------------------+--------+
+| ID | Name | Status |
++--------------------------------------+------------------------+--------+
+| 09ca88ea-2771-459d-94a2-9f87c9c393f0 | overcloud-full | active |
+| 806b6c35-2dd5-478d-a384-217173a6e032 | overcloud-full-initrd | active |
+| b2c96922-161a-4171-829f-be73482549d5 | overcloud-full-vmlinuz | active |
++--------------------------------------+------------------------+--------+
+```
+
+This is a mandatory and easy step in the process of deploying an Overcloud, and it happens within seconds, which makes it hard to see what's under the hood. But what if you want to know what is going on?
+
+One thing to keep in mind: Glance works using client-server communication carried through REST APIs. Therefore, you can see what is going on by using [tcpdump][5] to take some TCP packets.
+
+Another thing that is important: There is a database (there's always a database, right?) that is shared among all the OpenStack platform components, and it contains all the information that Glance (and other components) needs to operate. (In my case, MariaDB is the backend.) I won't get into how to access the SQL database, as I don't recommend playing around with it, but I will show what the database looks like during the upload process. (This is an entirely-for-test OpenStack installation, so there's no need to play with the database in this example.)
+
+### The database
+
+The basic flow of this example exercise is:
+
+_Image Created -> Image Queued -> Image Saved -> Image Active_
+
+You need permission to go through this flow, so first, you must ask OpenStack's identity service, [Keystone][6], for authorization. My Keystone catalog entry looks like this; as I'm in the Undercloud, I'll hit the public endpoint:
+
+
+```
+| keystone | identity | regionOne |
+| | | public: |
+| | | regionOne |
+| | | internal: |
+| | | regionOne |
+| | | admin: |
+```
+
+And for Glance:
+
+
+```
+| glance | image | regionOne |
+| | | public: |
+| | | regionOne |
+| | | internal: |
+| | | regionOne |
+| | | admin: |
+```
+
+I'll hit those ports and TCP port 3306 in the capture; the latter is so I can capture what's going on with the SQL database. To capture the packets, use the tcpdump command:
+
+
+```
+`$ tcpdump -nvs0 -i ens3 host 172.16.0.20 and port 13000 or port 3306 or port 13292`
+```
+
+Under the hood, this looks like:
+
+Authentication:
+
+**Initial request (discovery of API Version Information):**
+
+
+```
+`https://172.16.0.20:13000 "GET / HTTP/1.1"`
+```
+
+**Response:**
+
+
+```
+Content-Length: 268 Content-Type: application/json Date: Tue, 18 Feb 2020 04:49:55 GMT Location: Server: Apache Vary: X-Auth-Token x-openstack-request-id: req-6edc6642-3945-4fd0-a0f7-125744fb23ec
+
+{
+ "versions":{
+ "values":[
+ {
+ "id":"v3.13",
+ "status":"stable",
+ "updated":"2019-07-19T00:00:00Z",
+ "links":[
+ {
+ "rel":"self",
+ "href":""
+ }
+ ],
+ "media-types":[
+ {
+ "base":"application/json",
+ "type":"application/vnd.openstack.identity-v3+json"
+ }
+ ]
+ }
+ ]
+ }
+}
+```
+
+**Authentication request**
+
+
+```
+`https://172.16.0.20:13000 "POST /v3/auth/tokens HTTP/1.1"`
+```
+
+After this step, a token is assigned for the admin user to use the services. (The token cannot be displayed for security reasons.) The token tells the other services something like: "I've already logged in with the proper credentials against Keystone; please let me go straight to the service and ask no more questions about who I am."
+
+At this point, the command:
+
+
+```
+`$ openstack overcloud image upload --image-path /home/stack/images/`
+```
+
+executes, and it is authorized to upload the image to the Glance service.
+
+The current status is:
+
+_**Image Created**_ _-> Image Queued -> Image Saved -> Image Active_
+
+The service checks whether this image already exists:
+
+
+```
+`https://172.16.0.20:13292 "GET /v2/images/overcloud-full-vmlinuz HTTP/1.1"`
+```
+
+From the client's point of view, the request looks like:
+
+
+```
+`curl -g -i -X GET -H 'b'Content-Type': b'application/octet-stream'' -H 'b'X-Auth-Token': b'gAAAAABeS2zzWzAZBqF-whE7SmJt_Atx7tiLZhcL8mf6wJPrO3RBdv4SdnWImxbeSQSqEQdZJnwBT79SWhrtt7QDn-2o6dsAtpUb1Rb7w6xe7Qg_AHQfD5P1rU7tXXtKu2DyYFhtPg2TRQS5viV128FyItyt49Yn_ho3lWfIXaR3TuZzyIz38NU'' -H 'User-Agent: python-glanceclient' -H 'Accept-Encoding: gzip, deflate' -H 'Accept: */*' -H 'Connection: keep-alive' --cacert /etc/pki/ca-trust/source/anchors/cm-local-ca.pem --cert None --key None https://172.16.0.20:13292/v2/images/overcloud-full-vmlinuz`
+```
+
+Here, you can see the fernet token, the user-agent indicating Glance is speaking, and the TLS certificate; this is why you don't see anything in your tcpdump.
+
+Since the image does not exist, it is OK to get a 404 ERROR for this request.
+
+Next, the current images are consulted:
+
+
+```
+`https://172.16.0.20:13292 "GET /v2/images?limit=20 HTTP/1.1" 200 78`
+```
+
+and retrieved from the service:
+
+
+```
+HTTP/1.1 200 OK
+Content-Length: 78
+Content-Type: application/json
+X-Openstack-Request-Id: req-0f117984-f427-4d35-bec3-956432865dd1
+Date: Tue, 18 Feb 2020 04:49:55 GMT
+
+{
+ "images":[
+
+ ],
+ "first":"/v2/images?limit=20",
+ "schema":"/v2/schemas/images"
+}
+```
+
+Yes, it is still empty.
+
+Meanwhile, the same check has been done on the database, where a huge query has been triggered with the same results. (To sync on the timestamp, I checked on the tcpdump after the connection and queries were finished, and then compared them with the API calls' timestamp.)
+
+To identify where the Glance-DB calls started, I did a full-packet search with the word "glance" inside the tcpdump file. This saves a lot of time vs. searching through all the other database calls, so this is my starting point to check each database call.
+
+![Searching "glance" inside tcpdump][7]
+
+The first query returns nothing in the fields, as the image still does not exist:
+
+
+```
+SELECT images.created_at AS images_created_at, images.updated_at AS images_updated_at, images.deleted_at AS images_deleted_at, images.deleted AS images_deleted, images.id AS images_id, images.name AS images_name, images.disk_format AS images_disk_format, images.container_format AS images_container_format, images.size AS images_size, images.virtual_size AS images_virtual_size, images.status AS images_status, images.visibility AS images_visibility, images.checksum AS images_checksum, images.os_hash_algo AS images_os_hash_algo, images.os_hash_value AS images_os_hash_value, images.min_disk AS images_min_disk, images.min_ram AS images_min_ram, images.owner AS images_owner, images.protected AS images_protected, images.os_hidden AS images_os_hidden, image_properties_1.created_at AS image_properties_1_created_at, image_properties_1.updated_at AS image_properties_1_updated_at, image_properties_1.deleted_at AS image_properties_1_deleted_at, image_properties_1.deleted AS image_properties_1_deleted, image_properties_1.id AS image_properties_1_id, image_properties_1.image_id AS image_properties_1_image_id, image_properties_1.name AS image_properties_1_name, image_properties_1.value AS image_properties_1_value, image_locations_1.created_at AS image_locations_1_created_at, image_locations_1.updated_at AS image_locations_1_updated_at, image_locations_1.deleted_at AS image_locations_1_deleted_at, image_locations_1.deleted AS image_locations_1_deleted, image_locations_1.id AS image_locations_1_id, image_locations_1.image_id AS image_locations_1_image_id, image_locations_1.value AS image_locations_1_value, image_locations_1.meta_data AS image_locations_1_meta_data, image_locations_1.status AS image_locations_1_status
+FROM images LEFT OUTER JOIN image_properties AS image_properties_1 ON images.id = image_properties_1.image_id LEFT OUTER JOIN image_locations AS image_locations_1 ON images.id = image_locations_1.image_id
+WHERE images.id = 'overcloud-full-vmlinuz'
+```
+
+Next, the image will start uploading, so an API call and a write to the database are expected.
+
+On the API side, the image scheme is retrieved by consulting the service in:
+
+
+```
+`https://172.16.0.20:13292 "GET /v2/schemas/image HTTP/1.1"`
+```
+
+Then, some of the fields are populated with image information. This is what the scheme looks like:
+
+
+```
+{
+ "name":"image",
+ "properties":{
+ "id":{
+ "type":"string",
+ "description":"An identifier for the image",
+ "pattern":"^([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}$"
+ },
+ "name":{
+ "type":[
+ "null",
+ "string"
+ ],
+ "description":"Descriptive name for the image",
+ "maxLength":255
+ },
+ "status":{
+ "type":"string",
+ "readOnly":true,
+ "description":"Status of the image",
+ "enum":[
+ "queued",
+ "saving",
+ "active",
+ "killed",
+ "deleted",
+ "uploading",
+ "importing",
+ "pending_delete",
+ "deactivated"
+ ]
+ },
+ "visibility":{
+ "type":"string",
+ "description":"Scope of image accessibility",
+ "enum":[
+ "community",
+ "public",
+ "private",
+ "shared"
+ ]
+ },
+ "protected":{
+ "type":"boolean",
+ "description":"If true, image will not be deletable."
+ },
+ "os_hidden":{
+ "type":"boolean",
+ "description":"If true, image will not appear in default image list response."
+ },
+ "checksum":{
+ "type":[
+ "null",
+ "string"
+ ],
+ "readOnly":true,
+ "description":"md5 hash of image contents.",
+ "maxLength":32
+ },
+ "os_hash_algo":{
+ "type":[
+ "null",
+ "string"
+ ],
+ "readOnly":true,
+ "description":"Algorithm to calculate the os_hash_value",
+ "maxLength":64
+ },
+ "os_hash_value":{
+ "type":[
+ "null",
+ "string"
+ ],
+ "readOnly":true,
+ "description":"Hexdigest of the image contents using the algorithm specified by the os_hash_algo",
+ "maxLength":128
+ },
+ "owner":{
+ "type":[
+ "null",
+ "string"
+ ],
+ "description":"Owner of the image",
+ "maxLength":255
+ },
+ "size":{
+ "type":[
+ "null",
+ "integer"
+ ],
+ "readOnly":true,
+ "description":"Size of image file in bytes"
+ },
+ "virtual_size":{
+ "type":[
+ "null",
+ "integer"
+ ],
+ "readOnly":true,
+ "description":"Virtual size of image in bytes"
+ },
+ "container_format":{
+ "type":[
+ "null",
+ "string"
+ ],
+ "description":"Format of the container",
+ "enum":[
+ null,
+ "ami",
+ "ari",
+ "aki",
+ "bare",
+ "ovf",
+ "ova",
+ "docker",
+ "compressed"
+ ]
+ },
+ "disk_format":{
+ "type":[
+ "null",
+ "string"
+ ],
+ "description":"Format of the disk",
+ "enum":[
+ null,
+ "ami",
+ "ari",
+ "aki",
+ "vhd",
+ "vhdx",
+ "vmdk",
+ "raw",
+ "qcow2",
+ "vdi",
+ "iso",
+ "ploop"
+ ]
+ },
+ "created_at":{
+ "type":"string",
+ "readOnly":true,
+ "description":"Date and time of image registration"
+ },
+ "updated_at":{
+ "type":"string",
+ "readOnly":true,
+ "description":"Date and time of the last image modification"
+ },
+ "tags":{
+ "type":"array",
+ "description":"List of strings related to the image",
+ "items":{
+ "type":"string",
+ "maxLength":255
+ }
+ },
+ "direct_url":{
+ "type":"string",
+ "readOnly":true,
+ "description":"URL to access the image file kept in external store"
+ },
+ "min_ram":{
+ "type":"integer",
+ "description":"Amount of ram (in MB) required to boot image."
+ },
+ "min_disk":{
+ "type":"integer",
+ "description":"Amount of disk space (in GB) required to boot image."
+ },
+ "self":{
+ "type":"string",
+ "readOnly":true,
+ "description":"An image self url"
+ },
+ "file":{
+ "type":"string",
+ "readOnly":true,
+ "description":"An image file url"
+ },
+ "stores":{
+ "type":"string",
+ "readOnly":true,
+ "description":"Store in which image data resides. Only present when the operator has enabled multiple stores. May be a comma-separated list of store identifiers."
+ },
+ "schema":{
+ "type":"string",
+ "readOnly":true,
+ "description":"An image schema url"
+ },
+ "locations":{
+ "type":"array",
+ "items":{
+ "type":"object",
+ "properties":{
+ "url":{
+ "type":"string",
+ "maxLength":255
+ },
+ "metadata":{
+ "type":"object"
+ },
+ "validation_data":{
+ "description":"Values to be used to populate the corresponding image properties. If the image status is not 'queued', values must exactly match those already contained in the image properties.",
+ "type":"object",
+ "writeOnly":true,
+ "additionalProperties":false,
+ "properties":{
+ "checksum":{
+ "type":"string",
+ "minLength":32,
+ "maxLength":32
+ },
+ "os_hash_algo":{
+ "type":"string",
+ "maxLength":64
+ },
+ "os_hash_value":{
+ "type":"string",
+ "maxLength":128
+ }
+ },
+ "required":[
+ "os_hash_algo",
+ "os_hash_value"
+ ]
+ }
+ },
+ "required":[
+ "url",
+ "metadata"
+ ]
+ },
+ "description":"A set of URLs to access the image file kept in external store"
+ },
+ "kernel_id":{
+ "type":[
+ "null",
+ "string"
+ ],
+ "pattern":"^([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}$",
+ "description":"ID of image stored in Glance that should be used as the kernel when booting an AMI-style image.",
+ "is_base":false
+ },
+ "ramdisk_id":{
+ "type":[
+ "null",
+ "string"
+ ],
+ "pattern":"^([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}$",
+ "description":"ID of image stored in Glance that should be used as the ramdisk when booting an AMI-style image.",
+ "is_base":false
+ },
+ "instance_uuid":{
+ "type":"string",
+ "description":"Metadata which can be used to record which instance this image is associated with. (Informational only, does not create an instance snapshot.)",
+ "is_base":false
+ },
+ "architecture":{
+ "description":"Operating system architecture as specified in ",
+ "type":"string",
+ "is_base":false
+ },
+ "os_distro":{
+ "description":"Common name of operating system distribution as specified in ",
+ "type":"string",
+ "is_base":false
+ },
+ "os_version":{
+ "description":"Operating system version as specified by the distributor.",
+ "type":"string",
+ "is_base":false
+ },
+ "description":{
+ "description":"A human-readable string describing this image.",
+ "type":"string",
+ "is_base":false
+ },
+ "cinder_encryption_key_id":{
+ "description":"Identifier in the OpenStack Key Management Service for the encryption key for the Block Storage Service to use when mounting a volume created from this image",
+ "type":"string",
+ "is_base":false
+ },
+ "cinder_encryption_key_deletion_policy":{
+ "description":"States the condition under which the Image Service will delete the object associated with the 'cinder_encryption_key_id' image property. If this property is missing, the Image Service will take no action",
+ "type":"string",
+ "enum":[
+ "on_image_deletion",
+ "do_not_delete"
+ ],
+ "is_base":false
+ }
+ },
+ "additionalProperties":{
+ "type":"string"
+ },
+ "links":[
+ {
+ "rel":"self",
+ "href":"{self}"
+ },
+ {
+ "rel":"enclosure",
+ "href":"{file}"
+ },
+ {
+ "rel":"describedby",
+ "href":"{schema}"
+ }
+ ]
+}
+```
+
+That's a long scheme!
+
+Here is the API call to start uploading the image information, and it will now move to the "queue" state:
+
+
+```
+`curl -g -i -X POST -H 'b'Content-Type': b'application/json'' -H 'b'X-Auth-Token': b'gAAAAABeS2zzWzAZBqF-whE7SmJt_Atx7tiLZhcL8mf6wJPrO3RBdv4SdnWImxbeSQSqEQdZJnwBT79SWhrtt7QDn-2o6dsAtpUb1Rb7w6xe7Qg_AHQfD5P1rU7tXXtKu2DyYFhtPg2TRQS5viV128FyItyt49Yn_ho3lWfIXaR3TuZzyIz38NU'' -H 'User-Agent: python-glanceclient' -H 'Accept-Encoding: gzip, deflate' -H 'Accept: */*' -H 'Connection: keep-alive' --cacert /etc/pki/ca-trust/source/anchors/cm-local-ca.pem --cert None --key None -d '{"name": "overcloud-full-vmlinuz", "disk_format": "aki", "visibility": "public", "container_format": "bare"}' https://172.16.0.20:13292/v2/images`
+```
+
+Here is the API response:
+
+
+```
+HTTP/1.1 201 Created
+Content-Length: 629
+Content-Type: application/json
+Location:
+Openstack-Image-Import-Methods: web-download
+X-Openstack-Request-Id: req-bd5194f0-b1c2-40d3-a646-8a24ed0a1b1b
+Date: Tue, 18 Feb 2020 04:49:56 GMT
+
+{
+ "name":"overcloud-full-vmlinuz",
+ "disk_format":"aki",
+ "container_format":"bare",
+ "visibility":"public",
+ "size":null,
+ "virtual_size":null,
+ "status":"queued",
+ "checksum":null,
+ "protected":false,
+ "min_ram":0,
+ "min_disk":0,
+ "owner":"c0a46a106d3341649a25b10f2770aff8",
+ "os_hidden":false,
+ "os_hash_algo":null,
+ "os_hash_value":null,
+ "id":"13892850-6add-4c28-87cd-6da62e6f8a3c",
+ "created_at":"2020-02-18T04:49:55Z",
+ "updated_at":"2020-02-18T04:49:55Z",
+ "tags":[
+
+ ],
+ "self":"/v2/images/13892850-6add-4c28-87cd-6da62e6f8a3c",
+ "file":"/v2/images/13892850-6add-4c28-87cd-6da62e6f8a3c/file",
+ "schema":"/v2/schemas/image"
+}
+```
+
+and the SQL call to store the information in the Glance-DB:
+
+
+```
+`INSERT INTO images (created_at, updated_at, deleted_at, deleted, id, name, disk_format, container_format, SIZE, virtual_size, STATUS, visibility, checksum, os_hash_algo, os_hash_value, min_disk, min_ram, owner, protected, os_hidden) VALUES ('2020-02-18 04:49:55.993652', '2020-02-18 04:49:55.993652', NULL, 0, '13892850-6add-4c28-87cd-6da62e6f8a3c', 'overcloud-full-vmlinuz', 'aki', 'bare', NULL, NULL, 'queued', 'public', NULL, NULL, NULL, 0, 0, 'c0a46a106d3341649a25b10f2770aff8', 0, 0)`
+```
+
+Current status:
+
+_Image Created ->_ _**Image Queued**_ _-> Image Saved -> Image Active_
+
+In the Glance architecture, the images are "physically" stored in the specified backend (Swift in this case), so traffic will also hit the Swift endpoint at port 8080. Capturing this traffic will make the .pcap file as large as the images being uploaded (2GB in my case).[*][8]
+
+![Glance architecture][9]
+
+
+```
+SELECT image_properties.created_at AS image_properties_created_at, image_properties.updated_at AS image_properties_updated_at, image_properties.deleted_at AS image_properties_deleted_at, image_properties.deleted AS image_properties_deleted, image_properties.id AS image_properties_id, image_properties.image_id AS image_properties_image_id, image_properties.name AS image_properties_name, image_properties.value AS image_properties_value
+FROM image_properties
+WHERE '13892850-6add-4c28-87cd-6da62e6f8a3c' = image_properties.image_id
+```
+
+You can see some validations happening within the database. At this point, the flow status is "queued" (as shown above), and you can check it here:
+
+![Checking the Glance image status][10]
+
+You can also check it with the following queries, where the **updated_at** field and the flow status are modified accordingly (i.e., queued to saving):
+
+Current status:
+
+_Image Created -> Image Queued ->_ _**Image Saved**_ _-> Image Active_
+
+
+```
+SELECT images.id AS images_id
+FROM images
+WHERE images.id = '13892850-6add-4c28-87cd-6da62e6f8a3c' AND images.status = 'queued'
+UPDATE images SET updated_at='2020-02-18 04:49:56.046542', id='13892850-6add-4c28-87cd-6da62e6f8a3c', name='overcloud-full-vmlinuz', disk_format='aki', container_format='bare', SIZE=NULL, virtual_size=NULL, STATUS='saving', visibility='public', checksum=NULL, os_hash_algo=NULL, os_hash_value=NULL, min_disk=0, min_ram=0, owner='c0a46a106d3341649a25b10f2770aff8', protected=0, os_hidden=0 WHERE images.id = '13892850-6add-4c28-87cd-6da62e6f8a3c' AND images.status = 'queued'
+```
+
+This is validated during the process with the following query:
+
+
+```
+SELECT images.created_at AS images_created_at, images.updated_at AS images_updated_at, images.deleted_at AS images_deleted_at, images.deleted AS images_deleted, images.id AS images_id, images.name AS images_name, images.disk_format AS images_disk_format, images.container_format AS images_container_format, images.size AS images_size, images.virtual_size AS images_virtual_size, images.status AS images_status, images.visibility AS images_visibility, images.checksum AS images_checksum, images.os_hash_algo AS images_os_hash_algo, images.os_hash_value AS images_os_hash_value, images.min_disk AS images_min_disk, images.min_ram AS images_min_ram, images.owner AS images_owner, images.protected AS images_protected, images.os_hidden AS images_os_hidden, image_properties_1.created_at AS image_properties_1_created_at, image_properties_1.updated_at AS image_properties_1_updated_at, image_properties_1.deleted_at AS image_properties_1_deleted_at, image_properties_1.deleted AS image_properties_1_deleted, image_properties_1.id AS image_properties_1_id, image_properties_1.image_id AS image_properties_1_image_id, image_properties_1.name AS image_properties_1_name, image_properties_1.value AS image_properties_1_value, image_locations_1.created_at AS image_locations_1_created_at, image_locations_1.updated_at AS image_locations_1_updated_at, image_locations_1.deleted_at AS image_locations_1_deleted_at, image_locations_1.deleted AS image_locations_1_deleted, image_locations_1.id AS image_locations_1_id, image_locations_1.image_id AS image_locations_1_image_id, image_locations_1.value AS image_locations_1_value, image_locations_1.meta_data AS image_locations_1_meta_data, image_locations_1.status AS image_locations_1_status
+FROM images LEFT OUTER JOIN image_properties AS image_properties_1 ON images.id = image_properties_1.image_id LEFT OUTER JOIN image_locations AS image_locations_1 ON images.id = image_locations_1.image_id
+WHERE images.id = '13892850-6add-4c28-87cd-6da62e6f8a3c'
+```
+
+And you can see its response in the Wireshark capture:
+
+![Wireshark capture][11]
+
+After the image is completely uploaded, its status will change to "active," which means the image is available in the service and ready to use.
+
+
+```
+ "GET /v2/images/13892850-6add-4c28-87cd-6da62e6f8a3c HTTP/1.1" 200
+
+{
+ "name":"overcloud-full-vmlinuz",
+ "disk_format":"aki",
+ "container_format":"bare",
+ "visibility":"public",
+ "size":8106848,
+ "virtual_size":null,
+ "status":"active",
+ "checksum":"5d31ee013d06b83d02c106ea07f20265",
+ "protected":false,
+ "min_ram":0,
+ "min_disk":0,
+ "owner":"c0a46a106d3341649a25b10f2770aff8",
+ "os_hidden":false,
+ "os_hash_algo":"sha512",
+ "os_hash_value":"9f59d36dec7b30f69b696003e7e3726bbbb27a36211a0b31278318c2af0b969ffb279b0991474c18c9faef8b9e96cf372ce4087ca13f5f05338a36f57c281499",
+ "id":"13892850-6add-4c28-87cd-6da62e6f8a3c",
+ "created_at":"2020-02-18T04:49:55Z",
+ "updated_at":"2020-02-18T04:49:56Z",
+ "direct_url":"swift+config://ref1/glance/13892850-6add-4c28-87cd-6da62e6f8a3c",
+ "tags":[
+
+ ],
+ "self":"/v2/images/13892850-6add-4c28-87cd-6da62e6f8a3c",
+ "file":"/v2/images/13892850-6add-4c28-87cd-6da62e6f8a3c/file",
+ "schema":"/v2/schemas/image"
+}
+```
+
+You can also see the database call that updates the current status:
+
+
+```
+`UPDATE images SET updated_at='2020-02-18 04:49:56.571879', id='13892850-6add-4c28-87cd-6da62e6f8a3c', name='overcloud-full-vmlinuz', disk_format='aki', container_format='bare', SIZE=8106848, virtual_size=NULL, STATUS='active', visibility='public', checksum='5d31ee013d06b83d02c106ea07f20265', os_hash_algo='sha512', os_hash_value='9f59d36dec7b30f69b696003e7e3726bbbb27a36211a0b31278318c2af0b969ffb279b0991474c18c9faef8b9e96cf372ce4087ca13f5f05338a36f57c281499', min_disk=0, min_ram=0, owner='c0a46a106d3341649a25b10f2770aff8', protected=0, os_hidden=0 WHERE images.id = '13892850-6add-4c28-87cd-6da62e6f8a3c' AND images.status = 'saving'`
+```
+
+Current status:
+
+_Image Created -> Image Queued -> Image Saved ->_ _**Image Active**_
+
+One interesting thing is that a property in the image is added after the image is uploaded using a PATCH. This property is **hw_architecture** and it is set to **x86_64**:
+
+
+```
+ "PATCH /v2/images/13892850-6add-4c28-87cd-6da62e6f8a3c HTTP/1.1"
+
+curl -g -i -X PATCH -H 'b'Content-Type': b'application/openstack-images-v2.1-json-patch'' -H 'b'X-Auth-Token': b'gAAAAABeS2zzWzAZBqF-whE7SmJt_Atx7tiLZhcL8mf6wJPrO3RBdv4SdnWImxbeSQSqEQdZJnwBT79SWhrtt7QDn-2o6dsAtpUb1Rb7w6xe7Qg_AHQfD5P1rU7tXXtKu2DyYFhtPg2TRQS5viV128FyItyt49Yn_ho3lWfIXaR3TuZzyIz38NU'' -H 'User-Agent: python-glanceclient' -H 'Accept-Encoding: gzip, deflate' -H 'Accept: */*' -H 'Connection: keep-alive' --cacert /etc/pki/ca-trust/source/anchors/cm-local-ca.pem --cert None --key None -d '[{"op": "add", "path": "/hw_architecture", "value": "x86_64"}]'
+
+Response:
+
+{
+ "hw_architecture":"x86_64",
+ "name":"overcloud-full-vmlinuz",
+ "disk_format":"aki",
+ "container_format":"bare",
+ "visibility":"public",
+ "size":8106848,
+ "virtual_size":null,
+ "status":"active",
+ "checksum":"5d31ee013d06b83d02c106ea07f20265",
+ "protected":false,
+ "min_ram":0,
+ "min_disk":0,
+ "owner":"c0a46a106d3341649a25b10f2770aff8",
+ "os_hidden":false,
+ "os_hash_algo":"sha512",
+ "os_hash_value":"9f59d36dec7b30f69b696003e7e3726bbbb27a36211a0b31278318c2af0b969ffb279b0991474c18c9faef8b9e96cf372ce4087ca13f5f05338a36f57c281499",
+ "id":"13892850-6add-4c28-87cd-6da62e6f8a3c",
+ "created_at":"2020-02-18T04:49:55Z",
+ "updated_at":"2020-02-18T04:49:56Z",
+ "direct_url":"swift+config://ref1/glance/13892850-6add-4c28-87cd-6da62e6f8a3c",
+ "tags":[
+
+ ],
+ "self":"/v2/images/13892850-6add-4c28-87cd-6da62e6f8a3c",
+ "file":"/v2/images/13892850-6add-4c28-87cd-6da62e6f8a3c/file",
+ "schema":"/v2/schemas/image"
+}
+```
+
+This is also updated in the MySQL database:
+
+
+```
+`INSERT INTO image_properties (created_at, updated_at, deleted_at, deleted, image_id, name, VALUE) VALUES ('2020-02-18 04:49:56.655780', '2020-02-18 04:49:56.655783', NULL, 0, '13892850-6add-4c28-87cd-6da62e6f8a3c', 'hw_architecture', 'x86_64')`
+```
+
+This is pretty much what happens when you upload an image to Glance. Here's what it looks like if you check on the database:
+
+
+```
+MariaDB [glance]> SELECT images.created_at AS images_created_at, images.updated_at AS images_updated_at, images.deleted_at AS images_deleted_at, images.deleted AS images_deleted, images.id AS images_id, images.name AS images_name, images.disk_format AS images_disk_format, images.container_format AS images_container_format, images.size AS images_size, images.virtual_size AS images_virtual_size, images.status AS images_status, images.visibility AS images_visibility, images.checksum AS images_checksum, images.os_hash_algo AS images_os_hash_algo, images.os_hash_value AS images_os_hash_value, images.min_disk AS images_min_disk, images.min_ram AS images_min_ram, images.owner AS images_owner, images.protected AS images_protected, images.os_hidden AS images_os_hidden, image_properties_1.created_at AS image_properties_1_created_at, image_properties_1.updated_at AS image_properties_1_updated_at, image_properties_1.deleted_at AS image_properties_1_deleted_at, image_properties_1.deleted AS image_properties_1_deleted, image_properties_1.id AS image_properties_1_id, image_properties_1.image_id AS image_properties_1_image_id, image_properties_1.name AS image_properties_1_name, image_properties_1.value AS image_properties_1_value, image_locations_1.created_at AS image_locations_1_created_at, image_locations_1.updated_at AS image_locations_1_updated_at, image_locations_1.deleted_at AS image_locations_1_deleted_at, image_locations_1.deleted AS image_locations_1_deleted, image_locations_1.id AS image_locations_1_id, image_locations_1.image_id AS image_locations_1_image_id, image_locations_1.value AS image_locations_1_value, image_locations_1.meta_data AS image_locations_1_meta_data, image_locations_1.status AS image_locations_1_status FROM images LEFT OUTER JOIN image_properties AS image_properties_1 ON images.id = image_properties_1.image_id LEFT OUTER JOIN image_locations AS image_locations_1 ON images.id = image_locations_1.image_id WHERE images.id = '13892850-6add-4c28-87cd-6da62e6f8a3c'\G;
+*************************** 1. row ***************************
+ images_created_at: 2020-02-18 04:49:55
+ images_updated_at: 2020-02-18 04:49:56
+ images_deleted_at: NULL
+ images_deleted: 0
+ images_id: 13892850-6add-4c28-87cd-6da62e6f8a3c
+ images_name: overcloud-full-vmlinuz
+ images_disk_format: aki
+ images_container_format: bare
+ images_size: 8106848
+ images_virtual_size: NULL
+ images_status: active
+ images_visibility: public
+ images_checksum: 5d31ee013d06b83d02c106ea07f20265
+ images_os_hash_algo: sha512
+ images_os_hash_value: 9f59d36dec7b30f69b696003e7e3726bbbb27a36211a0b31278318c2af0b969ffb279b0991474c18c9faef8b9e96cf372ce4087ca13f5f05338a36f57c281499
+ images_min_disk: 0
+ images_min_ram: 0
+ images_owner: c0a46a106d3341649a25b10f2770aff8
+ images_protected: 0
+ images_os_hidden: 0
+image_properties_1_created_at: 2020-02-18 04:49:56
+image_properties_1_updated_at: 2020-02-18 04:49:56
+image_properties_1_deleted_at: NULL
+ image_properties_1_deleted: 0
+ image_properties_1_id: 11
+ image_properties_1_image_id: 13892850-6add-4c28-87cd-6da62e6f8a3c
+ image_properties_1_name: hw_architecture
+ image_properties_1_value: x86_64
+ image_locations_1_created_at: 2020-02-18 04:49:56
+ image_locations_1_updated_at: 2020-02-18 04:49:56
+ image_locations_1_deleted_at: NULL
+ image_locations_1_deleted: 0
+ image_locations_1_id: 7
+ image_locations_1_image_id: 13892850-6add-4c28-87cd-6da62e6f8a3c
+ image_locations_1_value: swift+config://ref1/glance/13892850-6add-4c28-87cd-6da62e6f8a3c
+ image_locations_1_meta_data: {}
+ image_locations_1_status: active
+1 row in set (0.00 sec)
+```
+
+The final result is:
+
+
+```
+(undercloud) [stack@undercloud ~]$ openstack image list
++--------------------------------------+------------------------+--------+
+| ID | Name | Status |
++--------------------------------------+------------------------+--------+
+| 9a26b9da-3783-4223-bdd7-c553aa194e30 | overcloud-full | active |
+| a2914297-c70f-4021-bc3e-8ec2123f6ea6 | overcloud-full-initrd | active |
+| 13892850-6add-4c28-87cd-6da62e6f8a3c | overcloud-full-vmlinuz | active |
++--------------------------------------+------------------------+--------+
+(undercloud) [stack@undercloud ~]$
+```
+
+Some other minor things are happening during this process, but overall, this is how it looks.
+
+### Conclusion
+
+Understanding the flow of the most common actions in the OpenStack platform will enable you to enhance your troubleshooting skills when facing some issues at work. You can check the status of an image in Glance; know whether an image is in a "queued," "saving," or "active" state; and do some captures in your environment to see what is going on by checking the endpoints you need to check.
+
+I enjoy debugging. I consider this is an important skill for any role—whether you are working in a support, consulting, developer (of course!), or architect role. I hope this article gave you some basic guidelines to start debugging things.
+
+* * *
+
+* In case you're wondering how to open a 2GB .pcap file without problems, here is one way to do it:
+
+
+```
+`$ editcap -c 5000 image-upload.pcap upload-overcloud-image.pcap`
+```
+
+This splits your huge capture in smaller captures of 5,000 packets each.
+
+* * *
+
+_This article was [originally posted][12] on LinkedIn and is reprinted with permission._
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/glance
+
+作者:[Jair Patete][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/jpatete
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/yourimagehere_520x292.png?itok=V-xhX7KL (blank background that says your image here)
+[2]: https://www.openstack.org/software/releases/ocata/components/glance
+[3]: https://www.openstack.org/
+[4]: https://wiki.openstack.org/wiki/TripleO
+[5]: https://www.tcpdump.org/
+[6]: https://docs.openstack.org/keystone/latest/
+[7]: https://opensource.com/sites/default/files/uploads/glance-db-calls.png (Searching "glance" inside tcpdump)
+[8]: tmp.qBKg0ttLIJ#*
+[9]: https://opensource.com/sites/default/files/uploads/glance-architecture.png (Glance architecture)
+[10]: https://opensource.com/sites/default/files/uploads/check-flow-status.png (Checking the Glance image status)
+[11]: https://opensource.com/sites/default/files/uploads/wireshark-capture.png (Wireshark capture)
+[12]: https://www.linkedin.com/pulse/what-happens-behind-doors-when-we-upload-image-glance-patete-garc%25C3%25ADa/?trackingId=czWiFC4dRfOsSZJ%2BXdzQfg%3D%3D
diff --git a/sources/tech/20200317 Create Stunning Pixel Art With Free and Open Source Editor Pixelorama.md b/sources/tech/20200317 Create Stunning Pixel Art With Free and Open Source Editor Pixelorama.md
new file mode 100644
index 0000000000..fc3c4b7bab
--- /dev/null
+++ b/sources/tech/20200317 Create Stunning Pixel Art With Free and Open Source Editor Pixelorama.md
@@ -0,0 +1,108 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Create Stunning Pixel Art With Free and Open Source Editor Pixelorama)
+[#]: via: (https://itsfoss.com/pixelorama/)
+[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
+
+Create Stunning Pixel Art With Free and Open Source Editor Pixelorama
+======
+
+_**Brief: Pixelorama is a cross-platform, free and open source 2D sprite editor. It provides all the necessary tools to create pixel art in a neat user interface.**_
+
+### Pixelorama: open source sprite editor
+
+[Pixelorama][1] is a tool created by young game developers at [Orama Interactive][2]. They have developed a few 2D games and a couple of them use pixel art.
+
+While Orama is primarily into game development, the developers are also creating utility tools that help them (and others) create those games.
+
+The free and open source sprite editor, Pixelorama is such a utility tool. It’s built on top of [Godot Engine][3] and is perfect for creating pixel art.
+
+![Pixelorama screenshot][4]
+
+You see the pixel art in the screenshot above? It’s been created using Pixelorama. This video shows a timelapse video of creating the above image.
+
+### Features of Pixelorama
+
+Here are the main features Pixelorama provides:
+
+ * Multiple tools like penicl, erase, fill bucket color picker etc
+ * Multiple layer system that allows you to add, remove, move up and down, clone and merge as many layers as you like
+ * Support for spritesheets
+ * Import images and edit them inside Pixelorama
+ * Animation timeline with [Onion Skinning][5]
+ * Custom brushes
+ * Save and open your projects in Pixelorama’s custom file format, .pxo
+ * Horizontal & vertical mirrored drawing
+ * Tile Mode for pattern creation
+ * Split screen mode and mini canvas preview
+ * Zoom with mouse scroll wheel
+ * Unlimited undo and redo
+ * Scale, crop, flip, rotate, color invert and desaturate your images
+ * Keyboard shortcuts
+ * Available in several languages
+ * Supports Linux, Windows and macOS
+
+
+
+### Installing Pixelorama on Linux
+
+Pixelorama is available as a Snap application and if you are using Ubuntu, you can find it in the software center itself.
+
+![Pixelorama is available in Ubuntu Software Center][6]
+
+Alternatively, if you have [Snap support enabled on your Linux distribution][7], you can install it using this command:
+
+```
+sudo snap install pixelorama
+```
+
+If you don’t want to use Snap, no worries. You can download the latest release of Pixelorama from [their GitHub repository][8], [extract the zip file][9] and you’ll see an executable file. Give this file execute permission and double click on it to run the application.
+
+[Download Pixelorama][10]
+
+**Conclusion**
+
+![Pixelorama Welcome Screen][11]
+
+In the Pixeloaram features, it says that you can import images and edit them. I guess that’s only true for certain kind of files because when I tried to import PNG or JPEG files, the application crashed.
+
+However, I could easily doodle like a 3 year old and make random pixel art. I am not that into arts but I think this is a [useful tool for digital artists on Linux][12].
+
+I liked the idea that despite being game developers, they are creating tools that could help other game developers and artists. That’s the spirit of open source.
+
+If you like the project and will be using it, consider supporting them by a donation. [It’s FOSS has made a humble donation][13] of $25 to thank their effort.
+
+[Donate to Pixelorama (personal Paypal account of the lead developer)][14]
+
+Do you like Pixelorama? Do you use some other open source sprite editor? Feel free to share your views in the comment section.
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/pixelorama/
+
+作者:[Abhishek Prakash][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/abhishek/
+[b]: https://github.com/lujun9972
+[1]: https://www.orama-interactive.com/pixelorama
+[2]: https://www.orama-interactive.com/
+[3]: https://godotengine.org/
+[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/03/pixelorama-v6.jpg?ssl=1
+[5]: https://en.wikipedia.org/wiki/Onion_skinning
+[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/pixelorama-ubuntu-software-center.jpg?ssl=1
+[7]: https://itsfoss.com/install-snap-linux/
+[8]: https://github.com/Orama-Interactive/Pixelorama
+[9]: https://itsfoss.com/unzip-linux/
+[10]: https://github.com/Orama-Interactive/Pixelorama/releases
+[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/03/pixelorama.jpg?ssl=1
+[12]: https://itsfoss.com/best-linux-graphic-design-software/
+[13]: https://itsfoss.com/donations-foss/
+[14]: https://www.paypal.me/erevos
diff --git a/sources/tech/20200318 Share data between C and Python with this messaging library.md b/sources/tech/20200318 Share data between C and Python with this messaging library.md
new file mode 100644
index 0000000000..cda6e54e33
--- /dev/null
+++ b/sources/tech/20200318 Share data between C and Python with this messaging library.md
@@ -0,0 +1,663 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Share data between C and Python with this messaging library)
+[#]: via: (https://opensource.com/article/20/3/zeromq-c-python)
+[#]: author: (Cristiano L. Fontana https://opensource.com/users/cristianofontana)
+
+Share data between C and Python with this messaging library
+======
+ZeroMQ makes for a fast and resilient messaging library to gather data
+and share between multiple languages.
+![Chat via email][1]
+
+I've had moments as a software engineer when I'm asked to do a task that sends shivers down my spine. One such moment was when I had to write an interface between some new hardware infrastructure that requires C and a cloud infrastructure, which is primarily Python.
+
+One strategy could be to [write an extension in C][2], which Python supports by design. A quick glance at the documentation shows this would mean writing a good amount of C. That can be good in some cases, but it's not what I prefer to do. Another strategy is to put the two tasks in separate processes and exchange messages between the two with the [ZeroMQ messaging library][3].
+
+When I experienced this type of scenario before discovering ZeroMQ, I went through the extension-writing path. It was not that bad, but it is very time-consuming and convoluted. Nowadays, to avoid that, I subdivide a system into independent processes that exchange information through messages sent over [communication sockets][4]. With this approach, several programming languages can coexist, and each process is simpler and thus easier to debug.
+
+ZeroMQ provides an even easier process:
+
+ 1. Write a small shim in C that reads data from the hardware and sends whatever it finds as a message.
+ 2. Write a Python interface between the new and existing infrastructure.
+
+
+
+One of ZeroMQ's project's founders is [Pieter Hintjens][5], a remarkable person with [interesting views and writings][6].
+
+### Prerequisites
+
+For this tutorial, you will need:
+
+ * A C compiler (e.g., [GCC][7] or [Clang][8])
+ * The [**libzmq** library][9]
+ * [Python 3][10]
+ * [ZeroMQ bindings][11] for python
+
+
+
+Install them on Fedora with:
+
+
+```
+`$ dnf install clang zeromq zeromq-devel python3 python3-zmq`
+```
+
+For Debian or Ubuntu:
+
+
+```
+`$ apt-get install clang libzmq5 libzmq3-dev python3 python3-zmq`
+```
+
+If you run into any issues, refer to each project's installation instructions (which are linked above).
+
+### Writing the hardware-interfacing library
+
+Since this is a hypothetical scenario, this tutorial will write a fictitious library with two functions:
+
+ * **fancyhw_init()** to initiate the (hypothetical) hardware
+ * **fancyhw_read_val()** to return a value read from the hardware
+
+
+
+Save the library's full source code to a file named **libfancyhw.h**:
+
+
+```
+#ifndef LIBFANCYHW_H
+#define LIBFANCYHW_H
+
+#include <stdlib.h>
+#include <stdint.h>
+
+// This is the fictitious hardware interfacing library
+
+void fancyhw_init(unsigned int init_param)
+{
+ [srand][12](init_param);
+}
+
+int16_t fancyhw_read_val(void)
+{
+ return (int16_t)[rand][13]();
+}
+
+#endif
+```
+
+This library can simulate the data you want to pass between languages, thanks to the random number generator.
+
+### Designing a C interface
+
+The following will go step-by-step through writing the C interface—from including the libraries to managing the data transfer.
+
+#### Libraries
+
+Begin by loading the necessary libraries (the purpose of each library is in a comment in the code):
+
+
+```
+// For printf()
+#include <stdio.h>
+// For EXIT_*
+#include <stdlib.h>
+// For memcpy()
+#include <string.h>
+// For sleep()
+#include <unistd.h>
+
+#include <zmq.h>
+
+#include "libfancyhw.h"
+```
+
+#### Significant parameters
+
+Define the **main** function and the significant parameters needed for the rest of the program:
+
+
+```
+int main(void)
+{
+ const unsigned int INIT_PARAM = 12345;
+ const unsigned int REPETITIONS = 10;
+ const unsigned int PACKET_SIZE = 16;
+ const char *TOPIC = "fancyhw_data";
+
+ ...
+```
+
+#### Initialization
+
+Both libraries need some initialization. The fictitious one needs just one parameter:
+
+
+```
+`fancyhw_init(INIT_PARAM);`
+```
+
+The ZeroMQ library needs some real initialization. First, define a **context**—an object that manages all the sockets:
+
+
+```
+void *context = zmq_ctx_new();
+
+if (!context)
+{
+ [printf][14]("ERROR: ZeroMQ error occurred during zmq_ctx_new(): %s\n", zmq_strerror(errno));
+
+ return EXIT_FAILURE;
+}
+```
+
+Then define the socket used to deliver data. ZeroMQ supports several types of sockets, each with its application. Use a **publish** socket (also known as **PUB** socket), which can deliver copies of a message to multiple receivers. This approach enables you to attach several receivers that will all get the same messages. If there are no receivers, the messages will be discarded (i.e., they will not be queued). Do this with:
+
+
+```
+`void *data_socket = zmq_socket(context, ZMQ_PUB);`
+```
+
+The socket must be bound to an address so that the clients know where to connect. In this case, use the [TCP transport layer][15] (there are [other options][16], but TCP is a good default choice):
+
+
+```
+const int rb = zmq_bind(data_socket, "tcp://*:5555");
+
+if (rb != 0)
+{
+ [printf][14]("ERROR: ZeroMQ error occurred during zmq_ctx_new(): %s\n", zmq_strerror(errno));
+
+ return EXIT_FAILURE;
+}
+```
+
+Next, calculate some useful values that you will need later. Note **TOPIC** in the code below; **PUB** sockets need a topic to be associated with the messages they send. Topics can be used by the receivers to filter messages:
+
+
+```
+const size_t topic_size = [strlen][17](TOPIC);
+const size_t envelope_size = topic_size + 1 + PACKET_SIZE * sizeof(int16_t);
+
+[printf][14]("Topic: %s; topic size: %zu; Envelope size: %zu\n", TOPIC, topic_size, envelope_size);
+```
+
+#### Sending messages
+
+Start a loop that sends **REPETITIONS** messages:
+
+
+```
+for (unsigned int i = 0; i < REPETITIONS; i++)
+{
+ ...
+```
+
+Before sending a message, fill a buffer of **PACKET_SIZE** values. The library provides signed integers of 16 bits. Since the dimension of an **int** in C is not defined, use an **int** with a specific width:
+
+
+```
+int16_t buffer[PACKET_SIZE];
+
+for (unsigned int j = 0; j < PACKET_SIZE; j++)
+{
+ buffer[j] = fancyhw_read_val();
+}
+
+[printf][14]("Read %u data values\n", PACKET_SIZE);
+```
+
+The first step in message preparation and delivery is creating a ZeroMQ message and allocating the memory necessary for your message. This empty message is an envelope to store the data you will ship:
+
+
+```
+zmq_msg_t envelope;
+
+const int rmi = zmq_msg_init_size(&envelope, envelope_size);
+if (rmi != 0)
+{
+ [printf][14]("ERROR: ZeroMQ error occurred during zmq_msg_init_size(): %s\n", zmq_strerror(errno));
+
+ zmq_msg_close(&envelope);
+
+ break;
+}
+```
+
+Now that the memory is allocated, store the data in the ZeroMQ message "envelope." The **zmq_msg_data()** function returns a pointer to the beginning of the buffer in the envelope. The first part is the topic, followed by a space, then the binary data. Add whitespace as a separator between the topic and the data. To move along the buffer, you have to play with casts and [pointer arithmetic][18]. (Thank you, C, for making things straightforward.) Do this with:
+
+
+```
+[memcpy][19](zmq_msg_data(&envelope), TOPIC, topic_size);
+[memcpy][19]((void*)((char*)zmq_msg_data(&envelope) + topic_size), " ", 1);
+[memcpy][19]((void*)((char*)zmq_msg_data(&envelope) + 1 + topic_size), buffer, PACKET_SIZE * sizeof(int16_t));
+```
+
+Send the message through the **data_socket**:
+
+
+```
+const size_t rs = zmq_msg_send(&envelope, data_socket, 0);
+if (rs != envelope_size)
+{
+ [printf][14]("ERROR: ZeroMQ error occurred during zmq_msg_send(): %s\n", zmq_strerror(errno));
+
+ zmq_msg_close(&envelope);
+
+ break;
+}
+```
+
+Make sure to dispose of the envelope after you use it:
+
+
+```
+zmq_msg_close(&envelope);
+
+[printf][14]("Message sent; i: %u, topic: %s\n", i, TOPIC);
+```
+
+#### Clean it up
+
+Because C does not provide [garbage collection][20], you have to tidy up. After you are done sending your messages, close the program with the clean-up needed to release the used memory:
+
+
+```
+const int rc = zmq_close(data_socket);
+
+if (rc != 0)
+{
+ [printf][14]("ERROR: ZeroMQ error occurred during zmq_close(): %s\n", zmq_strerror(errno));
+
+ return EXIT_FAILURE;
+}
+
+const int rd = zmq_ctx_destroy(context);
+
+if (rd != 0)
+{
+ [printf][14]("Error occurred during zmq_ctx_destroy(): %s\n", zmq_strerror(errno));
+
+ return EXIT_FAILURE;
+}
+
+return EXIT_SUCCESS;
+```
+
+#### The entire C program
+
+Save the full interface library below to a local file called **hw_interface.c**:
+
+
+```
+// For printf()
+#include <stdio.h>
+// For EXIT_*
+#include <stdlib.h>
+// For memcpy()
+#include <string.h>
+// For sleep()
+#include <unistd.h>
+
+#include <zmq.h>
+
+#include "libfancyhw.h"
+
+int main(void)
+{
+ const unsigned int INIT_PARAM = 12345;
+ const unsigned int REPETITIONS = 10;
+ const unsigned int PACKET_SIZE = 16;
+ const char *TOPIC = "fancyhw_data";
+
+ fancyhw_init(INIT_PARAM);
+
+ void *context = zmq_ctx_new();
+
+ if (!context)
+ {
+ [printf][14]("ERROR: ZeroMQ error occurred during zmq_ctx_new(): %s\n", zmq_strerror(errno));
+
+ return EXIT_FAILURE;
+ }
+
+ void *data_socket = zmq_socket(context, ZMQ_PUB);
+
+ const int rb = zmq_bind(data_socket, "tcp://*:5555");
+
+ if (rb != 0)
+ {
+ [printf][14]("ERROR: ZeroMQ error occurred during zmq_ctx_new(): %s\n", zmq_strerror(errno));
+
+ return EXIT_FAILURE;
+ }
+
+ const size_t topic_size = [strlen][17](TOPIC);
+ const size_t envelope_size = topic_size + 1 + PACKET_SIZE * sizeof(int16_t);
+
+ [printf][14]("Topic: %s; topic size: %zu; Envelope size: %zu\n", TOPIC, topic_size, envelope_size);
+
+ for (unsigned int i = 0; i < REPETITIONS; i++)
+ {
+ int16_t buffer[PACKET_SIZE];
+
+ for (unsigned int j = 0; j < PACKET_SIZE; j++)
+ {
+ buffer[j] = fancyhw_read_val();
+ }
+
+ [printf][14]("Read %u data values\n", PACKET_SIZE);
+
+ zmq_msg_t envelope;
+
+ const int rmi = zmq_msg_init_size(&envelope, envelope_size);
+ if (rmi != 0)
+ {
+ [printf][14]("ERROR: ZeroMQ error occurred during zmq_msg_init_size(): %s\n", zmq_strerror(errno));
+
+ zmq_msg_close(&envelope);
+
+ break;
+ }
+
+ [memcpy][19](zmq_msg_data(&envelope), TOPIC, topic_size);
+
+ [memcpy][19]((void*)((char*)zmq_msg_data(&envelope) + topic_size), " ", 1);
+
+ [memcpy][19]((void*)((char*)zmq_msg_data(&envelope) + 1 + topic_size), buffer, PACKET_SIZE * sizeof(int16_t));
+
+ const size_t rs = zmq_msg_send(&envelope, data_socket, 0);
+ if (rs != envelope_size)
+ {
+ [printf][14]("ERROR: ZeroMQ error occurred during zmq_msg_send(): %s\n", zmq_strerror(errno));
+
+ zmq_msg_close(&envelope);
+
+ break;
+ }
+
+ zmq_msg_close(&envelope);
+
+ [printf][14]("Message sent; i: %u, topic: %s\n", i, TOPIC);
+
+ sleep(1);
+ }
+
+ const int rc = zmq_close(data_socket);
+
+ if (rc != 0)
+ {
+ [printf][14]("ERROR: ZeroMQ error occurred during zmq_close(): %s\n", zmq_strerror(errno));
+
+ return EXIT_FAILURE;
+ }
+
+ const int rd = zmq_ctx_destroy(context);
+
+ if (rd != 0)
+ {
+ [printf][14]("Error occurred during zmq_ctx_destroy(): %s\n", zmq_strerror(errno));
+
+ return EXIT_FAILURE;
+ }
+
+ return EXIT_SUCCESS;
+}
+```
+
+Compile using the command:
+
+
+```
+`$ clang -std=c99 -I. hw_interface.c -lzmq -o hw_interface`
+```
+
+If there are no compilation errors, you can run the interface. What's great is that ZeroMQ **PUB** sockets can run without any applications sending or retrieving data. That reduces complexity because there is no obligation in terms of which process needs to start first.
+
+Run the interface:
+
+
+```
+$ ./hw_interface
+Topic: fancyhw_data; topic size: 12; Envelope size: 45
+Read 16 data values
+Message sent; i: 0, topic: fancyhw_data
+Read 16 data values
+Message sent; i: 1, topic: fancyhw_data
+Read 16 data values
+...
+...
+```
+
+The output shows the data being sent through ZeroMQ. Now you need an application to read the data.
+
+### Write a Python data processor
+
+You are now ready to pass the data from C to a Python application.
+
+#### Libraries
+
+You need two libraries to help transfer data. First, you need ZeroMQ bindings in Python:
+
+
+```
+`$ python3 -m pip install zmq`
+```
+
+The other is the [**struct** library][21], which decodes binary data. It's commonly available with the Python standard library, so there's no need to **pip install** it.
+
+The first part of the Python program imports both of these libraries:
+
+
+```
+import zmq
+import struct
+```
+
+#### Significant parameters
+
+To use ZeroMQ, you must subscribe to the same topic used in the constant **TOPIC** above:
+
+
+```
+topic = "fancyhw_data".encode('ascii')
+
+print("Reading messages with topic: {}".format(topic))
+```
+
+#### Initialization
+
+Next, initialize the context and the socket. Use a **subscribe** socket (also known as a **SUB** socket), which is the natural partner of the **PUB** socket. The socket also needs to subscribe to the right topic:
+
+
+```
+with zmq.Context() as context:
+ socket = context.socket(zmq.SUB)
+
+ socket.connect("tcp://127.0.0.1:5555")
+ socket.setsockopt(zmq.SUBSCRIBE, topic)
+
+ i = 0
+
+ ...
+```
+
+#### Receiving messages
+
+Start an infinite loop that waits for new messages to be delivered to the SUB socket. The loop will be closed if you press **Ctrl+C** or if an error occurs:
+
+
+```
+ try:
+ while True:
+
+ ... # we will fill this in next
+
+ except KeyboardInterrupt:
+ socket.close()
+ except Exception as error:
+ print("ERROR: {}".format(error))
+ socket.close()
+```
+
+The loop waits for new messages to arrive with the **recv()** method. Then it splits whatever is received at the first space to separate the topic from the content:
+
+
+```
+`binary_topic, data_buffer = socket.recv().split(b' ', 1)`
+```
+
+#### Decoding messages
+
+Python does yet not know that the topic is a string, so decode it using the standard ASCII encoding:
+
+
+```
+topic = binary_topic.decode(encoding = 'ascii')
+
+print("Message {:d}:".format(i))
+print("\ttopic: '{}'".format(topic))
+```
+
+The next step is to read the binary data using the **struct** library, which can convert shapeless binary blobs to significant values. First, calculate the number of values stored in the packet. This example uses 16-bit signed integers that correspond to an "h" in the **struct** [format][22]:
+
+
+```
+packet_size = len(data_buffer) // struct.calcsize("h")
+
+print("\tpacket size: {:d}".format(packet_size))
+```
+
+By knowing how many values are in the packet, you can define the format by preparing a string with the number of values and their types (e.g., "**16h**"):
+
+
+```
+`struct_format = "{:d}h".format(packet_size)`
+```
+
+Convert that binary blob to a series of numbers that you can immediately print:
+
+
+```
+data = struct.unpack(struct_format, data_buffer)
+
+print("\tdata: {}".format(data))
+```
+
+#### The full Python program
+
+Here is the complete data receiver in Python:
+
+
+```
+#! /usr/bin/env python3
+
+import zmq
+import struct
+
+topic = "fancyhw_data".encode('ascii')
+
+print("Reading messages with topic: {}".format(topic))
+
+with zmq.Context() as context:
+ socket = context.socket(zmq.SUB)
+
+ socket.connect("tcp://127.0.0.1:5555")
+ socket.setsockopt(zmq.SUBSCRIBE, topic)
+
+ i = 0
+
+ try:
+ while True:
+ binary_topic, data_buffer = socket.recv().split(b' ', 1)
+
+ topic = binary_topic.decode(encoding = 'ascii')
+
+ print("Message {:d}:".format(i))
+ print("\ttopic: '{}'".format(topic))
+
+ packet_size = len(data_buffer) // struct.calcsize("h")
+
+ print("\tpacket size: {:d}".format(packet_size))
+
+ struct_format = "{:d}h".format(packet_size)
+
+ data = struct.unpack(struct_format, data_buffer)
+
+ print("\tdata: {}".format(data))
+
+ i += 1
+
+ except KeyboardInterrupt:
+ socket.close()
+ except Exception as error:
+ print("ERROR: {}".format(error))
+ socket.close()
+```
+
+Save it to a file called **online_analysis.py**. Python does not need to be compiled, so you can run the program immediately.
+
+Here is the output:
+
+
+```
+$ ./online_analysis.py
+Reading messages with topic: b'fancyhw_data'
+Message 0:
+ topic: 'fancyhw_data'
+ packet size: 16
+ data: (20946, -23616, 9865, 31416, -15911, -10845, -5332, 25662, 10955, -32501, -18717, -24490, -16511, -28861, 24205, 26568)
+Message 1:
+ topic: 'fancyhw_data'
+ packet size: 16
+ data: (12505, 31355, 14083, -19654, -9141, 14532, -25591, 31203, 10428, -25564, -732, -7979, 9529, -27982, 29610, 30475)
+...
+...
+```
+
+### Conclusion
+
+This tutorial describes an alternative way of gathering data from C-based hardware interfaces and providing it to Python-based infrastructures. You can take this data and analyze it or pass it off in any number of directions. It employs a messaging library to deliver data between a "gatherer" and an "analyzer" instead of having a monolithic piece of software that does everything.
+
+This tutorial also increases what I call "software granularity." In other words, it subdivides the software into smaller units. One of the benefits of this strategy is the possibility of using different programming languages at the same time with minimal interfaces acting as shims between them.
+
+In practice, this design allows software engineers to work both more collaboratively and independently. Different teams may work on different steps of the analysis, choosing the tool they prefer. Another benefit is the parallelism that comes for free since all the processes can run in parallel. The [ZeroMQ messaging library][3] is a remarkable piece of software that makes all of this much easier.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/zeromq-c-python
+
+作者:[Cristiano L. Fontana][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/cristianofontana
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/email_chat_communication_message.png?itok=LKjiLnQu (Chat via email)
+[2]: https://docs.python.org/3/extending/extending.html
+[3]: https://zeromq.org/
+[4]: https://en.wikipedia.org/wiki/Network_socket
+[5]: https://en.wikipedia.org/wiki/Pieter_Hintjens
+[6]: http://hintjens.com/
+[7]: https://gcc.gnu.org/
+[8]: https://clang.llvm.org/
+[9]: https://github.com/zeromq/libzmq#installation-of-binary-packages-
+[10]: https://www.python.org/downloads/
+[11]: https://zeromq.org/languages/python/
+[12]: http://www.opengroup.org/onlinepubs/009695399/functions/srand.html
+[13]: http://www.opengroup.org/onlinepubs/009695399/functions/rand.html
+[14]: http://www.opengroup.org/onlinepubs/009695399/functions/printf.html
+[15]: https://en.wikipedia.org/wiki/Transmission_Control_Protocol
+[16]: http://zguide.zeromq.org/page:all#Plugging-Sockets-into-the-Topology
+[17]: http://www.opengroup.org/onlinepubs/009695399/functions/strlen.html
+[18]: https://en.wikipedia.org/wiki/Pointer_%28computer_programming%29%23C_and_C++
+[19]: http://www.opengroup.org/onlinepubs/009695399/functions/memcpy.html
+[20]: https://en.wikipedia.org/wiki/Garbage_collection_(computer_science)
+[21]: https://docs.python.org/3/library/struct.html
+[22]: https://docs.python.org/3/library/struct.html#format-characters
diff --git a/sources/tech/20200319 7 open hardware projects working to solve COVID-19.md b/sources/tech/20200319 7 open hardware projects working to solve COVID-19.md
new file mode 100644
index 0000000000..cb37a20e31
--- /dev/null
+++ b/sources/tech/20200319 7 open hardware projects working to solve COVID-19.md
@@ -0,0 +1,207 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (7 open hardware projects working to solve COVID-19)
+[#]: via: (https://opensource.com/article/20/3/open-hardware-covid19)
+[#]: author: (Harris Kenny https://opensource.com/users/harriskenny)
+
+7 open hardware projects working to solve COVID-19
+======
+Open hardware solutions can prevent the spread and suffering of the
+novel coronavirus.
+![open on blue background with heartbeat symbol][1]
+
+The open source [hardware][2] movement has long championed the importance of the right to repair, fully own the technology you buy, and be able to remix and reproduce gadgets, just like you can with music. And so, during this challenging time, open hardware is providing some answers to some of the problems created by the coronavirus pandemic.
+
+### An overview of what's happening
+
+For one, hardware developers around the world are working to resolve supply chain weaknesses using open source, the same philosophy that has driven a proliferation of new software technologies over the last 30 years. The hardware movement's past successes include the [RepRap Project][3], [Open Source Ecology][4], and [Open Source Beehives][5], proving this can be done.
+
+There has been increasing interest in creators using 3D printing and other technologies to create replacement parts for and manufacturing of safety equipment on demand. For example, the Polytechnic University lab in Hong Kong [3D printed face shields][6] for hospital workers. And Italian startup Isinnova partnered with the FabLab in Milan to [3D-print replacement valves][7] for reanimation devices in hard-hit Northern Italy. Companies are also releasing designs to adapt our physical interactions, like this [3D printed hands-free door opener][8] from Materialise. These examples of replacing parts and solving problems are an excellent start and appear to be saving lives.
+
+Another traditional hardware technique is picking up steam: sewing. The AFP reports that there is an acute need for face masks around the world and guidance from the World Health Organization about their importance. With single-use, disposable masks being prioritized for healthcare workers, in the Czech Republic people are [taking to sewing to make their own masks][9]. (Repeat-use masks do introduce sterility concerns.) The Facebook group "Czechia sews face masks" started to address this problem in their country, with tens of thousands of members using their at-home sewing machines.
+
+Open source hardware equipment and machinery projects are also gaining traction. First, there is testing equipment that is sophisticated and highly capable. Next, there is medical equipment that can be categorized as field-grade (at best) for scenarios with no other option. These projects are outlined in detail below.
+
+To learn more, I spoke with Jason Huggins, founder and CEO of Chicago-based [Tapster Robotics][10]. Tapster Robotics designs and manufactures desktop robots using 3D printing, computer numerical control (CNC) machining, and open electronics like [Arduino][11]. He has both the technical know-how and the industrial capacity to make an impact. And he wants to commit his company's resources to help in this fight.
+
+"Basically, we're in a World War II mobilization moment right now. Even though I'm not a doctor, we should still all follow the Hippocratic Oath. Whatever I do, I don't want to make the problem worse," Huggins explains. "As a counterpoint, there is WHO executive director Dr. Michael Ryan's comment: 'Speed trumps perfection,'" Huggins argues.
+
+> Wow.
+>
+> This man is the global authority on the spread of disease. If you are a leader (in any capacity) watch this. If you are not, watch it too. [pic.twitter.com/bFogaekehM][12]
+>
+> — Jim Richards Sh🎙wgram (@JIMrichards1010) [March 15, 2020][13]
+
+Huggins has extensive experience with delivering during times of need. His efforts were instrumental in helping [Healthcare.gov][14] scale after its challenging initial launch. He also created the software industry-standard testing frameworks Selenium and Appium. With this experience, his advice is well worth considering.
+
+I also spoke with Seattle-based attorney Mark Tyson of [Tyson Law][15], who works with startups and small businesses. He has direct experience working with nimble companies in rapidly evolving industries. In framing the overall question, Tyson begins:
+
+> Good Samaritan laws protect volunteers—i.e., “Good Samaritans”—from being held liable as a result of their decision to give aid during an emergency. While the specifics of these laws vary by state, they share a common public policy rationale: namely, encouraging bystanders to help others facing an emergency. Conceivably, this rationale could justify application of these types of laws in less traditional settings than, say, pulling the victim of a car accident out of harm’s way.
+
+Applying this specific situation, Tyson notes:
+
+> "Before taking action, creators would be wise to speak with an attorney to conduct a state-specific risk assessment. It would also be prudent to ask larger institutions, like hospitals or insurers, to accept potential liability exposure via contract—for instance, through the use of indemnification agreements, whereby the hospital or its insurer agrees to indemnify the creator for liability."
+
+Tyson understands the urgency and gravity of the situation. This option to use contracts is not meant to be a roadblock; instead, it may be a way to help adoption happen at scale to make a bigger difference faster. It is up to you or your organization to make this determination.
+
+With all that said, let's explore the projects that are in use or in development (and may be available for deployment soon).
+
+### 7 open hardware projects fighting COVID-19
+
+#### Opentrons
+
+[Opentrons][16]' open source lab automation platform is comprised of a suite of open source hardware, verified labware, consumables, reagents, and workstations. Opentrons says its products can help dramatically [scale-up COVID-19 testing][17] with systems that can "automate up to 2,400 tests per day within days of an order being placed." It plans to ramp up to 1 million tested samples by July 1.
+
+![Opentrons roadmap graphic][18]
+
+From the Opentrons [website][17], Copyright
+
+The company is already working with federal and local government agencies to determine if its systems can be used for clinical diagnosis under an [emergency use authorization][19]. Opentrons is shared under an [Apache 2.0 license][20]. I first learned of it from biologist Kristin Ellis, who is affiliated with the project.
+
+#### Chai Open qPCR
+
+Chai's [Open qPCR][21] device uses [polymerase chain reaction][22] (PCR) to rapidly test swabs from surfaces (e.g., door handles and elevator buttons) to see if the novel coronavirus is present. This open source hardware shared under an [Apache 2.0 license][23] uses a [BeagleBone][24] low-power Linux computer. Data from the Chai Open qPCR can enable public health, civic, and business leaders to make more informed decisions about cleaning, mitigation, facility closures, contract tracing, and testing.
+
+#### OpenPCR
+
+[OpenPCR][25] is a PCR testing device kit from Josh Perfetto and Jessie Ho, the creators behind the Chai Open qPCR. This is more of a DIY open source device than their previous project, but it has the same use case: using environmental testing to identify the coronavirus in the field. As the project page states, "traditional real-time PCR machines capable of detecting these pathogens typically cost upwards of $30,000 US dollars and are not suitable for field usage." Because OpenPCR is a kit users build and is shared under a [GPLv3.0 license][26], the device aims to democratize access to molecular diagnostics.
+
+![OpenPCR][27]
+
+From the OpenPCR [website][25], Copyright
+
+And, like any good open source project, there is a derivative! [WildOpenPCR][28] by [GaudiLabs][29] in Switzerland is also shared under a [GPLv3.0 license][30].
+
+#### PocketPCR
+
+Gaudi Labs' [PocketPCR][31] thermocycler is used to activate biological reactions by raising and lowering the temperature of a liquid in small test tubes. It can be powered with a simple USB power adapter, either tethered to a device or on its own, with preset parameters that don't require a computer or smartphone.
+
+![PocketPCR][32]
+
+From the PocketPCR [website][31], Copyright
+
+Like the other PCR options described in this article, this device may facilitate environmental testing for coronavirus, although its project page does not explicitly state so. PocketPCR is shared under a [GPLv3.0 license][33].
+
+#### Open Lung Low Resource Ventilator
+
+The [Open Lung Low Resource Ventilator][34] is a quick-deployment ventilator that utilizes a [bag valve mask][35] (BVM), also known as an Ambu-bag, as a core component. Ambu-bags are mass-produced, certified, small, mechanically simple, and adaptable to both invasive tubing and masks. The OPEN LUNG ventilator will use micro-electronics to sense and control air pressure and flow, with the goal to enable semi-autonomous operation.
+
+![Open Lung ventilator][36]
+
+Open Lung [on GitLab][37]
+
+This early-stage project boasts a large team with hundreds of contributors, led by: Colin Keogh, David Pollard, Connall Laverty, and Gui Calavanti. It is shared under a [GPLv3.0 license][38].
+
+#### Pandemic Ventilator
+
+The [Pandemic Ventilator][39] is a DIY ventilator prototype. Like the RepRap project, it uses commonly available hardware components in its design. The project was uploaded by user Panvent to Instructables more than 10 years ago, and there are six major steps to producing it. The project is shared under a [CC BY-NC-SA license][39]. This video shows the system in action:
+
+#### Folding at Home
+
+[Folding at Home][40] is a distributed computing project for simulating protein dynamics, including the process of protein folding and the movements of proteins implicated in a variety of diseases. It is a call-to-action for citizen scientists, researchers, and volunteers to use their computers at home to help run simulations, similar to the decommissioned [SETI@Home project][41]. If you're a technologist with capable computer hardware, Folding at Home is for you.
+
+![Markov state model][42]
+
+Vincent Voelz, CC BY-SA 3.0
+
+Folding at Home uses Markov state models (shown above) to model the possible shapes and folding pathways a protein can take in order to look for new therapeutic opportunities. You can find out more about the project in Washington University biophysicist Greg Bowman's post on [how it works and how you can help][43].
+
+The project involves a consortium of academic laboratories, contributors, and corporate sponsors from many countries, including Hong Kong, Croatia, Sweden, and the United States. Folding at Home is shared under a [mix of GPL and proprietary licenses][44] on [GitHub][45] and is multi-platform for Windows, macOS, and GNU/Linux (e.g., Debian, Ubuntu, Mint, RHEL, CentOS, Fedora).
+
+### Many other interesting projects
+
+These projects are just a fraction of the activity happening in the open hardware space to solve or treat COVID-19. In researching this article, I discovered other projects worth exploring, such as:
+
+ * [Open source ventilators, oxygen concentrators, etc.][46] by Coronavirus Tech Handbook
+ * [Helpful engineering][47] by ProjectOpenAir
+ * [Open source ventilator hackathon][48] on Hackaday
+ * [Specifications for simple open source mechanical ventilator][49] by Johns Hopkins emergency medicine resident Julian Botta
+ * [Coronavirus-related phishing, malware, and randomware on the rise][50] by Shannon Morse
+ * [Converting a low-cost CPAP blower into a rudimentary ventilator][51] by jcl5m1
+ * [Forum A.I.R.E. discussion on open respirators and fans][52] (Spanish/español)
+ * [Special Issue on Open-Source COVID19 Medical Hardware][53] by Elsevier HardwareX
+
+
+
+These projects are based all over the world, and this type of global cooperation is exactly what we need, as the virus ignores borders. The novel coronavirus pandemic affects countries at different times and in different ways, so we need a distributed approach.
+
+As my colleague Steven Abadie and I write in the [OSHdata 2020 Report][54], the open source hardware movement is a global movement. Participating individuals and organizations with certified projects are located in over 35 countries around the world and in every hemisphere.
+
+![Open source hardware map][55]
+
+OSHdata, CC BY-SA 4.0 International
+
+If you are interested in joining this conversation with open source hardware developers around the world, join the [Open Hardware Summit Discord][56] server with a dedicated channel for conversations about COVID-19. You can find roboticists, designers, artists, firmware and mechanical engineers, students, researchers, and others who are fighting this war together. We hope to see you there.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/open-hardware-covid19
+
+作者:[Harris Kenny][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/harriskenny
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/health_heartbeat.png?itok=P-GXea-p (open on blue background with heartbeat symbol)
+[2]: https://opensource.com/resources/what-open-hardware
+[3]: https://reprap.org/wiki/RepRap
+[4]: https://www.opensourceecology.org/
+[5]: https://www.osbeehives.com/
+[6]: https://www.scmp.com/news/hong-kong/health-environment/article/3052135/polytechnic-university-lab-3d-printing-face
+[7]: https://www.3dprintingmedia.network/covid-19-3d-printed-valve-for-reanimation-device/
+[8]: https://www.3dprintingmedia.network/materialise-shows-3d-printed-door-opener-for-coronavirus-containment-efforts/
+[9]: https://news.yahoo.com/stitch-time-czechs-sew-combat-virus-mask-shortage-205213804.html
+[10]: http://tapster.io/
+[11]: https://opensource.com/life/15/5/arduino-or-raspberry-pi
+[12]: https://t.co/bFogaekehM
+[13]: https://twitter.com/JIMrichards1010/status/1239140710558969857?ref_src=twsrc%5Etfw
+[14]: http://Healthcare.gov
+[15]: https://www.marktysonlaw.com/
+[16]: https://opentrons.com/
+[17]: https://blog.opentrons.com/testing-for-covid-19-with-opentrons/
+[18]: https://opensource.com/sites/default/files/uploads/opentrons.png (Opentrons roadmap graphic)
+[19]: https://www.fda.gov/regulatory-information/search-fda-guidance-documents/policy-diagnostics-testing-laboratories-certified-perform-high-complexity-testing-under-clia-prior
+[20]: https://github.com/Opentrons/opentrons/blob/edge/LICENSE
+[21]: https://www.chaibio.com/openqpcr
+[22]: https://en.wikipedia.org/wiki/Polymerase_chain_reaction
+[23]: https://github.com/chaibio/chaipcr
+[24]: https://beagleboard.org/bone
+[25]: https://openpcr.org/
+[26]: https://github.com/jperfetto/OpenPCR/blob/master/license.txt
+[27]: https://opensource.com/sites/default/files/uploads/openpcr.png (OpenPCR)
+[28]: https://github.com/GenericLab/WildOpenPCR
+[29]: http://www.gaudi.ch/GaudiLabs/?page_id=328
+[30]: https://github.com/GenericLab/WildOpenPCR/blob/master/license.txt
+[31]: http://gaudi.ch/PocketPCR/
+[32]: https://opensource.com/sites/default/files/uploads/pocketpcr.png (PocketPCR)
+[33]: https://github.com/GaudiLabs/PocketPCR/blob/master/LICENSE
+[34]: https://gitlab.com/TrevorSmale/low-resource-ambu-bag-ventilor
+[35]: https://en.wikipedia.org/wiki/Bag_valve_mask
+[36]: https://opensource.com/sites/default/files/uploads/open-lung.png (Open Lung ventilator)
+[37]: https://gitlab.com/TrevorSmale/low-resource-ambu-bag-ventilor/-/blob/master/images/CONCEPT_1_MECH.png
+[38]: https://gitlab.com/TrevorSmale/low-resource-ambu-bag-ventilor/-/blob/master/LICENSE
+[39]: https://www.instructables.com/id/The-Pandemic-Ventilator/
+[40]: https://foldingathome.org/
+[41]: https://setiathome.ssl.berkeley.edu/
+[42]: https://opensource.com/sites/default/files/uploads/foldingathome.png (Markov state model)
+[43]: https://foldingathome.org/2020/03/15/coronavirus-what-were-doing-and-how-you-can-help-in-simple-terms/
+[44]: https://en.wikipedia.org/wiki/Folding@home
+[45]: https://github.com/FoldingAtHome
+[46]: https://coronavirustechhandbook.com/hardware
+[47]: https://app.jogl.io/project/121#about
+[48]: https://hackaday.com/2020/03/12/ultimate-medical-hackathon-how-fast-can-we-design-and-deploy-an-open-source-ventilator/
+[49]: https://docs.google.com/document/d/1FNPwrQjB1qW1330s5-S_-VB0vDHajMWKieJRjINCNeE/edit?fbclid=IwAR3ugu1SGMsacwKi6ycAKJFOMduInSO4WVM8rgmC4CgMJY6cKaGBNR14mpM
+[50]: https://www.youtube.com/watch?v=dmQ1twpPpXA
+[51]: https://github.com/jcl5m1/ventilator
+[52]: https://foro.coronavirusmakers.org/
+[53]: https://www.journals.elsevier.com/hardwarex/call-for-papers/special-issue-on-open-source-covid19-medical-hardware
+[54]: https://oshdata.com/2020-report
+[55]: https://opensource.com/sites/default/files/uploads/oshdata-country.png (Open source hardware map)
+[56]: https://discord.gg/duAtG5h
diff --git a/sources/tech/20200320 Build a private social network with a Raspberry Pi.md b/sources/tech/20200320 Build a private social network with a Raspberry Pi.md
new file mode 100644
index 0000000000..7917add925
--- /dev/null
+++ b/sources/tech/20200320 Build a private social network with a Raspberry Pi.md
@@ -0,0 +1,373 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Build a private social network with a Raspberry Pi)
+[#]: via: (https://opensource.com/article/20/3/raspberry-pi-open-source-social)
+[#]: author: (Giuseppe Cassibba https://opensource.com/users/peppe8o)
+
+Build a private social network with a Raspberry Pi
+======
+Step-by-step instructions on how to create your own social network with
+low-cost hardware and simple setup.
+![Team of people around the world][1]
+
+Social networks have revolutionized people's lives in the last several years. People use social channels every day to stay connected with friends and family. But a common question remains regarding privacy and data security. Even if social networks have created complex privacy policies to protect users, maintaining your data in your own server is always the best option if you don't want to make them available to the public.
+
+Again, a Raspberry Pi—Raspbian Lite version can be very versatile to help you put a number of useful home services (see also my [Raspberry Pi projects][2] article) in place. Some addictive features can be achieved by searching for open source software and testing it with this fantastic device. An interesting example to try is installing OpenSource Social Network in your Raspberry Pi.
+
+### What Is OpenSource Social Network?
+
+[OpenSource Social Network][3] (OSSN) is a rapid-development social networking software written in PHP, that essentially allows you to make a social networking website. OSSN can be used to build different types of social apps, such as:
+
+ * Private Intranets
+ * Public/Open Networks
+ * Community
+
+
+
+OSSN supports features like:
+
+ * Photos
+ * Profile
+ * Friends
+ * Smileys
+ * Search
+ * Chat
+
+
+
+OSSN runs on a LAMP server. It has very poor hardware requirements, but an amazing user interface, which is also mobile-friendly.
+
+### What we need
+
+This project is very simple and, because we're installing only remote web services, we only need a few cheap parts. I'm going to use a Raspberry Pi 3 model B+, but it should also work with Raspberry Pi 3 model A+ or newer boards.
+
+Hardware:
+
+ * Raspberry Pi 3 model B+ with its power supply
+ * a micro SD card (better if it is a performing card, at least 16GB)
+ * a Desktop PC with an SFTP software (for example, the free [Filezilla][4]) to transfer installation packages into your RPI.
+
+
+
+### Step-by-step procedure
+
+We'll start by setting up a classic LAMP server. We'll then set up database users and install OpenSource Social Network.
+
+#### 1\. Install Raspbian Buster Lite OS
+
+For this step, you can simply follow my [Install Raspbian Buster Lite in your Raspberry Pi][5] article.
+
+Make sure that your system is up to date. Connect via ssh terminal and type following commands:
+
+
+```
+sudo apt-get update
+sudo apt-get upgrade
+```
+
+2\. Install LAMP server
+
+LAMP (Linux–Apache–Mysql–Php) servers usually come with the MySQL database. In our project, we'll use MariaDB instead, because it is lighter and works with Raspberry Pi.
+
+#### 3\. Install Apache server:
+
+
+```
+`sudo apt-get install apache2 -y`
+```
+
+You should now be able to check that Apache installation has gone correctly by browsing http://<<YouRpiIPAddress>>:
+
+![][6]
+
+#### 4\. Install PHP:
+
+
+```
+`sudo apt-get install php -y`
+```
+
+5\. Install MariaDB server and PHP connector:
+
+
+```
+`sudo apt-get install mariadb-server php-mysql -y`
+```
+
+6\. Install PhpMyAdmin:
+
+PhpMyAdmin is not mandatory in OpenSource Social Network, but I suggest that you install it because it simplifies database management.
+
+
+```
+`sudo apt-get install phpmyadmin`
+```
+
+In the phpMyAdmin setup screen, take the following steps:
+
+ * Select apache (mandatory) with space and press OK.
+ * Select Yes to configure the database for phpMyAdmin with dbconfig-common.
+ * Enter your favorite phpMyAdmin password and press OK.
+ * Enter your phpMyAdmin password again to confirm and press OK
+
+
+
+#### 7\. Grant phpMyAdmin user DB privileges to manage DBs:
+
+We'll connect to MariaDB with root user (default password is empty) to grant permissions. Remember to use semicolons at the end of each command row as shown below:
+
+
+```
+sudo mysql -uroot -p
+grant all privileges on *.* to 'phpmyadmin'@'localhost';
+flush privileges;
+quit
+```
+
+8\. Finally, restart Apache service:
+
+
+```
+`sudo systemctl restart apache2.service`
+```
+
+And check that phpMyAdmin is working by browsing http://<<YouRpiIPAddress>>/phpmyadmin/.
+
+![][7]
+
+Default phpMyAdmin login credentials are:
+
+ * user: phpmyadmin
+ * password: the one you set up in the phpMyAdmin installation step
+
+
+
+### Installing other open source social network-required packages and setting up PHP
+
+We need to prepare our system for OpenSource Social Network's first setup wizard. Required packages are:
+
+ * PHP version any of 5.6, 7.0, 7.1
+ * MYSQL 5 OR >
+ * APACHE
+ * MOD_REWRITE
+ * PHP Extensions cURL & Mcrypt should be enabled
+ * PHP GD Extension
+ * PHP ZIP Extension
+ * PHP settings allow_url_fopen enabled
+ * PHP JSON Support
+ * PHP XML Support
+ * PHP OpenSSL
+
+
+
+So we'll install them with following terminal commands:
+
+
+```
+`sudo apt-get install php7.3-curl php7.3-gd php7.3-zip php7.3-json php7.3-xml`
+```
+
+#### 1\. Enable MOD_REWRITE:
+
+
+```
+`sudo a2enmod rewrite`
+```
+
+2\. Edit default Apache config to use mod_rewrite:
+
+
+```
+`sudo nano /etc/apache2/sites-available/000-default.conf`
+```
+
+3\. Add the section so that your **000-default.conf** file appears like the following (excluding comments):
+
+
+```
+<VirtualHost *:80>
+ ServerAdmin webmaster@localhost
+ DocumentRoot /var/www/html
+ ErrorLog ${APACHE_LOG_DIR}/error.log
+ CustomLog ${APACHE_LOG_DIR}/access.log combined
+ # SECTION TO ADD --------------------------------
+ <Directory /var/www/html>
+ Options Indexes FollowSymLinks MultiViews
+ AllowOverride All
+ Require all granted
+ </Directory>
+ # END SECTION TO ADD --------------------------------
+</VirtualHost>
+```
+
+4\. Install Mcrypt:
+
+
+```
+sudo apt install php-dev libmcrypt-dev php-pear
+sudo pecl channel-update pecl.php.net
+sudo pecl install mcrypt-1.0.2
+```
+
+5\. Enable Mcrypt module by adding (or uncommenting) “extension=mcrypt.so" in "/etc/php/7.3/apache2/php.ini":
+
+
+```
+`sudo nano /etc/php/7.3/apache2/php.ini`
+```
+
+**allow_url_fopen** should be already enabled in "/etc/php/7.3/apache2/php.ini". OpenSSL should be already installed in php7.3.
+
+#### 6\. Another setting that I suggest is editing the PHP max upload file size up to 16 MB:
+
+
+```
+`sudo nano /etc/php/7.3/apache2/php.ini`
+```
+
+7\. Look for the row with the **upload_max_filesize** parameter and set it as the following:
+
+
+```
+`upload_max_filesize = 16M`
+```
+
+8\. Save and exit. Restart Apache:
+
+
+```
+`sudo systemctl restart apache2.service`
+```
+
+### Install OSSN
+
+#### 1\. Create DB and set up user:
+
+Go back to phpmyadmin web page (browse "http://<<YourRpiIPAddress>>/phpmyadmin/") and login:
+
+User: phpmyadmin
+
+Password: the one set up in phpmyadmin installation step
+
+Click on database tab:
+
+![][8]
+
+Create a database and take note of the database name, as you will be required to enter it later in the installation process.
+
+![][9]
+
+It's time to create a database user for OSSN. In this example, I'll use the following credentials:
+
+User: ossn_db_user
+
+Password: ossn_db_password
+
+So, terminal commands will be (root password is still empty, if not changed by you before):
+
+
+```
+sudo mysql -uroot -p
+CREATE USER 'ossn_db_user'@'localhost' IDENTIFIED BY 'ossn_db_password';
+GRANT ALL PRIVILEGES ON ossn_db.* TO 'ossn_db_user'@'localhost';
+flush privileges;
+quit
+```
+
+2\. Install OSSN software:
+
+Download the OSSN installation zip file from the [OSSN download page][10] on your local PC. At the time of this writing, this file is named "ossn-v5.2-1577836800.zip."
+
+Using your favorite SFTP software, transfer the entire zip file via SFTP to a new folder in the path "/home/pi/download" on your Raspberry Pi. Common (default) SFP connection parameters are:
+
+ * Host: your Raspberry Pi IP address
+ * User: pi
+ * Password: raspberry (if you didn't change the pi default password)
+ * Port: 22
+
+
+
+Back to terminal:
+
+
+```
+cd /home/pi/download/ #Enter directory where OSSN installation files have been transferred
+unzip ossn-v5.2-1577836800.zip #Extracts all files from zip
+cd /var/www/html/ #Enter Apache web directory
+sudo rm index.html #Removes Apache default page - we'll use OSSN one
+sudo cp -R /home/pi/download/ossn-v5.2-1577836800/* ./ #Copy installation files to web directory
+sudo chown -R www-data:www-data ./
+```
+
+Create a data folder:OSSN requires a folder to store data. OSSN suggests, for security reasons, to create this folder outside of the published document root. So, we'll create this opt-in folder and give grants:
+
+
+```
+sudo mkdir /opt/ossn_data
+sudo chown -R www-data:www-data /opt/ossn_data/
+```
+
+Browse http://<<YourRpiIPAddress>> to start the installation wizard:
+
+![][11]
+
+All checks should be fine. Click the Next button at the end of the page.
+
+![][12]
+
+Read the license validation and click the Next button at the end of the page to accept.
+
+![][13]
+
+Enter the database user, password, and the DB name you chose. Remember also to enter the OSSN data folder. Press Install.
+
+![][14]
+
+Enter your admin account information and press the Create button.
+
+![][15]
+
+Everything should be fine now. Press Finish to access the administration dashboard.
+
+![][16]
+
+So, administration panel can be reached with URL "http://<<YourRpiIPAddress>>/administrator" while user link will be "http://<<YourRpiIPAddress>>".
+
+![][17]
+
+_This article was originally published at [peppe8o.com][18]. Reposted with permission._
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/raspberry-pi-open-source-social
+
+作者:[Giuseppe Cassibba][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/peppe8o
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/team_global_people_gis_location.png?itok=Rl2IKo12 (Team of people around the world)
+[2]: https://peppe8o.com/2019/04/best-raspberry-pi-projects-with-open-source-software/
+[3]: https://www.opensource-socialnetwork.org/
+[4]: https://filezilla-project.org/
+[5]: https://peppe8o.com/2019/07/install-raspbian-buster-lite-in-your-raspberry-pi/
+[6]: https://opensource.com/sites/default/files/uploads/ossn_1_0.jpg
+[7]: https://opensource.com/sites/default/files/uploads/ossn_2.jpg
+[8]: https://opensource.com/sites/default/files/uploads/ossn_3.jpg
+[9]: https://opensource.com/sites/default/files/uploads/ossn_4.jpg
+[10]: https://www.opensource-socialnetwork.org/download
+[11]: https://opensource.com/sites/default/files/uploads/ossn_5.jpg
+[12]: https://opensource.com/sites/default/files/uploads/ossn_6.jpg
+[13]: https://opensource.com/sites/default/files/uploads/ossn_7.jpg
+[14]: https://opensource.com/sites/default/files/uploads/ossn_8.jpg
+[15]: https://opensource.com/sites/default/files/uploads/ossn_9.jpg
+[16]: https://opensource.com/sites/default/files/uploads/ossn_10.jpg
+[17]: https://opensource.com/sites/default/files/uploads/ossn_11.jpg
+[18]: https://peppe8o.com/private-social-network-with-raspberry-pi-and-opensource-social-network/
diff --git a/sources/tech/20200320 Control the firewall at the command line.md b/sources/tech/20200320 Control the firewall at the command line.md
new file mode 100644
index 0000000000..fb49292d28
--- /dev/null
+++ b/sources/tech/20200320 Control the firewall at the command line.md
@@ -0,0 +1,138 @@
+[#]: collector: (lujun9972)
+[#]: translator: (tinyeyeser )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Control the firewall at the command line)
+[#]: via: (https://fedoramagazine.org/control-the-firewall-at-the-command-line/)
+[#]: author: (Paul W. Frields https://fedoramagazine.org/author/pfrields/)
+
+Control the firewall at the command line
+======
+
+![][1]
+
+A network _firewall_ is more or less what it sounds like: a protective barrier that prevents unwanted network transmissions. They are most frequently used to prevent outsiders from contacting or using network services on a system. For instance, if you’re running a laptop at school or in a coffee shop, you probably don’t want strangers poking around on it.
+
+Every Fedora system has a firewall built in. It’s part of the network functions in the Linux kernel inside. This article shows you how to change its settings using _firewall-cmd_.
+
+### Network basics
+
+This article can’t teach you [everything][2] about computer networks. But a few basics suffice to get you started.
+
+Any computer on a network has an _IP address_. Think of this just like a mailing address that allows correct routing of data. Each computer also has a set of _ports_, numbered 0-65535. These are not physical ports; instead, you can think of them as a set of connection points at the address.
+
+In many cases, the port is a [standard number][3] or range depending on the application expected to answer. For instance, a web server typically reserves port 80 for non-secure HTTP communications, and/or 443 for secure HTTPS. The port numbers under 1024 are reserved for system and well-known purposes, ports 1024-49151 are registered, and ports 49152 and above are usually ephemeral (used only for a short time).
+
+Each of the two most common protocols for Internet data transfer, [TCP][4] and [UDP][5], have this set of ports. TCP is used when it’s important that all data be received and, if it arrives out of order, reassembled in the right order. UDP is used for more time-sensitive services that can withstand losing some data.
+
+An application running on the system, such as a web server, reserves one or more ports (as seen above, 80 and 443 for example). Then during network communication, a host establishes a connection between a source address and port, and the destination address and port.
+
+A network firewall can block or permit transmissions of network data based on rules like address, port, or other criteria. The _firewall-cmd_ utility lets you interact with the rule set to view or change how the firewall works.
+
+### Firewall zones
+
+To verify the firewall is running, use this command with [sudo][6]. (In fairness, you can run _firewall-cmd_ without the _sudo_ command in environments where [PolicyKit][7] is running.)
+
+```
+$ sudo firewall-cmd --state
+running
+```
+
+The firewalld service supports any number of _zones_. Each zone can have its own settings and rules for protection. In addition, each network interface can be placed in any zone individually The default zone for an external facing interface (like the wifi or wired network card) on a Fedora Workstation is the _FedoraWorkstation_ zone.
+
+To see what zones are active, use the _–get-active-zones_ flag. On this system, there are two network interfaces, a wired Ethernet card _wlp2s0_ and a virtualization (libvirt) bridge interface _virbr0_:
+
+```
+$ sudo firewall-cmd --get-active-zones
+FedoraWorkstation
+ interfaces: wlp2s0
+libvirt
+ interfaces: virbr0
+```
+
+To see the default zone, or all the defined zones:
+
+```
+$ sudo firewall-cmd --get-default-zone
+FedoraWorkstation
+$ sudo firewall-cmd --get-zones
+FedoraServer FedoraWorkstation block dmz drop external home internal libvirt public trusted work
+```
+
+To see the services the firewall is allowing other systems to access in the default zone, use the _–list-services_ flag. Here is an example from a customized system; you may see something different.
+
+```
+$ sudo firewall-cmd --list-services
+dhcpv6-client mdns samba-client ssh
+```
+
+This system has four services exposed. Each of these has a well-known port number. The firewall recognizes them by name. For instance, the _ssh_ service is associated with port 22.
+
+To see other port settings for the firewall in the current zone, use the _–list-ports_ flag. By the way, you can always declare the zone you want to check:
+
+```
+$ sudo firewall-cmd --list-ports --zone=FedoraWorkstation
+1025-65535/udp 1025-65535/tcp
+```
+
+This shows that ports 1025 and above (both UDP and TCP) are open by default.
+
+### Changing zones, ports, and services
+
+The above setting is a design decision.* It ensures novice users can use network facing applications they install. If you know what you’re doing and want a more protective default, you can move the interface to the _FedoraServer_ zone, which prohibits any ports not explicitly allowed. _(**Warning:** if you’re using the host via the network, you may break your connection — meaning you’ll have to go to that box physically to make further changes!)_
+
+```
+$ sudo firewall-cmd --change-interface= --zone=FedoraServer
+success
+```
+
+* _This article is not the place to discuss that decision, which went through many rounds of review and debate in the Fedora community. You are welcome to change settings as needed._
+
+If you want to open a well-known port that belongs to a service, you can add that service to the default zone (or use _–zone_ to adjust a different zone). You can add more than one at once. This example opens up the well-known ports for your web server for both HTTP and HTTPS traffic, on ports 80 and 443:
+
+```
+$ sudo firewall-cmd --add-service=http --add-service=https
+success
+```
+
+Not all services are defined, but many are. To see the whole list, use the _–get-services_ flag.
+
+If you want to add specific ports, you can do that by number and protocol as well. (You can also combine _–add-service_ and _–add-port_ flags, as many as necessary.) This example opens up the UDP service for a network boot service:
+
+```
+$ sudo firewall-cmd --add-port=67/udp
+success
+```
+
+**Important:** If you want your changes to be effective after you reboot your system or restart the firewalld service, you **must** add the _–permanent_ flag to your commands. The examples here only change the firewall until one of those events next happens.
+
+These are just some of the many functions of the _firewall-cmd_ utility and the firewalld service. There is much more information on firewalld at the project’s [home page][8] that’s worth reading and trying out.
+
+* * *
+
+_Photo by [Jakob Braun][9] on [Unsplash][10]._
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/control-the-firewall-at-the-command-line/
+
+作者:[Paul W. Frields][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/pfrields/
+[b]: https://github.com/lujun9972
+[1]: https://fedoramagazine.org/wp-content/uploads/2020/03/firewall-cmd-816x345.jpg
+[2]: https://en.wikipedia.org/wiki/Portal:Internet
+[3]: https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers
+[4]: https://en.wikipedia.org/wiki/Transmission_Control_Protocol
+[5]: https://en.wikipedia.org/wiki/User_Datagram_Protocol
+[6]: https://fedoramagazine.org/howto-use-sudo/
+[7]: https://en.wikipedia.org/wiki/Polkit
+[8]: https://firewalld.org/
+[9]: https://unsplash.com/@jakobustrop?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
+[10]: https://unsplash.com/s/photos/brick-wall?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
diff --git a/sources/tech/20200320 Run a command on binary files with this script.md b/sources/tech/20200320 Run a command on binary files with this script.md
new file mode 100644
index 0000000000..2d6f0b6f26
--- /dev/null
+++ b/sources/tech/20200320 Run a command on binary files with this script.md
@@ -0,0 +1,772 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Run a command on binary files with this script)
+[#]: via: (https://opensource.com/article/20/3/run-binaries-script)
+[#]: author: (Nick Clifton https://opensource.com/users/nickclifton)
+
+Run a command on binary files with this script
+======
+Try this simple script to easily run a command on binary files
+regardless of their packaging.
+![Binary code on a computer screen][1]
+
+Examining files from the command-line is generally an easy thing to do. You just run the command you want, followed by a list of files to be examined. Dealing with binary files, however, is more complicated. These files are often packaged up into archives, tarballs, or other packaging formats. The run-on-binaries script provides a convenient way to run a command on a collection of files, regardless of how they are packaged.
+
+The invocation of the script is quite simple:
+
+
+```
+`run-on-binaries `
+```
+
+So, for example:
+
+
+```
+`run-on-binaries /usr/bin/ls foo.rpm`
+```
+
+will list all of the files inside the **foo.rpm** file, while:
+
+
+```
+`run-on-binaries /usr/bin/readelf -a libc.a`
+```
+
+will run the **readelf** program, with the **-a** command-line option, on all of the object files inside the **libc.a library**.
+
+If necessary, the script can be passed a file containing a list of other files to be processed, rather than specifying them on the command line—like this:
+
+
+```
+`run-on-binaries --files-from=foo.lst /usr/bin/ps2ascii`
+```
+
+This will run the **ps2ascii** script on all of the files listed in **foo.lst**. (The files just need to be separated by white space. There can be multiple files on a single line if desired).
+
+Also, a skip list can be provided to stop the script from processing specified files:
+
+
+```
+`run-on-binaries --skip-list=skip.lst /usr/bin/wc *`
+```
+
+This will run the **wc** program on all of the files in the current directory, except for those specified in **skip.lst**.
+
+The script does not recurse into directories, but this can be handled by combining it with the **find** command, like this:
+
+
+```
+`find . -type f -exec run-on-binaries @ ;`
+```
+
+or
+
+
+```
+`find . -type d -exec run-on-binaries @/* ;`
+```
+
+The only difference between these two invocations is that the second one only runs the target program once per directory, but gives it a long command-line of all of the files in the directory.
+
+Though convenient, the script is lacking in several areas. Right now, it does not examine the PATH environment variable to find the command that it is asked to run, so a full path must be provided. Also, the script ought to be able to handle recursion on its own, without needing help from the find command.
+
+The run-on-binaries script is part of the annobin package, which is available on Fedora. The sources for annobin can also be obtained from the git repository at .
+
+### The script
+
+
+```
+#!/bin/bash
+
+# Script to run another script/program on the executables inside a given file.
+#
+# Created by Nick Clifton. <[nickc@redhat.com][2]>
+# Copyright (c) 2018 Red Hat.
+#
+# This is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published
+# by the Free Software Foundation; either version 3, or (at your
+# option) any later version.
+
+# It is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# Usage:
+# run-on-binaries-in [options] program [options-for-the-program] file(s)
+#
+# This script does not handle directories. This is deliberate.
+# It is intended that if recursion is needed then it will be
+# invoked from find, like this:
+#
+# find . -name "*.rpm" -exec run-on-binaries-in <script-to-run> {} \;
+
+version=1.0
+
+help ()
+{
+ # The following exec goop is so that we don't have to manually
+ # redirect every message to stderr in this function.
+ exec 4>&1 # save stdout fd to fd #4
+ exec 1>&2 # redirect stdout to stderr
+
+ cat <<__EOM__
+
+This is a shell script to run another script/program on one or more binary
+files. If the file(s) specified are archives of some kind (including rpms)
+then the script/program is run on the binary executables inside the archive.
+
+Usage: $prog {options} program {options-for-the-program} files(s)
+
+ {options} are:
+ -h --help Display this information and then exit.
+ -v --version Report the version number of this script.
+ -V --verbose Report on progress.
+ -q --quiet Do not include the script name in the output.
+ -i --ignore Silently ignore files that are not executables or archives.
+ -p=<TEXT> --prefix=<TEXT> Prefix normal output with this string.
+ -t=<DIR> --tmpdir=<DIR> Temporary directory to use when opening archives.
+ -f=<FILE> --files-from=<FILE> Process files listed in <FILE>.
+ -s=<FILE> --skip-list=<FILE> Skip any file listed in <FILE>.
+ -- Stop accumulating options.
+
+Examples:
+
+ $prog hardened foo.rpm
+ Runs the hardened script on the executable
+ files inside foo.rpm.
+
+ $prog check-abi -v fred.tar.xz
+ Runs the check-abi script on the decompressed
+ contents of the fred.tar.xz archive, passing the
+ -v option to check-abi as it does so.
+
+ $prog -V -f=list.txt readelf -a
+ Runs the readelf program, with the -a option on
+ every file listed in the list.txt. Describes
+ what is being done as it works.
+
+ $prog -v -- -fred -a jim -b bert -- -c harry
+ Runs the script "-fred" on the files jim, bert,
+ "-c" and harry. Passes the options "-a" and
+ "-b" to the script (even when run on jim).
+ Reports the version of this script as well.
+
+__EOM__
+ exec 1>&4 # Copy stdout fd back from temporary save fd, #4
+}
+
+main ()
+{
+ init
+
+ parse_args ${1+"$@"}
+
+ if [ $failed -eq 0 ];
+ then
+ run_script_on_files
+ fi
+
+ if [ $failed -ne 0 ];
+ then
+ exit 1
+ else
+ exit 0
+ fi
+}
+
+report ()
+{
+ if [ $quiet -eq 0 ];
+ then
+ echo -n $prog": "
+ fi
+
+ echo ${1+"$@"}
+}
+
+ice ()
+{
+ report "Internal error: " ${1+"$@"}
+ exit 1
+}
+
+fail ()
+{
+ report "Failure:" ${1+"$@"}
+ failed=1
+}
+
+verbose ()
+{
+ if [ $verbose -ne 0 ]
+ then
+ report ${1+"$@"}
+ fi
+}
+
+# Initialise global variables.
+init ()
+{
+ files[0]="";
+ # num_files is the number of files to be scanned.
+ # files[0] is the script to run on the files.
+ num_files=0;
+
+ script=""
+ script_opts="";
+
+ prog_opts="-i"
+
+ tmpdir=/dev/shm
+ prefix=""
+ files_from=""
+ skip_list=""
+
+ failed=0
+ verbose=0
+ ignore=0
+ quiet=0
+}
+
+# Parse our command line
+parse_args ()
+{
+ abs_prog=$0;
+ prog=`basename $abs_prog`;
+
+ # Locate any additional command line switches
+ # Likewise accumulate non-switches to the files list.
+ while [ $# -gt 0 ]
+ do
+ optname="`echo $1 | sed 's,=.*,,'`"
+ optarg="`echo $1 | sed 's,^[^=]*=,,'`"
+ case "$optname" in
+ -v | --version)
+ report "version: $version"
+ ;;
+ -h | --help)
+ help
+ exit 0
+ ;;
+ -q | --quiet)
+ quiet=1;
+ prog_opts="$prog_opts -q"
+ ;;
+ -V | --verbose)
+ if [ $verbose -eq 1 ];
+ then
+ # This has the effect of cancelling out the prog_opts="-i"
+ # in the init function, so that recursive invocations of this
+ # script will complain about unrecognised file types.
+ if [ $quiet -eq 0 ];
+ then
+ prog_opts="-V -V"
+ else
+ prog_opts="-V -V -q"
+ fi
+ else
+ verbose=1;
+ prog_opts="$prog_opts -V"
+ fi
+ ;;
+ -i | --ignore)
+ ignore=1
+ ;;
+ -t | --tmpdir)
+ if test "x$optarg" = "x$optname" ;
+ then
+ shift
+ if [ $# -eq 0 ]
+ then
+ fail "$optname needs a directory name"
+ else
+ tmpdir=$1
+ fi
+ else
+ tmpdir="$optarg"
+ fi
+ ;;
+ -p | --prefix)
+ if test "x$optarg" = "x$optname" ;
+ then
+ shift
+ if [ $# -eq 0 ]
+ then
+ fail "$optname needs a string argument"
+ else
+ prefix=$1
+ fi
+ else
+ prefix="$optarg"
+ fi
+ ;;
+ -f | --files_from)
+ if test "x$optarg" = "x$optname" ;
+ then
+ shift
+ if [ $# -eq 0 ]
+ then
+ fail "$optname needs a file name"
+ else
+ files_from=$1
+ fi
+ else
+ files_from="$optarg"
+ fi
+ ;;
+
+ -s | --skip-list)
+ if test "x$optarg" = "x$optname" ;
+ then
+ shift
+ if [ $# -eq 0 ]
+ then
+ fail "$optname needs a file name"
+ else
+ skip_list=$1
+ fi
+ else
+ skip_list="$optarg"
+ fi
+ ;;
+
+ --)
+ shift
+ break;
+ ;;
+ --*)
+ fail "unrecognised option: $1"
+ help
+ ;;
+ *)
+ script="$1";
+ if ! [ -a "$script" ]
+ then
+ fail "$script: program/script not found"
+ elif ! [ -x "$script" ]
+ then
+ fail "$script: program/script not executable"
+ fi
+ # After we have seen the first non-option we stop
+ # accumulating options for this script and instead
+ # start accumulating options for the script to be
+ # run.
+ shift
+ break;
+ ;;
+ esac
+ shift
+ done
+
+ # Read in the contents of the --file-from list, if specified.
+ if test "x$files_from" != "x" ;
+ then
+ if ! [ -a "$files_from" ]
+ then
+ fail "$files_from: file not found"
+ elif ! [ -r "$files_from" ]
+ then
+ fail "$files_from: file not readable"
+ else
+ eval 'files=($(cat $files_from))'
+ num_files=${#files[*]}
+ fi
+ fi
+ skip_files[foo]=bar
+
+ # Check that the skip list exists, if specified.
+ if test "x$skip_list" != "x" ;
+ then
+ if ! [ -a "$skip_list" ]
+ then
+ fail "$skip_list: file not found"
+ elif ! [ -r "$skip_list" ]
+ then
+ fail "$files_from: file not readable"
+ fi
+ fi
+
+ # Accumulate any remaining arguments separating out the arguments
+ # for the script from the names of the files to scan.
+ while [ $# -gt 0 ]
+ do
+ optname="`echo $1 | sed 's,=.*,,'`"
+ optarg="`echo $1 | sed 's,^[^=]*=,,'`"
+ case "$optname" in
+ --)
+ shift
+ break;
+ ;;
+ -*)
+ script_opts="$script_opts $1"
+ ;;
+ *)
+ files[$num_files]="$1";
+ let "num_files++"
+ ;;
+ esac
+ shift
+ done
+
+ # Accumulate any remaining arguments without processing them.
+ while [ $# -gt 0 ]
+ do
+ files[$num_files]="$1";
+ let "num_files++";
+ shift
+ done
+
+ if [ $num_files -gt 0 ];
+ then
+ # Remember that we are counting from zero not one.
+ let "num_files--"
+ else
+ fail "Must specify a program/script and at least one file to scan."
+ fi
+}
+
+run_script_on_files ()
+{
+ local i
+
+ i=0;
+ while [ $i -le $num_files ]
+ do
+ run_on_file i
+ let "i++"
+ done
+}
+
+# syntax: run <command> [<args>]
+# If being verbose report the command being run, and
+# the directory in which it is run.
+run ()
+{
+ local where
+
+ if test "x$1" = "x" ;
+ then
+ fail "run() called without an argument."
+ fi
+
+ verbose " Running: ${1+$@}"
+
+ ${1+$@}
+}
+
+decompress ()
+{
+ local abs_file decompressor decomp_args orig_file base_file
+
+ # Paranoia checks - the user should never encounter these.
+ if test "x$4" = "x" ;
+ then
+ ice "decompress called with too few arguments"
+ fi
+ if test "x$5" != "x" ;
+ then
+ ice "decompress called with too many arguments"
+ fi
+
+ abs_file=$1
+ decompressor=$2
+ decomp_args=$3
+ orig_file=$4
+
+ base_file=`basename $abs_file`
+
+ run cp $abs_file $base_file
+ run $decompressor $decomp_args $base_file
+ if [ $? != 0 ];
+ then
+ fail "$orig_file: Unable to decompress"
+ fi
+
+ rm -f $base_file
+}
+
+run_on_file ()
+{
+ local file
+
+ # Paranoia checks - the user should never encounter these.
+ if test "x$1" = "x" ;
+ then
+ ice "scan_file called without an argument"
+ fi
+ if test "x$2" != "x" ;
+ then
+ ice "scan_file called with too many arguments"
+ fi
+
+ # Use quotes when accessing files in order to preserve
+ # any spaces that might be in the directory name.
+ file="${files[$1]}";
+
+ # Catch names that start with a dash - they might confuse readelf
+ if test "x${file:0:1}" = "x-" ;
+ then
+ file="./$file"
+ fi
+
+ # See if we should skip this file.
+ if test "x$skip_list" != "x" ;
+ then
+ # This regexp looks for $file being the first text on a line, either
+ # on its own, or with additional text separated from it by at least
+ # one space character. So searching for "fred" in the following gives:
+ # fr <\- no match
+ # fred <\- match
+ # fredjim <\- no match
+ # fred bert <\- match
+ regexp="^$file[^[:graph:]]*"
+ grep --silent --regexp="$regexp" $skip_list
+ if [ $? = 0 ];
+ then
+ verbose "$file: skipping"
+ return
+ fi
+ fi
+
+ # Check the file.
+ if ! [ -a "$file" ]
+ then
+ fail "$file: file not found"
+ return
+ elif ! [ -r "$file" ]
+ then
+ if [ $ignore -eq 0 ];
+ then
+ fail "$file: not readable"
+ fi
+ return
+ elif [ -d "$file" ]
+ then
+ if [ $ignore -eq 0 ];
+ then
+ if [ $num_files -gt 1 ];
+ then
+ verbose "$file: skipping - it is a directory"
+ else
+ report "$file: skipping - it is a directory"
+ fi
+ fi
+ return
+ elif ! [ -f "$file" ]
+ then
+ if [ $ignore -eq 0 ];
+ then
+ fail "$file: not an ordinary file"
+ fi
+ return
+ fi
+
+ file_type=`file -b $file`
+ case "$file_type" in
+ *"ELF "*)
+ verbose "$file: ELF format - running script/program"
+ if test "x$prefix" != "x" ;
+ then
+ report "$prefix:"
+ fi
+ run $script $script_opts $file
+ return
+ ;;
+ "RPM "*)
+ verbose "$file: RPM format."
+ ;;
+ *" cpio "*)
+ verbose "$file: CPIO format."
+ ;;
+ *"tar "*)
+ verbose "$file: TAR archive."
+ ;;
+ *"Zip archive"*)
+ verbose "$file: ZIP archive."
+ ;;
+ *"ar archive"*)
+ verbose "$file: AR archive."
+ ;;
+ *"bzip2 compressed data"*)
+ verbose "$file: contains bzip2 compressed data"
+ ;;
+ *"gzip compressed data"*)
+ verbose "$file: contains gzip compressed data"
+ ;;
+ *"lzip compressed data"*)
+ verbose "$file: contains lzip compressed data"
+ ;;
+ *"XZ compressed data"*)
+ verbose "$file: contains xz compressed data"
+ ;;
+ *"shell script"* | *"ASCII text"*)
+ if [ $ignore -eq 0 ];
+ then
+ fail "$file: test/scripts cannot be scanned."
+ fi
+ return
+ ;;
+ *"symbolic link"*)
+ if [ $ignore -eq 0 ];
+ then
+ # FIXME: We ought to be able to follow symbolic links
+ fail "$file: symbolic links are not followed."
+ fi
+ return
+ ;;
+ *)
+ if [ $ignore -eq 0 ];
+ then
+ fail "$file: Unsupported file type: $file_type"
+ fi
+ return
+ ;;
+ esac
+
+ # We now know that we will need a temporary directory
+ # so create one, and create paths to the file and scripts.
+ if test "x${file:0:1}" = "x/" ;
+ then
+ abs_file=$file
+ else
+ abs_file="$PWD/$file"
+ fi
+
+ if test "x${abs_prog:0:1}" != "x/" ;
+ then
+ abs_prog="$PWD/$abs_prog"
+ fi
+
+ if test "x${script:0:1}" = "x/" ;
+ then
+ abs_script=$script
+ else
+ abs_script="$PWD/$script"
+ fi
+
+ tmp_root=$tmpdir/delme.run.on.binary
+ run mkdir -p "$tmp_root/$file"
+
+ verbose " Changing to directory: $tmp_root/$file"
+ pushd "$tmp_root/$file" > /dev/null
+ if [ $? != 0 ];
+ then
+ fail "Unable to change to temporary directory: $tmp_root/$file"
+ return
+ fi
+
+ # Run the file type switch again, although this time we do not need to
+ # check for unrecognised types. (But we do, just in case...)
+ # Note since are transforming the file we re-invoke the run-on-binaries
+ # script on the decoded contents. This allows for archives that contain
+ # other archives, and so on. We normally pass the -i option to the
+ # invoked script so that it will not complain about unrecognised files in
+ # the decoded archive, although we do not do this when running in very
+ # verbose mode. We also pass an extended -t option to ensure that any
+ # sub-archives are extracted into a unique directory tree.
+
+ case "$file_type" in
+ "RPM "*)
+ # The output redirect confuses the run function...
+ verbose " Running: rpm2cpio $abs_file > delme.cpio"
+ rpm2cpio $abs_file > delme.cpio
+ if [ $? != 0 ];
+ then
+ fail "$file: Unable to extract from rpm archive"
+ else
+ # Save time - run cpio now.
+ run cpio --quiet --extract --make-directories --file delme.cpio
+ if [ $? != 0 ];
+ then
+ fail "$file: Unable to extract files from cpio archive"
+ fi
+ run rm -f delme.cpio
+ fi
+ ;;
+
+ *" cpio "*)
+ run cpio --quiet --extract --make-directories --file=$abs_file
+ if [ $? != 0 ];
+ then
+ fail "$file: Unable to extract files from cpio archive"
+ fi
+ ;;
+
+ *"tar "*)
+ run tar --extract --file=$abs_file
+ if [ $? != 0 ];
+ then
+ fail "$file: Unable to extract files from tarball"
+ fi
+ ;;
+
+ *"ar archive"*)
+ run ar x $abs_file
+ if [ $? != 0 ];
+ then
+ fail "$file: Unable to extract files from ar archive"
+ fi
+ ;;
+
+ *"Zip archive"*)
+ decompress $abs_file unzip "-q" $file
+ ;;
+ *"bzip2 compressed data"*)
+ decompress $abs_file bzip2 "--quiet --decompress" $file
+ ;;
+ *"gzip compressed data"*)
+ decompress $abs_file gzip "--quiet --decompress" $file
+ ;;
+ *"lzip compressed data"*)
+ decompress $abs_file lzip "--quiet --decompress" $file
+ ;;
+ *"XZ compressed data"*)
+ decompress $abs_file xz "--quiet --decompress" $file
+ ;;
+ *)
+ ice "unhandled file type: $file_type"
+ ;;
+ esac
+
+ if [ $failed -eq 0 ];
+ then
+ # Now scan the file(s) created in the previous step.
+ run find . -type f -execdir $abs_prog $prog_opts -t=$tmp_root/$file -p=$file $abs_script $script_opts {} +
+ fi
+
+ verbose " Deleting temporary directory: $tmp_root"
+ rm -fr $tmp_root
+
+ verbose " Return to previous directory"
+ popd > /dev/null
+}
+
+# Invoke main
+main ${1+"$@"}
+```
+
+
+
+Git has extensions for handling binary blobs such as multimedia files, so today we will learn how...
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/run-binaries-script
+
+作者:[Nick Clifton][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/nickclifton
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/binary_code_computer_screen.png?itok=7IzHK1nn (Binary code on a computer screen)
+[2]: mailto:nickc@redhat.com
diff --git a/sources/tech/20200322 Meet DebianDog - Puppy sized Debian Linux.md b/sources/tech/20200322 Meet DebianDog - Puppy sized Debian Linux.md
new file mode 100644
index 0000000000..ea2b2d1f7c
--- /dev/null
+++ b/sources/tech/20200322 Meet DebianDog - Puppy sized Debian Linux.md
@@ -0,0 +1,120 @@
+[#]: collector: (lujun9972)
+[#]: translator: (robsean)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Meet DebianDog – Puppy sized Debian Linux)
+[#]: via: (https://itsfoss.com/debiandog/)
+[#]: author: (John Paul https://itsfoss.com/author/john/)
+
+Meet DebianDog – Puppy sized Debian Linux
+======
+
+Recently I stumbled upon an intriguing Linux project. This project aims to create small live CDs for Debian and Debian-based systems, similar to the [Puppy Linux project][1]. Let’s take a look at DebianDog.
+
+### What is DebianDog?
+
+As it says on the tin, [DebianDog][2] “is a small Debian Live CD shaped to look like Puppy and act like Puppy. Debian structure and Debian behaviour are untouched and Debian documentation is 100% valid for DebianDog. You have access to all Debian repositories using apt-get or synaptic.”
+
+![DebianDog Jessie][3]
+
+For those of you who are not familiar with [Puppy Linux][1], the project is “a collection of multiple Linux distributions, built on the same shared principles”. Those principles are to be fast, small (300 MB or less), and easy to use. There are versions of Puppy Linux built to support Ubuntu, Slackware, and Raspbian packages.
+
+The major difference between DebianDog and Puppy Linux is that Puppy Linux has its own package manager [the [Puppy Package Manager][4]]. As stated above, DebianDog using the Debian package manager and packages. Even the DebianDog website tries to make that clear: “It is not Puppy Linux and it has nothing to do with Puppy based on Debian.”
+
+### Why should anyone use DebianDog?
+
+The main reason to install DebianDog (or any of its derivatives) would be to restore an older system to operability. Every entry on DebianDog has a 32-bit option. They also have lighter desktop environments/window managers, such as [Openbox][5] or the [Trinity Desktop][6] environment. Most of those also have an alternative to systemd. They also come with lighter applications installed, such as [PCManFM][7].
+
+### What versions of DebianDog are available?
+
+Though DebianDog was the first in the series, the project is called ‘Dog Linux’ and provides various ‘Dog variants’ on popular distributions based on Debian and Ubuntu.
+
+#### DebianDog Jessie
+
+The first (and original) version of DebianDog is DebianDog Jessie. There are two [32-bit versions][8] of it. One uses [Joe’s Window Manager (JWM)][9] as default and the other uses XFCE. Both systemd and sysvinit are available. There is also a [64-bit version][10]. DebianDog Jessie is based on Debian 8.0 (codename Jessie). Support for Debian 8.0 ends on June 30th, 2020, so install with caution.
+
+![TrinityDog][11]
+
+#### StretchDog
+
+[Stret][12][c][12][hDog][12] is based on Debian 9.0 (codename Stretch). It is available in 32 and 64-bit. Openbox is the default window manager, but we can also switch to JWM. Support for Debian 9.0 ends on June 30th, 2022.
+
+#### BusterDog
+
+[BusterDog][13] is interesting. It is based on [Debian 10][14] (codename Buster). It does not use systemd, instead, it uses [elogind][15] just like [AntiX][16]. Support for Debian 10.0 ends on June 2024.
+
+#### MintPup
+
+[MintPup][17] is based on [Linux Mint][18] 17.1. This LiveCD is 32-bit only. You can also access all of the “Ubuntu/Mint repositories using apt-get or synaptic”. Considering that Mint 17 has reached end of life, this version must be avoided.
+
+#### XenialDog
+
+There are both [32-bit][19] and [64-bit versions][20] of this spin based on the Ubuntu 16.04 LTS. Both versions come with Openbox as default with JWM as an option. Support for Ubuntu 16.04 LTS ends in April of 2021, so install with caution.
+
+#### TrinityDog
+
+There are two versions of the [TrintyDog][21] spin. One is based on Debian 8 and the other is based on Debian 9. Both are 32-bit and both use the [Trinity Desktop Environment][6], thus the name.
+
+![BionicDog][22]
+
+#### BionicDog
+
+As you should be able to guess by the name. [BionicDog][23] is based on [Ubuntu 18.04 LTS][24]. The main version of this spin has both 32 and 64-bit with Openbox as the default window manager. There is also a version that uses the [Cinnamon desktop][25] and is only 64-bit.
+
+### Final Thoughts
+
+I like any [Linux project that wants to make older systems usable][26]. However, most of the operating systems available through DebianDog are no longer supported or nearing the end of their life span. This makes it less than useful for the long run.
+
+**I wouldn’t really advise to use it on your main computer.** Try it in live USB or on a spare system. Also, [you can create][27] your own LiveCD spin if you want to take advantage of a newer base system.
+
+Somehow I keep on stumbling across obscure Linux distributions like [FatDog64][28], [4M Linux][29] and [Vipper Linux][30]. Even though I may not always recommend them to use, it’s still good to know about the existence of such projects.
+
+What are your thoughts on the DebianDog? What is your favorite Puppy-syle OS? Please let us know in the comments below.
+
+If you found this article interesting, please take a minute to share it on social media, Hacker News or [Reddit][31].
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/debiandog/
+
+作者:[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]: http://puppylinux.com/
+[2]: https://debiandog.github.io/doglinux/
+[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/DebianDog-Jessie.jpg?fit=800%2C600&ssl=1
+[4]: http://wikka.puppylinux.com/PPM?redirect=no
+[5]: http://openbox.org/wiki/Main_Page
+[6]: https://www.trinitydesktop.org/
+[7]: https://wiki.lxde.org/en/PCManFM
+[8]: https://debiandog.github.io/doglinux/zz01debiandogjessie.html
+[9]: https://en.wikipedia.org/wiki/JWM
+[10]: https://debiandog.github.io/doglinux/zz02debiandog64.html
+[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/TrinityDog.jpg?ssl=1
+[12]: https://debiandog.github.io/doglinux/zz02stretchdog.html
+[13]: https://debiandog.github.io/doglinux/zz03busterdog.html
+[14]: https://itsfoss.com/debian-10-buster/
+[15]: https://github.com/elogind/elogind
+[16]: https://antixlinux.com/
+[17]: https://debiandog.github.io/doglinux/zz04mintpup.html
+[18]: https://linuxmint.com/
+[19]: https://debiandog.github.io/doglinux/zz05xenialdog.html
+[20]: https://debiandog.github.io/doglinux/zz05zxenialdog.html
+[21]: https://debiandog.github.io/doglinux/zz06-trinitydog.html
+[22]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/BionicDog.jpg?ssl=1
+[23]: https://debiandog.github.io/doglinux/zz06-zbionicdog.html
+[24]: https://itsfoss.com/ubuntu-18-04-released/
+[25]: https://en.wikipedia.org/wiki/Cinnamon_(desktop_environment)
+[26]: https://itsfoss.com/lightweight-linux-beginners/
+[27]: https://github.com/DebianDog/MakeLive
+[28]: https://itsfoss.com/fatdog64-linux-review/
+[29]: https://itsfoss.com/4mlinux-review/
+[30]: https://itsfoss.com/viperr-linux-review/
+[31]: https://reddit.com/r/linuxusersgroup
diff --git a/sources/tech/20200323 5 Python scripts for automating basic community management tasks.md b/sources/tech/20200323 5 Python scripts for automating basic community management tasks.md
new file mode 100644
index 0000000000..3f8dd00aa1
--- /dev/null
+++ b/sources/tech/20200323 5 Python scripts for automating basic community management tasks.md
@@ -0,0 +1,114 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (5 Python scripts for automating basic community management tasks)
+[#]: via: (https://opensource.com/article/20/3/automating-community-management-python)
+[#]: author: (Rich Bowen https://opensource.com/users/rbowen)
+
+5 Python scripts for automating basic community management tasks
+======
+If you have to do something three times, try to automate it.
+![shapes of people symbols][1]
+
+I've [written before about what a community manager does][2], and if you ask ten community managers, you'll get 12 different answers. Mostly, though, you do what the community needs for you to do at any given moment. And a lot of it can be repetitive.
+
+Back when I was a sysadmin, I had a rule: if I had to do something three times, I'd try to automate it. And, of course, these days, with awesome tools like Ansible, there's a whole science to that.
+
+Some of what I do on a daily or weekly basis involves looking something up in a few places and then generating some digest or report of that information to publish elsewhere. A task like that is a perfect candidate for automation. None of this is [rocket surgery][3], but when I've shared some of these scripts with colleagues, invariably, at least one of them turns out to be useful.
+
+[On GitHub][4], I have several scripts that I use every week. None of them are complicated, but they save me a few minutes every time. Some of them are in Perl because I'm almost 50. Some of them are in Python because a few years ago, I decided I needed to learn Python. Here's an overview:
+
+### **[tshirts.py][5]**
+
+This simple script takes a number of Tshirts that you're going to order for an event and tells you what the size distribution should be. It spreads them on a normal curve (also called a bell curve), and, in my experience, this coincides pretty well with what you'll actually need for a normal conference audience. You might want to adjust the script to slightly larger if you're using it in the USA, slightly smaller if you're using it in Europe. YMMV.
+
+Usage:
+
+
+```
+[rbowen@sasha:community-tools/scripts]$ ./tshirts.py
+How many shirts? 300
+For a total of 300 shirts, order:
+
+30.0 small
+72.0 medium
+96.0 large
+72.0 xl
+30.0 2xl
+```
+
+### **[followers.py][6]**
+
+This script provides me with the follower count for Twitter handles I care about.
+
+This script is only 14 lines long and isn't exciting, but it saves me perhaps ten minutes of loading web pages and looking for a number.
+
+You'll need to edit the feeds array to add the accounts you care about:
+
+
+```
+feeds = [
+ 'centosproject',
+ 'centos'
+ ];
+```
+
+NB: It probably won't work if you're running it outside of English-speaking countries, because it's just a simple screen-scraping script that reads HTML and looks for particular information buried within it. So when the output is in a different language, the regular expressions won't match.
+
+Usage:
+
+
+```
+[rbowen@sasha:community-tools/scripts]$ ./followers.py
+centosproject: 11,479 Followers
+centos: 18,155 Followers
+```
+
+### **[get_meetups][7]**
+
+This script fits into another category—API scripts. This particular script uses the [meetup.com][8] API to look for meetups on a particular topic in a particular area and time range so that I can report them to my community. Many of the services you rely on provide an API so that your scripts can look up information without having to manually look through web pages. Learning how to use those APIs can be frustrating and time-consuming, but you'll end up with skills that will save you a LOT of time.
+
+_Disclaimer: [meetup.com][8] changed their API in August of 2019, and I have not yet updated this script to the new API, so it doesn't actually work right now. Watch this repo for a fixed version in the coming weeks._
+
+### **[centos-announcements.pl][9]**
+
+This script is considerably more complicated and extremely specific to my use case, but you probably have a similar situation. This script looks at a mailing list archive—in this case, the centos-announce mailing list—and finds messages that are in a particular format, then builds a report of those messages. Reports come in a couple of different formats—one for my monthly newsletter and one for scheduling messages (via Hootsuite) for Twitter.
+
+I use Hootsuite to schedule content for Twitter, and they have a convenient CSV (comma-separated value) format that lets you bulk-schedule a whole week of tweets in one go. Auto-generating that CSV from various data sources (i.e., mailing lists, blogs, other web pages) can save you a lot of time. Do note, however, that this should probably only be used for a first draft, which you then examine and edit yourself so that you don't end up auto-tweeting something you didn't intend to.
+
+### **[reporting.pl][10]**
+
+This script is also fairly specific to my particular needs, but the concept itself is universal. I send out a monthly mailing to the [CentOS SIGs][11] (Special Interest Groups), which are scheduled to report in that given month. This script simply tells me which SIGs those are this month, and writes the email that needs to go to them.
+
+It does not actually send that email, however, for a couple of reasons. One, I may wish to edit those messages before they go out. Two, while scripts sending email worked great in the old days, these days, they're likely to result in getting spam-filtered.
+
+### In conclusion
+
+There are some other scripts in that repo that are more or less specific to my particular needs, but I hope at least one of them is useful to you, and that the variety of what's there inspires you to automate something of your own. I'd love to see your handy automation script repos, too; link to them in the comments!
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/automating-community-management-python
+
+作者:[Rich Bowen][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/rbowen
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/Open%20Pharma.png?itok=GP7zqNZE (shapes of people symbols)
+[2]: http://drbacchus.com/what-does-a-community-manager-do/
+[3]: https://6dollarshirts.com/rocket-surgery
+[4]: https://github.com/rbowen/centos-community-tools/tree/master/scripts
+[5]: https://github.com/rbowen/centos-community-tools/blob/master/scripts/tshirts.py
+[6]: https://github.com/rbowen/centos-community-tools/blob/master/scripts/followers.py
+[7]: https://github.com/rbowen/centos-community-tools/blob/master/scripts/get_meetups
+[8]: http://meetup.com
+[9]: https://github.com/rbowen/centos-community-tools/blob/master/scripts/centos-announcements.pl
+[10]: https://github.com/rbowen/centos-community-tools/blob/master/scripts/sig_reporting/reporting.pl
+[11]: https://wiki.centos.org/SpecialInterestGroup
diff --git a/sources/tech/20200323 Don-t love diff- Use Meld instead.md b/sources/tech/20200323 Don-t love diff- Use Meld instead.md
new file mode 100644
index 0000000000..e5049454e2
--- /dev/null
+++ b/sources/tech/20200323 Don-t love diff- Use Meld instead.md
@@ -0,0 +1,131 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Don't love diff? Use Meld instead)
+[#]: via: (https://opensource.com/article/20/3/meld)
+[#]: author: (Ben Nuttall https://opensource.com/users/bennuttall)
+
+Don't love diff? Use Meld instead
+======
+Meld is a visual diff tool that makes it easier to compare and merge
+changes in files, directories, Git repos, and more.
+![Person drinking a hat drink at the computer][1]
+
+Meld is one of my essential tools for working with code and data files. It's a graphical diff tool, so if you've ever used the **diff** command and struggled to make sense of the output, [Meld][2] is here to help.
+
+Here is a brilliant description from the project's website:
+
+> "Meld is a visual diff and merge tool targeted at developers. Meld helps you compare files, directories, and version controlled projects. It provides two- and three-way comparison of both files and directories, and has support for many popular version control systems.
+>
+> "Meld helps you review code changes and understand patches. It might even help you to figure out what is going on in that merge you keep avoiding."
+
+You can install Meld on Debian/Ubuntu systems (including Raspbian) with:
+
+
+```
+`$ sudo apt install meld`
+```
+
+On Fedora or similar, it's:
+
+
+```
+`$ sudo dnf install meld`
+```
+
+Meld is cross-platform—there's a [Windows install][3] using the [Chocolately][4] package manager. While it's not officially supported on macOS, there are [builds available for Mac][5], and you can install it on Homebrew with:
+
+
+```
+`$ brew cask install meld`
+```
+
+See Meld's homepage for [additional options][2].
+
+### Meld vs. the diff command
+
+If you have two similar files (perhaps one is a modified version of the other) and want to see the changes between them, you could run the **diff** command to see their differences in the terminal:
+
+![diff output][6]
+
+This example shows the differences between **conway1.py** and **conway2.py**. It's showing that I:
+
+ * Removed the [shebang][7] and second line
+ * Removed **(object)** from the class declaration
+ * Added a docstring to the class
+ * Swapped the order of **alive** and **neighbours == 2** in a method
+
+
+
+Here's the same example using the **meld** command. You can run the same comparison from the command line with:
+
+
+```
+`$ meld conway1.py conway2.py`
+```
+
+![Meld output][8]
+
+Much clearer!
+
+You can easily see changes and merge changes between files by clicking the arrows (they work both ways). You can even edit the files live (Meld doubles up as a simple text editor with live comparisons as you type)—just be sure to save before you close the window.
+
+You can even compare and edit three different files:
+
+![Comparing three files in Meld][9]
+
+### Meld's Git-awareness
+
+Hopefully, you're using a version control system like [Git][10]. If so, your comparison isn't between two different files but to find differences between the current working file and the one Git knows. Meld understands this, so if you run **meld conway.py**, where **conway.py** is known by Git, it'll show you any changes made since the last Git commit:
+
+![Comparing Git files in Meld][11]
+
+You can see changes made in the current version (on the right) and the repository version (on the left). You can see I deleted a method and added a parameter and a loop since the last commit.
+
+If you run **meld .**, you'll see all the changes in the current directory (or the whole repository, if you're in its root):
+
+![Meld . output][12]
+
+You can see a single file is modified, another file is unversioned (meaning it's new to Git, so I need to **git add** the file before comparing it), and lots of other unmodified files. Various display options are provided by icons along the top.
+
+You can also compare two directories, which is sometimes handy:
+
+![Comparing directories in Meld][13]
+
+### Conclusion
+
+Even regular users can find comparisons with diff difficult to decipher. I find the visualizations Meld provides make a big difference in troubleshooting what's changed between files. On top of that, Meld comes with some helpful awareness of version control and helps you compare across Git commits without thinking much about it. Give Meld a go, and make troubleshooting a little easier on the eyes.
+
+* * *
+
+_This was originally published on Ben Nuttall's [Tooling blog][14] and is reused with permission._
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/meld
+
+作者:[Ben Nuttall][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/bennuttall
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/coffee_tea_laptop_computer_work_desk.png?itok=D5yMx_Dr (Person drinking a hat drink at the computer)
+[2]: https://meldmerge.org/
+[3]: https://chocolatey.org/packages/meld
+[4]: https://opensource.com/article/20/3/chocolatey
+[5]: https://yousseb.github.io/meld/
+[6]: https://opensource.com/sites/default/files/uploads/diff-output.png (diff output)
+[7]: https://en.wikipedia.org/wiki/Shebang_(Unix)
+[8]: https://opensource.com/sites/default/files/uploads/meld-output.png (Meld output)
+[9]: https://opensource.com/sites/default/files/uploads/meld-3-files.png (Comparing three files in Meld)
+[10]: https://opensource.com/resources/what-is-git
+[11]: https://opensource.com/sites/default/files/uploads/meld-git.png (Comparing Git files in Meld)
+[12]: https://opensource.com/sites/default/files/uploads/meld-directory-changes.png (Meld . output)
+[13]: https://opensource.com/sites/default/files/uploads/meld-directory-compare.png (Comparing directories in Meld)
+[14]: https://tooling.bennuttall.com/meld/
diff --git a/sources/tech/20200323 How to create a personal file server with SSH on Linux.md b/sources/tech/20200323 How to create a personal file server with SSH on Linux.md
new file mode 100644
index 0000000000..f758123bb1
--- /dev/null
+++ b/sources/tech/20200323 How to create a personal file server with SSH on Linux.md
@@ -0,0 +1,137 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How to create a personal file server with SSH on Linux)
+[#]: via: (https://opensource.com/article/20/3/personal-file-server-ssh)
+[#]: author: (Jim Hall https://opensource.com/users/jim-hall)
+
+How to create a personal file server with SSH on Linux
+======
+Connecting to a remote Linux system over SSH is just plain easy. Here's
+how to do it.
+![Hand putting a Linux file folder into a drawer][1]
+
+The Raspberry Pi makes for a useful and inexpensive home server for lots of things. I most often use the [Raspberry Pi as a print server][2] to share a laser printer with other devices in our home or as a personal file server to store copies of projects and other data.
+
+I use this file server in various ways. Let's say I'm working on a project, such as a new book, and I want to make a snapshot copy of my work and all my associated files. In that case, I simply copy my **BookProject** folder to a **BookBackup** folder on the file server.
+
+Or if I'm cleaning up my local files, and I discover some files that I don't really need but I'm not yet ready to delete, I'll copy them to a **KeepForLater** folder on the file server. That's a convenient way to remove clutter from my everyday Linux system and offload infrequently used files to my personal file server.
+
+Setting up a Raspberry Pi—or any Linux system—as a personal file server doesn't require configuring Network File System (NFS) or Common Internet File System (CIFS) or tinkering with other file-sharing systems such as WebDAV. You can easily set up a remote file server using SSH. And here's how.
+
+### Set up SSHD on the remote system
+
+Your Linux system probably has the SSH daemon (sshd) installed. It may even be running by default. If not, you can easily set up SSH through whatever control panel you prefer on your Linux distribution. I run [Fedora ARM][3] on my Raspberry Pi, and I can access the control panel remotely by pointing my Pi's web browser to port 9090. (On my home network, the Raspberry Pi's IP address is **10.0.0.11**, so I connect to **10.0.0.11:9090**.) If the SSH daemon isn't running by default, you can set it to start automatically in Services in the control panel.
+
+![sshd in the list of system services][4]
+
+You can find sshd in the list of system services.
+
+![slider to activate sshd][5]
+
+Click the slider to activate **sshd** if it isn't already.
+
+### Do you have an account?
+
+Make sure you have an account on the remote system. It might be the same as the username you use on your local system, or it could be something different.
+
+On the popular Raspbian distribution, the default account username is **pi**. But other Linux distributions may require you to set up a unique new user when you install it. If you don't know your username, you can use your distribution's control panel to create one. On my Raspberry Pi, I set up a **jhall** account that matches the username on my everyday Linux desktop machine.
+
+![Set up a new account on Fedora Server][6]
+
+If you use Fedora Server, click the **Create New Account** button to set up a new account.
+
+![Set password or SSH key][7]
+
+Don't forget to set a password or add a public SSH key.
+
+### Optional: Share your SSH public key
+
+If you exchange your public SSH key with the remote Linux system, you can log in without having to enter a password. This step is optional; you can use a password if you prefer.
+
+You can learn more about SSH keys in these Opensource.com articles:
+
+ * [Tools for SSH key management][8]
+ * [Graphically manage SSH keys with Seahorse][9]
+ * [How to manage multiple SSH keys][10]
+ * [How to enable SSH access using a GPG key for authentication][11]
+
+
+
+### Make a file manager shortcut
+
+Since you've started the SSH daemon on the remote system and set up your account username and password, all that's left is to map a shortcut to the other Linux system from your file manager. I use GNOME as my desktop, but the steps are basically the same for any Linux desktop.
+
+#### Make the initial connection
+
+In the GNOME file manager, look for the **+Other Locations** button in the left-hand navigation. Click that to open a **Connect to Server** prompt. Enter the address of the remote Linux server here, starting with the SSH connection protocol.
+
+![Creating a shortcut in GNOME file manager][12]
+
+The GNOME file manager supports a variety of connection protocols. To make a connection over SSH, start your server address with **sftp://** or **ssh://**.
+
+If your username is the same on your local Linux system and your remote Linux system, you can just enter the server's address and the folder location. To make my connection to the **/home/jhall** directory on my Raspberry Pi, I use:
+
+
+```
+`sftp://10.0.0.11/home/jhall`
+```
+
+![GNOME file manager Connect to Server][13]
+
+If your username is different, you can specify your remote system's username with an **@** sign before the remote system's address. To connect to a Raspbian system on the other end, you might use:
+
+
+```
+`sftp://pi@10.0.0.11/home/pi`
+```
+
+![GNOME file manager Connect to Server][14]
+
+If you didn't share your public SSH key, you may need to enter a password. Otherwise, the GNOME file manager should automatically open the folder on the remote system and let you navigate.
+
+![GNOME file manager connection][15]
+
+#### Create a shortcut so you can easily connect to the server later
+
+This is easy in the GNOME file manager. Right-click on the remote system's name in the navigation list, and select **Add Bookmark**. This creates a shortcut to the remote location.
+
+![GNOME file manager - adding bookmark][16]
+
+If you want to give the bookmark a more memorable name, you can right-click on the shortcut and choose **Rename**.
+
+### That's it!
+
+Connecting to a remote Linux system over SSH is just plain easy. And you can use the same method to connect to systems other than home file servers. I also have a shortcut that allows me to instantly access files on my provider's web server and another that lets me open a folder on my project server. SSH makes it a secure connection; all of my traffic is encrypted. Once I've opened the remote system over SSH, I can use the GNOME file manager to manage my remote files as easily as I'd manage my local folders.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/personal-file-server-ssh
+
+作者:[Jim Hall][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/jim-hall
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/yearbook-haff-rx-linux-file-lead_0.png?itok=-i0NNfDC (Hand putting a Linux file folder into a drawer)
+[2]: https://opensource.com/article/18/3/print-server-raspberry-pi
+[3]: https://arm.fedoraproject.org/
+[4]: https://opensource.com/sites/default/files/uploads/fedora-server-control-panel-sshd.png (sshd in the list of system services)
+[5]: https://opensource.com/sites/default/files/uploads/fedora-server-control-panel-sshd-service.png (slider to activate sshd)
+[6]: https://opensource.com/sites/default/files/uploads/fedora-server-control-panel-accounts_create-user.png (Set up a new account on Fedora Server)
+[7]: https://opensource.com/sites/default/files/uploads/fedora-server-control-panel-accounts.png (Set password or SSH key)
+[8]: https://opensource.com/article/20/2/ssh-tools
+[9]: https://opensource.com/article/19/4/ssh-keys-seahorse
+[10]: https://opensource.com/article/19/4/gpg-subkeys-ssh-manage
+[11]: https://opensource.com/article/19/4/gpg-subkeys-ssh
+[12]: https://opensource.com/sites/default/files/uploads/gnome-file-manager-other-locations.png (Creating a shortcut in GNOME file manager)
+[13]: https://opensource.com/sites/default/files/uploads/gnome-file-manager-other-sftp.png (GNOME file manager Connect to Server)
+[14]: https://opensource.com/sites/default/files/uploads/gnome-file-manager-other-sftp-username.png (GNOME file manager Connect to Server)
+[15]: https://opensource.com/sites/default/files/uploads/gnome-file-manager-remote-jhall.png (GNOME file manager connection)
+[16]: https://opensource.com/sites/default/files/uploads/gnome-file-manager-remote-jhall-add-bookmark.png (GNOME file manager - adding bookmark)
diff --git a/sources/tech/20200324 Audacious 4.0 Released With Qt 5- Here-s How to Install it on Ubuntu.md b/sources/tech/20200324 Audacious 4.0 Released With Qt 5- Here-s How to Install it on Ubuntu.md
new file mode 100644
index 0000000000..53e7ea3fa6
--- /dev/null
+++ b/sources/tech/20200324 Audacious 4.0 Released With Qt 5- Here-s How to Install it on Ubuntu.md
@@ -0,0 +1,106 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Audacious 4.0 Released With Qt 5: Here’s How to Install it on Ubuntu)
+[#]: via: (https://itsfoss.com/audacious-4-release/)
+[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
+
+Audacious 4.0 Released With Qt 5: Here’s How to Install it on Ubuntu
+======
+
+[Audacious][1] is an open-source audio player available for multiple platforms that include Linux. Almost after 2 years of its last major release, Audacious 4.0 has arrived with some big changes.
+
+The latest release Audacious 4.0 comes with [Qt 5][2] UI by default. You can still go for the old GTK2 UI from the source – however, the new features will be added to the Qt UI only.
+
+Let’s take a look at what has changed and how to install the latest Audacious on your Linux system.
+
+### Audacious 4.0 Key Changes & Features
+
+![Audacious 4 Release][3]
+
+Of course, the major change would be the use of Qt 5 UI as the default. In addition to that, there are a lot of improvements and feature additions mentioned in their [official announcement post][4], here they are:
+
+ * Clicking on playlist column headers sorts the playlist
+ * Dragging playlist column headers changes the column order
+ * Application-wide settings for volume and time step sizes
+ * New option to hide playlist tabs
+ * Sorting playlist by path now sorts folders after files
+ * Implemented additional MPRIS calls for compatibility with KDE 5.16+
+ * New OpenMPT-based tracker module plugin
+ * New VU Meter visualization plugin
+ * Added option to use a SOCKS network proxy
+ * The Song Change plugin now works on Windows
+ * New “Next Album” and “Previous Album” commands
+ * The tag editor in Qt UI can now edit multiple files at once
+ * Implemented equalizer presets window for Qt UI
+ * Lyrics plugin gained the ability to save and load lyrics locally
+ * Blur Scope and Spectrum Analyzer visualizations ported to Qt
+ * MIDI plugin SoundFont selection ported to Qt
+ * JACK output plugin gained some new options
+ * Added option to endlessly loop PSF files
+
+
+
+If you didn’t know about it previously, you can easily get it installed and use the equalizer coupled with [LADSP][5] effects to tweak your music experience.
+
+![Audacious Winamp Classic Interface][6]
+
+### How to Install Audacious 4.0 on Ubuntu
+
+It is worth noting that the [unofficial PPA][7] is made available by [UbuntuHandbook][8]. You can simply follow the instructions below to install it on Ubuntu 16.04, 18.04, 19.10, and 20.04.
+
+1\. First, you have to add the PPA to your system by typing in the following command in the terminal:
+
+```
+sudo add-apt-repository ppa:ubuntuhandbook1/apps
+```
+
+3\. Next, you need to update/refresh the package information from the repositories/sources you have and proceed to install the app. Here’s how to do that:
+
+```
+sudo apt update
+sudo apt install audacious audacious-plugins
+```
+
+That’s it. You don’t have to do anything else. In either case, if you want to [remove the PPA and the software][9], just type in the following commands in order:
+
+```
+sudo add-apt-repository --remove ppa:ubuntuhandbook1/apps
+sudo apt remove --autoremove audacious audacious-plugins
+```
+
+You can also check out their GitHub page for more information on the source and potentially install it on other Linux distros as well, if that’s what you’re looking for.
+
+[Audacious Source Code][10]
+
+### Wrapping Up
+
+The new features and the Qt 5 UI switch should be a good thing to improve the user experience and the functionality of the audio player. If you’re a fan of the classic Winamp interface, it works just fine as well – but missing a few features as mentioned in their announcement post.
+
+You can try it out and let me know your thoughts in the comments below!
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/audacious-4-release/
+
+作者:[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://audacious-media-player.org
+[2]: https://doc.qt.io/qt-5/qt5-intro.html
+[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/audacious-4-release.jpg?ssl=1
+[4]: https://audacious-media-player.org/news/45-audacious-4-0-released
+[5]: https://www.ladspa.org/
+[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/audacious-winamp.jpg?ssl=1
+[7]: https://itsfoss.com/ppa-guide/
+[8]: http://ubuntuhandbook.org/index.php/2020/03/audacious-4-0-released-qt5-ui/
+[9]: https://itsfoss.com/how-to-remove-or-delete-ppas-quick-tip/
+[10]: https://github.com/audacious-media-player/audacious
diff --git a/translated/talk/20200225 7 tips for writing an effective technical resume.md b/translated/talk/20200225 7 tips for writing an effective technical resume.md
deleted file mode 100644
index 20f7edf8f1..0000000000
--- a/translated/talk/20200225 7 tips for writing an effective technical resume.md
+++ /dev/null
@@ -1,71 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: (Morisun029)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (7 tips for writing an effective technical resume)
-[#]: via: (https://opensource.com/article/20/2/technical-resume-writing)
-[#]: author: (Emily Brand https://opensource.com/users/emily-brand)
-
-撰写有效技术简历的7个技巧
-======
-遵循以下这些要点,把自己最好的一面呈现给潜在雇主。
-![Two hands holding a resume with computer, clock, and desk chair ][1]
-
-如果你是一名软件工程师或技术领域的经理,那么创建或更新简历可能是一项艰巨的任务。 要考虑的重点是什么? 应该怎么处理格式,内容以及目标或摘要? 哪些工作经验相关? 如何确保自动招聘工具不会过滤掉你的简历?
-
-在过去的七年中,作为一名招聘经理,我看到了各种各样的简历; 尽管有些令人印象深刻,但还有很多人写的很糟糕。
-
-在编写或更新简历时,请遵循以下七个简单原则。
-
-### 1\. 概述
-
-简历顶部的简短段落应简洁明了,目的明确,避免过多使用形容词和副词。 诸如“令人印象深刻”,“广泛”和“优秀”之类的词,这些词不会增加你的招聘机会; 相反,它们看起来和感觉上像是过度使用的填充词。 关于你的目标,问自己一个重要的问题: **它是否告诉招聘经理我正在寻找什么样的工作以及如何为他们提供价值?** 如果不是,请加强并简化它以回答该问题,或者将其完全排除在外。
-
-### 2\. 工作经验
-
-数字,数字,数字。 用事实传达观点远比一般的陈述,例如“帮助构建,管理,交付许多对客户利润有贡献的项目” 更能对你有帮助。 你的表达中应包括统计数据,例如“直接影响了五个顶级银行的项目,这些项目将其上市时间缩短了40%”,你提交了多少行代码或管理了几个团队。 数据比修饰语更能有效地展示你的能力和价值。
-
-如果你经验不足,没有什么工作经验可展示,那无关的经验,如暑期兼职工作,就不要写了。 相反,将相关经验的细节以及你所学到的知识的详细信息写进简历,这些可以使你成为一个更好的候选人。
-
-### 3\. 搜索术语和行话
-
-随着技术在招聘过程中发挥如此巨大的作用,确保简历被标记为正确的职位非常重要,但不要在简历上过分吹嘘自己。 如果你提到敏捷技能但不知道看板是什么,请三思。 如果你提到自己精通Java,但是已经有五年都没有使用过Java了,请小心。 如果存在你熟悉但不一定是最新的语言和框架,请创建其他类别或将你的经验分为“精通”和“熟悉”。
-
-### 4\. 教育
-
-如果你不是应届大学毕业生,那就没必要再写你的GPA或你参加过的俱乐部或兄弟会,除非你计划将它们用作谈话要点以在面试中赢得信任。 确保你发表的或获取过专利的东西包括在内,即使与你的工作无关。 如果你没有大学学位,请添加一个证书部分代替教育背景部分。 如果你是军人,请包括现役和预备时间。
-
-### 5\. 资质证书
-
-除非你想重新进入之前离开的领域,否则不要写过期的证书,例如,如果你曾经是一名人事经理,而现在正寻求动手编程的工作。 如果你拥有与该领域不再相关的认证,就不要写这些认证,因为这些可能会分散招聘者的注意力,使你的简历失去吸引力。 利用你的 LinkedIn 个人资料为简历添加更多色彩,因为大多数人在面试之前都会阅读你的简历和 LinkedIn 个人资料。
-
-### 6\. 拼写和语法
-
-
-让其他人对你的简历进行校对。 很多时候,我在简历中看到拼写错误的单词,或者错误用词,如“他们的”、“他们是”、“那些”。 这些可以避免和修复的错误会产生负面影响。 理想情况下,你的简历应用主动语态,但是如果这样会使你感到不舒服,那么就用过去时书写-最重要的是要始终保持一致。 不正确的拼写和语法会传递你要么不是很在乎所申请的工作,要么没有足够注意细节。
-
-### 7\. 格式
-
-确保你的简历是最新的并且富有吸引力,这是留下良好第一印象的简便方法。 确保格式一致,例如相同的页边距,相同的间距,大写字母和颜色(将调色板保持在最低水平)是简历写作中最基本的部分,但有必要表明你对工作感到豪感,并重视自己的价值和未来的雇主。 在适当的地方使用表格,以视觉吸引人的方式分配信息。 如果有给定模板,以 .pdf 和 .docx 格式上传简历,然后用 Google Docs 导出为 .odt 格式,这样可以在 LibreOffice 中轻松打开。 这是我推荐的简单的 Google 文档简历模板。 你还可以支付少量费用(不到10美元)从一些设计公司购买。
-
-### 定期更新
-
-如果你被要求(或希望)申请一份工作,定期更新简历可以最大程度地减少压力,也可以帮助你创建和维护更准确的简历版本。 撰写简历时,要有远见,确保至少让其他三个人对你的简历内容,拼写和语法进行检查。 即使你是由公司招募或其他人推荐给公司的,面试官也可能仅通过简历认识你,因此请确保它为你带来良好的第一印象。
-
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/20/2/technical-resume-writing
-
-作者:[Emily Brand][a]
-选题:[lujun9972][b]
-译者:[Morisun029](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://opensource.com/users/emily-brand
-[b]: https://github.com/lujun9972
-[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/resume_career_document_general.png?itok=JEaFL2XI (Two hands holding a resume with computer, clock, and desk chair )
-[2]: https://docs.google.com/document/d/1ARVyybC5qQEiCzUOLElwAdPpKOK0Qf88srr682eHdCQ/edit
diff --git a/sources/tech/20180708 Building a Messenger App- Conversations.md b/translated/tech/20180708 Building a Messenger App- Conversations.md
similarity index 62%
rename from sources/tech/20180708 Building a Messenger App- Conversations.md
rename to translated/tech/20180708 Building a Messenger App- Conversations.md
index 1a5c7d251a..8ab0e2c083 100644
--- a/sources/tech/20180708 Building a Messenger App- Conversations.md
+++ b/translated/tech/20180708 Building a Messenger App- Conversations.md
@@ -7,35 +7,33 @@
[#]: via: (https://nicolasparada.netlify.com/posts/go-messenger-conversations/)
[#]: author: (Nicolás Parada https://nicolasparada.netlify.com/)
-Building a Messenger App: Conversations
+构建一个即时消息应用(三):对话
======
-This post is the 3rd in a series:
+本文是该系列的第三篇。
- * [Part 1: Schema][1]
- * [Part 2: OAuth][2]
+* [第一篇:模式][1]
+* [第二篇:OAuth][2]
+在我们的即时消息应用中,消息表现为两个参与者对话的堆叠。如果你想要开始异常对话,就应该向应用提供你想要交谈的用户,而当对话创建后(如果该对话此前并不存在),就可以向该对话发送消息。
+就前端而言,我们可能想要显示一份近期对话列表。并在此处显示对话的最后一条消息以及另一个参与者的姓名和头像。
-In our messenger app, messages are stacked by conversations between two participants. You start a conversation providing the user you want to chat with, the conversations is created (if not exists already) and you can start sending messages to that conversations.
+在这篇帖子中,我们将会编写一些端点(endpoints)来完成像「创建对话」、「获取对话列表」以及「找到单个对话」这样的任务。
-On the front-end we’re interested in showing a list of the lastest conversations. There we’ll show the last message of it and the name and avatar of the other participant.
+首先,要在主函数 `main()` 中添加下面的路由。
-In this post, we’ll code the endpoints to start a conversation, list the latest and find a single one.
-
-Inside the `main()` function add this routes.
-
-```
+```go
router.HandleFunc("POST", "/api/conversations", requireJSON(guard(createConversation)))
router.HandleFunc("GET", "/api/conversations", guard(getConversations))
router.HandleFunc("GET", "/api/conversations/:conversationID", guard(getConversation))
```
-These three endpoints require authentication so we use the `guard()` middleware. There is a new middleware that checks for the request content type JSON.
+这三个端点都需要进行身份验证,所以我们将会使用 `guard()` 中间件。我们也会构建一个新的中间件,用于检查请求内容是否为 JSON 格式。
-### Require JSON Middleware
+### JSON 请求检查中间件
-```
+```go
func requireJSON(handler http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
if ct := r.Header.Get("Content-Type"); !strings.HasPrefix(ct, "application/json") {
@@ -47,11 +45,11 @@ func requireJSON(handler http.HandlerFunc) http.HandlerFunc {
}
```
-If the request isn’t JSON, it responds with a `415 Unsupported Media Type` error.
+如果请求(request)不是 JSON 格式,那么它会返回 `415 Unsupported Media Type`(不支持的媒体类型)错误。
-### Create Conversation
+### 创建对话
-```
+```go
type Conversation struct {
ID string `json:"id"`
OtherParticipant *User `json:"otherParticipant"`
@@ -60,9 +58,9 @@ type Conversation struct {
}
```
-So, a conversation holds a reference to the other participant and the last message. Also has a bool field to tell if it has unread messages.
+就像上面的代码那样,对话中保持对另一个参与者和最后一条消息的引用,还有一个 bool 类型的字段,用来告知是否有未读消息。
-```
+```go
type Message struct {
ID string `json:"id"`
Content string `json:"content"`
@@ -74,11 +72,11 @@ type Message struct {
}
```
-Messages are for the next post, but I define the struct now since we are using it. Most of the fields are the same as the database table. We have `Mine` to tell if the message is owned by the current authenticated user and `ReceiverID` will be used to filter messanges once we add realtime capabilities.
+我们会在下一篇文章介绍与消息相关的内容,但由于我们这里也需要用到它,所以先定义了 `Message` 结构体。其中大多数字段与数据库表一致。我们需要使用 `Mine` 来断定消息是否属于当前已验证用户所有。一旦加入实时功能,`ReceiverID` 可以帮助我们过滤消息。
-Lets write the HTTP handler then. It’s quite long but don’t be scared.
+接下来让我们编写 HTTP 处理程序。尽管它有些长,但也没什么好怕的。
-```
+```go
func createConversation(w http.ResponseWriter, r *http.Request) {
var input struct {
Username string `json:"username"`
@@ -170,19 +168,19 @@ func createConversation(w http.ResponseWriter, r *http.Request) {
}
```
-For this endpoint you do a POST request to `/api/conversations` with a JSON body containing the username of the user you want to chat with.
+在此端点,你会向 `/api/conversations` 发送 POST 请求,请求的 JSON 主体中包含要对话的用户的用户名。
-So first it decodes the request body into an struct with the username. Then it validates that the username is not empty.
+因此,首先需要将请求主体解析成包含用户名的结构。然后,校验用户名不能为空。
-```
+```go
type Errors struct {
Errors map[string]string `json:"errors"`
}
```
-This is the `Errors` struct. It’s just a map. If you enter an empty username you get this JSON with a `422 Unprocessable Entity` error.
+这是错误消息的结构体 `Errors`,它仅仅是一个映射。如果输入空用户名,你就会得到一段带有 `422 Unprocessable Entity`(无法处理的实体)错误消息的 JSON 。
-```
+```json
{
"errors": {
"username": "Username required"
@@ -190,17 +188,17 @@ This is the `Errors` struct. It’s just a map. If you enter an empty username y
}
```
-Then, we begin an SQL transaction. We only received an username, but we need the actual user ID. So the first part of the transaction is to query for the id and avatar of that user (the other participant). If the user is not found, we respond with a `404 Not Found` error. Also, if the user happens to be the same as the current authenticated user, we respond with `403 Forbidden`. There should be two different users, not the same.
+然后,我们开始执行 SQL 事务。收到的仅仅是用户名,但事实上,我们需要知道实际的用户 ID 。因此,事务的第一项内容是查询另一个参与者的 ID 和头像。如果找不到该用户,我们将会返回 `404 Not Found`(未找到) 错误。另外,如果找到的用户恰好和「当前已验证用户」相同,我们应该返回 `403 Forbidden`(拒绝处理)错误。这是由于对话只应当在两个不同的用户之间发起,而不能是同一个。
-Then, we try to find a conversation those two users have in common. We use `INTERSECT` for that. If there is one, we redirect to that conversation `/api/conversations/{conversationID}` and return there.
+然后,我们试图找到这两个用户所共有的对话,所以需要使用 `INTERSECT` 语句。如果存在,只需要通过 `/api/conversations/{conversationID}` 重定向到该对话并将其返回。
-If no common conversation was found, we continue by creating a new one and adding the two participants. Finally, we `COMMIT` the transaction and respond with the newly created conversation.
+如果未找到共有的对话,我们需要创建一个新的对话并添加指定的两个参与者。最后,我们 `COMMIT` 该事务并使用新创建的对话进行响应。
-### Get Conversations
+### 获取对话列表
-This endpoint `/api/conversations` is to get all the conversations of the current authenticated user.
+端点 `/api/conversations` 将获取当前已验证用户的所有对话。
-```
+```go
func getConversations(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
authUserID := ctx.Value(keyAuthUserID).(string)
@@ -267,17 +265,17 @@ func getConversations(w http.ResponseWriter, r *http.Request) {
}
```
-This handler just does a query to the database. It queries to the conversations table with some joins… First, to the messages table to get the last message. Then to the participants, but it adds a condition to a participant whose ID is not the one of the current authenticated user; this is the other participant. Then it joins to the users table to get his username and avatar. And finally joins with the participants again but with the contrary condition, so this participant is the current authenticated user. We compare `messages_read_at` with the message `created_at` to know whether the conversation has unread messages. And we use the message `user_id` to check if it’s “mine” or not.
+该处理程序仅对数据库进行查询。它通过一些联接来查询对话表……首先,从消息表中获取最后一条消息。然后依据「ID 与当前已验证用户不同」的条件,从参与者表找到对话的另一个参与者。然后联接到用户表以获取该用户的用户名和头像。最后,再次联接参与者表,并以相反的条件从该表中找出参与对话的另一个用户,其实就是当前已验证用户。我们会对比消息中的 `messages_read_at` 和 `created_at` 两个字段,以确定对话中是否存在未读消息。然后,我们通过 `user_id` 字段来判定该消息是否属于「我」(指当前已验证用户)。
-Note that this query assumes that a conversation has just two users. It only works for that scenario. Also, if you want to show a count of the unread messages, this design isn’t good. I think you could add a `unread_messages_count` `INT` field on the `participants` table and increment it each time a new message is created and reset it when the user read them.
+注意,此查询过程假定对话中只有两个用户参与,它也仅仅适用于这种情况。另外,该设计也不很适用于需要显示未读消息数量的情况。如果需要显示未读消息的数量,我认为可以在 `participants` 表上添加一个`unread_messages_count` `INT` 字段,并在每次创建新消息的时候递增它,如果用户已读则重置该字段。
-Then it iterates over the rows, scan each one to make an slice of conversations and respond with those at the end.
+接下来需要遍历每一条记录,通过扫描每一个存在的对话来建立一个对话切片(an slice of conversations)并在最后进行响应。
-### Get Conversation
+### 找到单个对话
-This endpoint `/api/conversations/{conversationID}` respond with a single conversation by its ID.
+端点 `/api/conversations/{conversationID}` 会根据 ID 对单个对话进行响应。
-```
+```go
func getConversation(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
authUserID := ctx.Value(keyAuthUserID).(string)
@@ -321,15 +319,15 @@ func getConversation(w http.ResponseWriter, r *http.Request) {
}
```
-The query is quite similar. We’re not interested in showing the last message, so we omit those fields, but we need the message to know whether the conversation has unread messages. This time we do a `LEFT JOIN` instead of an `INNER JOIN` because the `last_message_id` is `NULLABLE`; in other case we won’t get any rows. We use an `IFNULL` in the `has_unread_messages` comparison for that reason too. Lastly, we filter by ID.
+这里的查询与之前有点类似。尽管我们并不关心最后一条消息的显示问题,并因此忽略了与之相关的一些字段,但是我们需要根据这条消息来判断对话中是否存在未读消息。此时,我们使用 `LEFT JOIN` 来代替 `INNER JOIN`,因为 `last_message_id` 字段是 `NULLABLE`(可以为空)的;而其他情况下,我们无法得到任何记录。基于同样的理由,我们在 `has_unread_messages` 的比较中使用了 `IFNULL` 语句。最后,我们按 ID 进行过滤。
-If the query returns no rows, we respond with a `404 Not Found` error, otherwise `200 OK` with the found conversation.
+如果查询没有返回任何记录,我们的响应会返回 `404 Not Found` 错误,否则响应将会返回 `200 OK` 以及找到的对话。
* * *
-Yeah, that concludes with the conversation endpoints.
+本篇帖子以创建了一些对话端点结束。
-Wait for the next post to create and list messages 👋
+在下一篇帖子中,我们将会看到如何创建并列出消息。
[Souce Code][3]
@@ -346,6 +344,6 @@ via: https://nicolasparada.netlify.com/posts/go-messenger-conversations/
[a]: https://nicolasparada.netlify.com/
[b]: https://github.com/lujun9972
-[1]: https://nicolasparada.netlify.com/posts/go-messenger-schema/
-[2]: https://nicolasparada.netlify.com/posts/go-messenger-oauth/
+[1]: https://linux.cn/article-11396-1.html
+[2]: https://linux.cn/article-11510-1.html
[3]: https://github.com/nicolasparada/go-messenger-demo
diff --git a/translated/tech/20191224 Why your Python code should be flat and sparse.md b/translated/tech/20191224 Why your Python code should be flat and sparse.md
new file mode 100644
index 0000000000..d1d59b5fc6
--- /dev/null
+++ b/translated/tech/20191224 Why your Python code should be flat and sparse.md
@@ -0,0 +1,86 @@
+[#]: collector: (lujun9972)
+[#]: translator: (caiichenr)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Why your Python code should be flat and sparse)
+[#]: via: (https://opensource.com/article/19/12/zen-python-flat-sparse)
+[#]: author: (Moshe Zadka https://opensource.com/users/moshez)
+
+为何你的 Python 代码应是扁平与稀疏的
+======
+本文是 Python 之禅特别系列当中的一篇,此篇着眼于其中第五与第六条原则:扁平与稀疏。
+![Digital creative of a browser on the internet][1]
+
+[Python之禅][2] 得名如此,正是由于它那简明扼要的规则被设计出的意图在于让读者进行深入地思考,而绝不单是为编程提供一份易于遵守的指南。
+
+读后不去三思其意,断然难以体会 Python 之禅的妙处。倘若 Python 之禅仅仅罗列出一组清晰的法则,那法则之间的矛盾只能算作一种错误。然而用作引导读者去为最优方案沉思的工具,矛盾却是绝佳的。
+
+### 扁平胜过嵌套 Flat is better than nested.
+
+迫于对缩进的强硬要求,Python 对“扁平化”的需求显然远超它者。其余编程语言为了缓解对缩进的需求,通常会在嵌套结构里加入一种“欺诈”的手段。用以说明此点,不妨一同看看JavaScript。
+
+JavaScript 是原生异步的,这意味着程序员用 JavaScript 写的代码会用到大量的回调函数。
+
+
+```
+a(function(resultsFromA) {
+ b(resultsFromA, function(resultsfromB) {
+ c(resultsFromC, function(resultsFromC) {
+ console.log(resultsFromC)
+ }
+ }
+}
+```
+
+忽略这段代码的具体内容,只去观察这段代码的形状与缩进带来极右点的方式。这种独特的“箭头”图形在我们扫看代码时格外扎眼,这种写法也因此被视作不可取,甚至得到了“回调地狱”的绰号。不过,在 JavaScript 中,这种反映嵌套关系的缩进可以通过“欺诈”来回避。
+
+
+```
+a(function(resultsFromA) {
+b(resultsFromA,
+ function(resultsfromB) {
+c(resultsFromC,
+ function(resultsFromC) {
+ console.log(resultsFromC)
+}}}
+```
+
+Python 并没有提供这种欺诈手段:每一级嵌套在代码中都如实的对应着一层缩进。因此,Python 深层的嵌套关系在_视觉_上也一定是深层嵌套的。这使得“回调地狱”的问题对于 Python 而言要比在 JavaScript 中严重得多:嵌套的回调函数必定带来缩进,而绝无使用花括号来“欺诈”的可能。
+
+这项挑战与 Python 之禅的指导原则相结合后,在我参与的库中催生出了一个优雅的解决方案。我们在 [Twisted][3] 框架里提出了 _deferred_ 抽象,日后 JavaScript 中流行的 _promise_ 抽象亦是受其启发而生。正是由于 Python 对整洁代码的坚守,方能推动 Python 开发者去发掘新的,强力的抽象。
+
+
+```
+future_value = future_result()
+future_value.addCallback(a)
+future_value.addCallback(b)
+future_value.addCallback(c)
+```
+
+(现代 JavaScript 程序员也许会觉得这段代码十分眼熟:Promises 着实受到了 Twisted 里 deferreds 抽象的深远影响。)
+
+### 稀疏胜过密集 Sparse is better than dense.
+
+最易降低代码密集程度的方法是引入嵌套。这种习惯也正是有关稀疏的原则要随着前一条提出的原因:在竭尽所能地降低代码密集性之后,我们往往会遗留下_密集_的代码或数据结构。此处的密集,是指塞进过量信息的小段代码,它们会导致错误发生后的解析变得困难。
+
+这种密集性唯有通过创造性的思考方可改善,此外别无捷径。Python 之禅并不为我们提供简单的解决方案,它只会指明改善代码的方向,而非提供“如何”去做的向导。
+
+起身走走,泡个热水澡,抑或是闻闻花香。盘坐冥思,直至灵感袭来。当你终于得到启发,便是动身写代码之时。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/12/zen-python-flat-sparse
+
+作者:[Moshe Zadka][a]
+选题:[lujun9972][b]
+译者:[caiichenr](https://github.com/caiichenr)
+校对:[校对者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://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_web_internet_website.png?itok=g5B_Bw62 (Digital creative of a browser on the internet)
+[2]: https://www.python.org/dev/peps/pep-0020/
+[3]: https://twistedmatrix.com/trac/
diff --git a/translated/tech/20200123 6 things you should be doing with Emacs.md b/translated/tech/20200123 6 things you should be doing with Emacs.md
deleted file mode 100644
index 62ad555cd3..0000000000
--- a/translated/tech/20200123 6 things you should be doing with Emacs.md
+++ /dev/null
@@ -1,102 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: (lujun9972)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (6 things you should be doing with Emacs)
-[#]: via: (https://opensource.com/article/20/1/emacs-cheat-sheet)
-[#]: author: (Seth Kenlon https://opensource.com/users/seth)
-
-6 件你应该用 Emacs 做的事
-======
-下面六件事情你可能都没有意识到可以在 Emacs 下完成。此外,使用我们的新备忘单来充分利用 Emacs 的功能吧。
-![浏览器上给蓝色编辑器 ][1]
-
-想象一下使用 Python 的 IDLE 界面来编辑文本。你可以将文件加载到内存中,编辑它们,并保存更改。但是你执行的每个操作都由 Python 函数定义。例如,调用 **upper()** 来让一个单词全部大写,调用 **open** 打开文件,等等。文本文档中的所有内容都是 Python 对象,可以进行相应的操作。从用户的角度来看,这与其他文本编辑器的体验一致。对于 Python 开发人员来说,这是一个丰富的 Python 环境,只需在配置文件中添加几个自定义函数就可以对其进行更改和开发。
-
-这就是 [Emacs][2] 使用 1958 年的编程语言 [Lisp][3] 所做的事情。在 Emacs 中,运行应用程序的 Lisp 引擎与输入文本之间无缝结合。对 Emacs 来说,一切都是 Lisp 数据,因此一切都可以通过编程进行分析和操作。
-
-这就形成了一个强大的用户界面 (UI)。但是,如果您是 Emacs 的普通用户,您可能对它的能力知之甚少。下面是你可能没有意识到 Emacs 可以做的六件事。
-
-## 使用 Tramp mode 进行云端编辑
-
-Emacs 早在网络流行话之前就实现了透明的网络编辑能力了,而且时至今日,它仍然提供了最流畅的远程编辑体验。Emacs 中的 [Tramp mode][4]( 以前称为 RPC mode) 代表着 “Transparent Remote (file) Access,Multiple Protocol( 透明的远程(文件)访问,多协议)”,这详细描述了它提供的功能:通过最流行的网络协议轻松访问您希望编辑的远程文件。目前最流行、最安全的远程编辑协议是 [OpenSSH][5],因此 Tramp 使用它作为默认的协议。
-
-在 Emacs 22.1 或更高版本中已经包含了 Tramp,因此要使用 Tramp,只需使用 Tramp 语法打开一个文件。在 Emacs 的 **File** 菜单中,选择 **Open File**。当在 Emacs 窗口底部的小缓冲区中出现提示时,使用以下语法输入文件名:
-
-```
-`/ssh:user@example.com:/path/to/file`
-```
-
-如果需要交互式登录,Tramp 会提示输入密码。但是,Tramp 直接使用 OpenSSH,所以为了避免交互提示,你可以将主机名、用户名和 SSH 密钥路径添加到您的 `~/.ssh/config` 文件。与 Git 一样,Emacs 首先使用 SSH 配置,只有在出现错误时才会停下来询问更多信息。
-
-Tramp 非常适合编辑计算机上不存在的文件,它的用户体验与编辑本地文件没有明显的区别。下次,当你 SSH 到服务器启动 Vim 或 Emacs 会话时,请尝试使用 Tramp。
-
-## 日历
-
-如果你喜欢文本多过图形界面,那么你一定会很高兴地知道,可以使用 Emacs 以纯文本的方式安排你的日程(或生活)。而且你依然可以在移动设备上使用开放源码的 [Org mode][6] 查看器来获得华丽的通知。
-
-这个过程需要一些配置来创建一个方便的方式来与移动设备同步你的日程(我使用 Git,但你可以调用蓝牙,KDE Connect,Nextcloud,或其他文件同步工具),此外你必须安装一个 Org mode 查看器(如 [Orgzly][7]) 以及移动设备上的 Git 客户程序。但是,一旦你搭建好了这些基础,该流程就会与您常用的(或正在完善的,如果您是新用户 )Emacs 工作流完美地集成在一起。你可以在 Emacs 中方便地查阅日程,更新日程,并专注于任务上。议程上的变化将会反映在移动设备上,因此即使在 Emacs 不可用的时候,你也可以保持条理性。
-
-![][8]
-
-感兴趣了?阅读我的关于[使用 Org mode 和 Git 进行日程安排 ][9] 的逐步指南。
-
-## 访问终端
-
-有[许多终端模拟器 ][10] 可用。尽管 Emacs 中的 Elisp 终端仿真器不是最强大的通用仿真器,但是它有两个显著的优点。
-
-1。**在 Emacs 缓冲区中打开:**我使用 Emacs 的 Elisp shell,因为它在 Emacs 窗口中打开很方便,我经常全屏运行该窗口。这是一个小而重要的优势,只需要输入 `Ctrl+x+o`( 或用 Emacs 符号来表示就是 C-x) 就能使用终端了,而且它还有一个特别好的地方在于当运行漫长的作业时能够一瞥它的状态报告。
-2。**在没有系统剪贴板的情况下复制和粘贴特别方便:** 无论是因为懒惰不愿将手从键盘移动到鼠标,还是因为在远程控制台运行 Emacs 而无法使用鼠标,在 Emacs 中运行终端有时意味着可以快从 Emacs 缓冲区中传输数据到 Bash。
-
-
-
-要尝试 Emacs 终端,输入 `Alt+x (用 Emacs 符号表示就是 M-x)`,然后输入 **shell**,然后按 **Return**。
-
-## 使用 Racket mode
-
-[Racket][11] 是一种激动人心的新兴 Lisp 方言,拥有动态编程环境 、GUI 工具包和热情的社区。学习 Racket 的默认编辑器是 DrRacket,它的顶部是定义面板,底部是交互面板。使用该设置,用户可以编写影响 Racket 运行时的定义。就像旧的 [Logo Turtle][12] 程序,但是有一个终端而不是仅仅一个海龟。
-
-![Racket-mode][13]
-
-由 PLT 提供的 LGPL 示例代码
-
-基于 Lisp 的 Emacs 为资深 Racket 编程人员提供了一个很好的集成开发环境 (IDE)。它还没有自带 [Racket mode][14],但你可以使用 Emacs 包安装程序安装 Racket 模式和辅助扩展。
-要安装它,按下 `Alt+X` (用 Emacs 符号表示就是 **M-x**),键入 **package-install**,然后按 **Return**。然后输入要安装的包 (**racet-mode**),按 **Return**。
-
-使用 **M-x racket-mode** 进入 Racket mode。如果你是 Racket 新手,但不是对 Lisp 或 Emacs 比较熟悉,可以从优秀[图解 Racket][15] 入手。
-
-## 脚本
-
-您可能知道,Bash 脚本在自动化和增强 Linux 或 Unix 体验方面很流行。你可能听说过 Python 在这方面也做得很好。但是你知道 Lisp 脚本可以用同样的方式运行吗?有时人们会对 Lisp 到底有多有用感到困惑,因为许多人是通过 Emacs 来了解 Lisp 的,因此有一种潜在的印象,即在 21 世纪运行 Lisp 的惟一方法是在 Emacs 中运行。幸运的是,事实并非如此,Emacs 是一个很好的 IDE,它支持将 Lisp 脚本作为一般的系统可执行文件来运行。
-
-除了 Elisp 之外,还有两种流行的现代 lisp 可以很容易地用来作为独立脚本运行。
-
-1。**Racket:** 你可以通过在系统上运行 Racket 来提供运行 Racket 脚本所需的运行时支持,或者你可以使用 **raco exe** 产生一个可执行文件。**raco exe** 命令将代码和运行时支持文件一起打包,以创建可执行文件。然后,**raco distribution** 命令将可执行文件打包成可以在其他机器上工作的发行版。Emacs 有许多 Racket 工具,因此在 Emacs 中创建 Racket 文件既简单又有效。
-
-2。**GNU Guile:** [GNU Guile][16](“GNU Ubiquitous Intelligent Language for Extensions”--GNU 通用智能语言扩展的缩写)是 [Scheme][17] 编程语言的一个实现,它用于为桌面 、internet、 终端等创建应用程序和游戏。使用 Emacs 中的 Scheme 扩展众多,使用任何一个扩展来编写 Scheme 都很容易。例如,这里有一个用 Guile 编写的 “Hello world” 脚本:
-```
-#!/usr/bin/guile - s
-
-(display "hello world")
- (newline) [/code] Compile and run it with the **guile** command: [code] $ guile ./hello.scheme
-;;; compiling /home/seth/./hello.scheme
-;;; compiled [...]/hello.scheme.go
-hello world
-$ guile ./hello.scheme
-hello world
-```
-## Run Elisp without Emacs
-Emacs 可以作为 Elisp 的运行环境,但是你无需按照传统印象中的必须打开 Emacs 来运行 Elisp。`--script` 选项可以让你使用 Emacs 作为引擎来执行 Elisp 脚本而无需运行 Emacs 图形界面(甚至也无需使用终端界面)。下面这个例子中,`-Q` 选项让 Emacs 忽略 `.emacs` 文件从而避免由于执行 Elisp 脚本时产生延迟(若你的脚本依赖于 Emacs 配置中的内容那么请忽略该选项)。
-
-```
-emacs -Q --script ~/path/to/script.el
-```
-## 下载 Emacs 备忘录
-Emacs 许多重要功能都不是只能通过 Emacs 来实现的; Org mode 是 Emacs 扩展也是一种格式标准,流行的 Lisp 方言大多不依赖于具体的实现,我们甚至可以在没有可见或可交互式 Emacs 实例的情况下编写和运行 Elisp。然后若你对为什么模糊代码和数据之间的界限能够引发创新和效率感到好奇的话,那么 Emacs 是一个很棒的工具。
-
-幸运的是,现在是 21 世纪,Emacs 有了带有传统菜单的图形界面以及大量的文档,因此学习曲线不再像以前那样。然而,要最大化 Emacs 对你的好处,你需要学习它的快捷键。由于 Emacs 支持的每个任务都是一个 Elisp 函数,Emacs 中的任何功能都可以对应一个快捷键,因此要描述所有这些快捷键是不可能完成的任务。你只要学习使用频率 10 倍于不常用功能的那些快捷键即可。
-
-我们汇聚了最常用的 Emacs 快捷键成为一份 Emacs 备忘录以便你查询。将它挂在屏幕附近或办公室墙上,把它作为鼠标垫也行。让它触手可及经常翻阅一下。每次翻两下可以让你获得十倍的学习效率。而且一旦开始编写自己的函数,你一定不会后悔获取了这个免费的备忘录副本的!
-
-[这里下载 Emacs 备忘录 ](https://opensource.com/downloads/emacs-cheat-sheet)
diff --git a/translated/tech/20200129 Use Emacs to get social and track your todo list.md b/translated/tech/20200129 Use Emacs to get social and track your todo list.md
deleted file mode 100644
index fff71fcc19..0000000000
--- a/translated/tech/20200129 Use Emacs to get social and track your todo list.md
+++ /dev/null
@@ -1,165 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: (lujun9972)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Use Emacs to get social and track your todo list)
-[#]: via: (https://opensource.com/article/20/1/emacs-social-track-todo-list)
-[#]: author: (Kevin Sonney https://opensource.com/users/ksonney)
-
-使用 Emacs 进行社交并跟踪你的待办事项列表
-======
-访问 Twitter、Reddit、 交谈、电子邮件 、RSS 和你的待办事项列表,这是我们关于 2020 年使用开源提高效率的 20 个方法系列的第 19 个。
-![团队沟通、交谈 ][1]
-
-去年,我给你们带来了 2019 年的 19 天新生产力工具。今年,我将采取一种不同的方法:建立一个新的环境,让你使用已用或未用的工具在新的一年里更有效率,。
-
-### 使用 Emacs 做(几乎)所有的事情,第 2 部分
-
-[昨天 ][2],我谈到了如何在 Emacs 中读取电子邮件、访问电子邮件地址和显示日历。Emacs 功能繁多,你还可以将它用于 Twitter、 交谈、待办事项列表等等!
-
-[在 Emacs 中处理所有事情 ][3]
-
-要完成所有这些,您需要安装一些 Emacs 包。和昨天一样,用 `Meta+x package-manager` 打开 Emacs 包管理器 (Meta 在大多数键盘上是 **Alt**,在 MacOS 上是 **Option**)。然后通过 **i** 选择以下带有的软件包,然后输入 **x** 进行安装:
-
-
-```
-nnreddit
-todotxt
-twittering-mode
-```
-
-安装之后,按下 `Ctrl+x ctrl+f` 打开 `~/.emacs.d/init.el`,并在 `(custom-set-variables` 行前加上:
-
-
-```
-;; Todo.txt
-(require 'todotxt)
-(setq todotxt-file (expand-file-name "~/.todo/todo.txt"))
-
-;; Twitter
-(require 'twittering-mode)
-(setq twittering-use-master-password t)
-(setq twittering-icon-mode t)
-
-;; Python3 for nnreddit
-(setq elpy-rpc-python-command "python3")
-```
-
-按下 `Ctrl+x Ctrl+s` 保存文件,使用 `Ctrl+x Ctrl+c` 退出 Emacs,然后重启 Emacs。
-
-#### 使用 twittering-mode 在 Emacs 中发推
-
-![Emacs 中的 Twitter][4]
-
-[Twittering-mode][5] 是 Twitter 最好的 Emacs 接口之一。它几乎支持 Twitter 的所有功能,并且键盘快捷键也易于使用。
-
-首先,输入 `Meta+x twit` 来启动 twitter-mode。它会提供一个 URL 并提示你启动浏览器来访问它,你登录该 URL 后就能获得授权令牌。将令牌复制并粘贴到 Emacs 中,您的 Twitter 时间线就会加载了。您可以使用**箭头**键滚动,使用 **Tab** 从一个项目移动到另一个项目,并按 **Enter** 访问光标所在的 URL。如果光标在用户名上,按 **Enter** 将在 web 浏览器中打开时间轴。如果你在一条 tweet 的文本上,按 **Enter** 将回复该 tweet。你可以用 **u** 创建一个新的 tweet,用 `Ctrl+c+Enter` 转发一些内容,然后用 **d** 发送一条直接消息——它打开的对话框中有关于如何发送、取消和缩短 url 的说明。
-
-按 **V** 会打开一个提示让你跳转到其他时间线。输入 **:mentions** 打开你的提及。输入 **:home** 打开你的主时间线,输入用户名将进入该用户的时间线。最后,按 **q** 会退出 twittering-mode 并关闭窗口。
-
-twitter-mode 还有更多功能,我鼓励你阅读它 GitHub 页面上的[完整功能列表 ][6]。
-
-#### 在 Emacs 上使用 Todotxt.el 追踪你的待办事项
-
-![Emacs 中的 todo.txt][7]
-
-[Todotxt.el][8] 是一个很棒的 [todo.txt][9] 待办列表管理器接口。它的快捷键几乎无所不包。
-
-输入 `Meta+x todotxt` 启动它将加载 **todotxt-file** 变量中指定的 todo.txt 文件(本文的第一部分中设置了该文件)。
-在 todo.txt 的缓冲区(窗口*,您可以按 **a** 添加新任务并和按 **c** 标记它已被完成。你还可以使用 **r** 设置优先级,并使用 **t** 添加项目和上下文。
-完成事项后只需要按下 **A** 即可将任务移如 **done.txt**。你可以使用**/**过滤列表,也可以使用 **l** 刷新完整列表。同样,您可以按 **q** 退出。
-
-#### 在 Emacs 中使用 ERC 进行交谈
-
-![使用 ERC 与人交谈 ][10]
-
-Vim 的缺点之一是很难用它与人交谈。另一方面,Emacs 则将 [ERC][11] 客户端内置到默认发行版中。使用 `Meta+x ERC` 启动 ERC,系统将提示您输入服务器、用户名和密码。你可以使用几天前介绍设置 [BitlBee][12] 时使用的相同信息:服务器为 **localhost**,端口为 **6667**,相同用户名,无需密码。
-ERC 使用起来与其他 IRC 客户端一样。每个频道单独一个缓冲区(窗口),您可以使用 `Ctrl+x ctrl+b` 进行频道间切换,这也可以在 Emacs 中的其他缓冲区之间进行切换。`/quit` 命令将退出 ERC。
-
-#### 使用 Gnus 阅读电子邮件,Reddit 和 RSS
-
-![Mail,Reddit,and RSS feeds with Gnus][13]
-
-我相信昨天在我提及在 Emacs 中阅读邮件时,许多 Emacs 的老用户会问,“怎么没有 [Gnus][14] 呢?”
-这个疑问很合理。Gnus 是一个内置在 Emacs 中的邮件和新闻阅读器,尽管它这个邮件阅读器不支持以 [Notmuch][15] 作为搜索引擎。但是,如果你将其配置来阅读 Reddit 和 RSS feed( 稍后您将这样做),那么同时使用它来阅读邮件是个聪明的选择。
-
-Gnus 是为阅读 Usenet 新闻而创建的,并从此发展而来。因此,它的很多外观和感觉(以及术语)看起来很像 Usenet 的新闻阅读器。
-
-Gnus 以 `~/.gnus` 作为自己的配置文件。(该配置也可以包含在 `~/.emacs.d/init.el` 中)。使用 `Ctrl+x Ctrl+f` 打开 `~/.gnus`,并添加以下内容:
-
-
-```
-;; Required packages
-(require 'nnir)
-(require 'nnrss)
-
-;; Primary Mailbox
-(setq gnus-select-method
- '(nnmaildir "Local"
- (directory "~/Maildir")
- (nnir-search-engine notmuch)
- ))
-(add-to-list 'gnus-secondary-select-methods
- '(nnreddit ""))
-```
-
-用 `Ctrl+x Ctrl+s` 保存文件。这分配置告诉 Gnus 从 `~/Maildir` 这个本地邮箱中读取邮件作为主源(参见 **gnus-select-method** 变量),并使用 [nnreddit][16] 插件添加辅源 (**gnus-secondary-select-methods** 变量)。你还可以定义多个辅助源,包括 Usenet 新闻 (nntp)、IMAP (nnimap)、mbox (nnmbox) 和虚拟集合 (nnvirtual)。您可以在 [Gnus 手册 ][17] 中了解更多有关所有选项的信息。
-
-保存文件后,使用 `Meta+x Gnus` 启动 Gnus。第一次运行将在 Python 虚拟环境中安装 [Reddit 终端查看器 ][18],Gnus 通过它获取 Reddit 上的文章。然后它会启动浏览器来登录 Reddit。之后,它会扫描并加载你订阅的 Reddit 群组。你会看到一个有新邮件的邮件夹列表和一个有新内容的看板列表。在任一列表上按 **Enter** 将加载该组中的消息列表。您可以使用**箭头**键导航并按 **Enter** 加载和读取消息。在查看消息列表时,按 **q** 将返回到前一个视图,从主窗口按 **q** 将退出 Gnus。在阅读 Reddit 群组时,**a** 会创建一条新消息;在邮件组中,**m** 创建一个新的电子邮件;并且在任何一个视图中按 **r** 回复邮件。
-
-您还可以向 Gnus 接口中添加 RSS feed,并像阅读邮件和新闻组一样阅读它们。要添加 RSS feed,输入 `G+R` 并填写 RSS feed 的 URL。会有提示让你输入 feed 的标题和描述,这些信息可以从 feed 中提取出来并填充进去。现在输入 **g** 来检查新消息(这将检查所有组中的新消息)。阅读 feed 就像阅读 Reddit 群组和邮件一样,它们使用相同的快捷键。
-
-Gnus 中有_很多_功能,还有大量的键组合。[Gnus 参考卡 ][19] 为每个视图列出了所有这些键组合(以非常小的字体显示在 5 页纸上)。
-
-#### 使用 nyan-mode 查看位置
-
-As a final note,you might notice [Nyan cat][20] at the bottom of some of my screenshots。This is [nyan-mode][21],which indicates where you are in a buffer,so it gets longer as you get closer to the bottom of a document or buffer。You can install it with the package manager and set it up with the following code in **~/.emacs.d/init.el**:
-最后,你可能会一些截屏底部注意到 [Nyan cat][20]。这是 [nyan-mode][21],它指示了你在缓冲区中的位置,因此当您接近文档或缓冲区的底部时,它会变长。您可以使用包管理器安装它,并在 `~/.emacs.d/init.el` 中使用以下代码进行设置:
-
-
-```
-;; Nyan Cat
-(setq nyan-wavy-trail t)
-(setq nyan-bar-length 20)
-(nyan-mode)
-```
-
-### Emacs 的皮毛
-
-这只是 Emacs 所有功能的皮毛。Emacs_ 非常_强大,是我用来提高工作效率的必要工具之一,无论我是在追踪待办事项、阅读和回复邮件、编辑文本,还是与朋友和同事交流我都用它。这需要一点时间来适应,但是一旦你习惯了,它就会成为你桌面上最有用的工具之一。
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/20/1/emacs-social-track-todo-list
-
-作者:[Kevin Sonney][a]
-选题:[lujun9972][b]
-译者:[lujun9972](https://github.com/lujun9972)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://opensource.com/users/ksonney
-[b]: https://github.com/lujun9972
-[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/talk_chat_team_mobile_desktop.png?itok=d7sRtKfQ (Team communication, chat)
-[2]: https://opensource.com/article/20/1/emacs-mail-calendar
-[3]: https://opensource.com/sites/default/files/uploads/productivity_19-1.png (All the things with Emacs)
-[4]: https://opensource.com/sites/default/files/uploads/productivity_19-2.png (Twitter in Emacs)
-[5]: https://github.com/hayamiz/twittering-mode
-[6]: https://github.com/hayamiz/twittering-mode#features
-[7]: https://opensource.com/sites/default/files/uploads/productivity_19-3.png (todo.txt in emacs)
-[8]: https://github.com/rpdillon/todotxt.el
-[9]: http://todotxt.org/
-[10]: https://opensource.com/sites/default/files/uploads/productivity_19-4.png (Chatting with erc)
-[11]: https://www.gnu.org/software/emacs/manual/html_mono/erc.html
-[12]: https://opensource.com/article/20/1/open-source-chat-tool
-[13]: https://opensource.com/sites/default/files/uploads/productivity_19-5.png (Mail, Reddit, and RSS feeds with Gnus)
-[14]: https://www.gnus.org/
-[15]: https://opensource.com/article/20/1/organize-email-notmuch
-[16]: https://github.com/dickmao/nnreddit
-[17]: https://www.gnus.org/manual/gnus.html
-[18]: https://pypi.org/project/rtv/
-[19]: https://www.gnu.org/software/emacs/refcards/pdf/gnus-refcard.pdf
-[20]: http://www.nyan.cat/
-[21]: https://github.com/TeMPOraL/nyan-mode
diff --git a/translated/tech/20200312 How to write effective documentation for your open source project.md b/translated/tech/20200312 How to write effective documentation for your open source project.md
new file mode 100644
index 0000000000..51cd81bacd
--- /dev/null
+++ b/translated/tech/20200312 How to write effective documentation for your open source project.md
@@ -0,0 +1,106 @@
+[#]: collector: (lujun9972)
+[#]: translator: (HankChow)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How to write effective documentation for your open source project)
+[#]: via: (https://opensource.com/article/20/3/documentation)
+[#]: author: (Kevin Xu https://opensource.com/users/kevin-xu)
+
+如何为你的开源项目编写实用的文档
+======
+一份优质的文档可以让很多用户对你的项目路人转粉。
+
+![A pink typewriter][1]
+
+好的代码很多时候并不代表一切。或许你能用最精巧的代码解决了世界上最迫切需要解决的问题,但如果你作为一个开源开发者,没能用准确的语言将你的作品公之于世,你的代码也只能成为沧海遗珠。因此,技术写作和文档编写是很重要的技能。
+
+一般来说,项目中的文档是最受人关注的部分,很多用户会通过文档来决定自己是否应该对某个项目开始学习或研究。所以,我们不能忽视技术写作和文档编写的工作,尤其要重点关注其中的“入门”部分,这会对你项目的发展起到关键性的作用。
+
+对于很多人来说,写作是一件令人厌烦甚至恐惧的事情。我们这些工程师出身的人,学习“写代码”比学习“为代码写文档”明显更多。不少人会把英语作为自己的第二语言或者第三语言,他们可能会对英语写作感到不安全甚至害怕(我的母语是汉语,英语是作为我的第二语言学习的,所以我也能感受到这种痛苦)。
+
+但如果你希望自己的项目能在全球范围内产生一定的影响力,英语就是你必须使用的语言,这是一个无法避免的现实。但不必害怕,我在写这篇文章的时候就考虑到了这些可能带来的挑战,并给出了我的一些建议。
+
+### 五条有用的写作建议
+
+这五条建议你马上就可以用起来,尽管看起来似乎有些浅显,但在技术写作时却经常被忽视。
+
+ 1. 使用[主动语态][2]:感受一下主动语态下的“你可以这样更改配置(You can change these configurations by…)”和被动语态下的“配置可以这样更改(These configurations can be changed by…)”有什么不同之处。
+ 2. 使用简洁明了的句子:可以借助 [Hemingway App][3] 或者 [Grammarly][4] 这样的工具,尽管它们并不开源。
+ 3. 保持条理性:你可以在文档中通过写标题、划重点、引链接等方式,把各类信息划分为不同的部分,避免将所有内容都杂糅在一大段冗长的文字当中。
+ 4. 提高可读性:除了单纯的文字之外,运用图表也是从多种角度表达的手段之一。
+ 5. 注意拼写和语法:必须记得检查文档中是否有拼写错误或者语法错误。
+
+只要在文档的写作和编辑过程中应用到这些技巧,你就能够和读者建立起沟通和信任。
+
+ * 高效沟通:对于工程师们来说,阅读长篇大论的冗长文字,还不如去看小说。在阅读技术文档时,他们总是希望能够从中快速准确地获取到有用的信息。因此,技术文档的最佳风格应该是精简而有效的,不过这并不代表文档中不能出现类似幽默、emoji 甚至段子这些东西,这些元素可以当你的文档更有个性、更使人印象深刻。当然,具体的实现方式就因人而异了
+ * 建立信任:你需要取得文档读者们的信任,这在一个项目的前期尤为重要。读者对你的信任除了来源于你代码的质量,还跟你文档编写的质量有关。所以你不仅要打磨代码,还要润色好相关的文档,这也是上面第 5 点建议拼写和语法检查的原因。
+
+### 如何开始编写文档
+
+现在,最需要花费功夫的应该就是“入门”部分了,这是一篇技术文档最重要的部分,[二八定律][5]在这里得到了充分体现:访问一个项目的大部分流量都会落在项目文档上,而访问项目文档的大部分流量则会落在文档的“入门”部分中。因此,如果文档的“入门”部分写得足够好,项目就会吸引到很多用户,反之,用户会对你的项目敬而远之。
+
+那么如何写好“入门”部分呢?我建议按照以下三步走:
+
+ 1. 任务化:入门指南应该以任务为导向。这里的任务指的是对于开发者来说可以完成的离散的小项目,而不应该包含太多涉及到体系结构、核心概念等的抽象信息,因此在“入门”部分只需要提供一个简单明了的概述就可以了。也不要在“入门”部分大谈这个项目如何优秀地解决了问题,这个话题可以放在文档中别的部分进行说明。总而言之,“入门”部分最好是给出一些主要的操作步骤,这样显得开门见山。
+ 2. 30 分钟内能够完成:这一点的核心是耗时尽可能短,不宜超过 30 分钟,这个时间上限是考虑到用户可能对你的项目并不了解。这一点很重要,大部分愿意浏览文档的人都是有技术基础的,但对你的项目也仅仅是一知半解。首先让这些读者尝试进行一些相关操作,在收到一定效果后,他们才会愿意花更多时间深入研究整个项目。因此,你可以从耗时这个角度来评估你的文档“入门”部分有没有需要改进之处。
+ 3. 有意义的任务:这里“有意义”的含义取决于你的开源项目。最重要的是认真思考并将“入门”部分严格定义为一项任务,然后交给你的读者去完成。这个项目的价值应该在这项有意义的任务中有所体现,不然读者可能会感觉这是一个浪费时间的行为。
+
+提示:假如你的项目是一个分布式数据库,那么达到“整个集群在某些节点故障的情况下可以不中断地保持可用”的目标就可以认为是“有意义”的;加入你的项目是一个数据分析工具或者是商业智能工具,“有意义”的目标也可以是“加载数据后能快速生成多种可视化效果的仪表板”。总之,无论你的项目需要达到什么“有意义”的目标,都应该能在笔记本电脑上本地快速实现。
+
+[Linkerd 入门][6]就是一个很好的例子。Linkerd 是 Kubernetes 的开源服务网格,当时我对 Kubernetes 了解并不多,也不熟悉服务网格。但我在自己的笔记本电脑上很轻松地就完成了其中的任务,同时也加深了对服务网格的理解。
+
+上面提到的三步过程是一个很有用的框架,对一篇文档“入门”部分的设计和量化评估很有帮助。今后你如果想将你的[开源项目产品化][7],这个框架还可能对实现价值的时间产生影响。
+
+### 其它核心部分
+
+认真写好“入门”部分之后,你的文档中还需要有这五个部分:架构设计、生产环境使用指导、使用案例、参考资料以及未来展望,这五个部分在一份完整的文档中是必不可少的。
+
+ * 架构设计:这一部分需要深入探讨整个项目架构设计的依据,“入门”部分中一笔带过的那些关键细节就应该在这里体现。在产品化过程中,这个部分将会是[产品推广计划][8]的核心,因此通常会包含一些可视化呈现的内容,期望的效果是让更多用户长期参与到项目中来。
+ * 生产环境使用指导:对于同一个项目,在生产环境中部署比在笔记本电脑上部署要复杂得多。因此,指导用户认真使用就尤为重要。同时,有些用户可能对项目很感兴趣,但对生产环境下的使用有所顾虑,而指导和展示的过程则正好能够吸引到这类潜在的用户。
+ * 使用案例:社会认同的力量是有目共睹的,所以很有必要列出正在生产环境使用这个项目的其他用户,并把这些信息摆放在显眼的位置。这个部分的浏览量甚至仅次于“入门”部分。
+ * 参考资料:这个部分是对项目的一些详细说明,让用户得以进行详细的研究以及查阅相关信息。一些开源作者会在这个部分事无巨细地列出项目中的每一个细节和边缘情况,这种做法可以理解,但不推荐在项目初期就在这个部分花费过多的时间。你可以采取更折中的方式,在质量和效率之间取得平衡,例如提供一些相关社区的链接、Stack Overflow 上的标签或单独的 FAQ 页面。
+ * 未来展望:你需要制定一个简略的时间表,规划这个项目的未来发展方向,这会让用户长期保持兴趣。尽管项目在当下可能并不完美,但要让用户知道你仍然有完善这个项目的计划。这个部分也能让整个社区构建一个强大的生态,因此还要向用户提供表达他们对未来展望的看法的交流区。
+
+以上这几个部分或许还没有在你的文档中出现,甚至可能会在后期才能出现,尤其是“使用案例”部分。尽管如此,还是应该在文档中逐渐加入这些部分。如果用户对“入门”部分已经感觉良好,那以上这几个部分将会提起用户更大的兴趣。
+
+最后,请在“入门”部分、README 文件或其它显眼的位置注明整个项目所使用的许可证。这个细节会让你的项目更容易通过终端用户的审核。
+
+### 花 20% 的时间写作
+
+一般情况下,我建议把整个项目 10% 到 20% 的时间用在文档写作上。也就是说,如果你是全职进行某一个项目的,文档写作需要在其中占半天到一天。
+
+再细致一点,应该将写作纳入到常规的工作流程中,这样它就不再是一件孤立的琐事,而是日常的事务。文档写作应该随着工作进度同步进行,切忌将所有写作任务都堆积起来最后完成,这样才可以帮助你的项目达到最终目标:吸引用户、获得信任。
+
+* * *
+
+_特别鸣谢云原生计算基金会的布道师 [Luc Perkins][9] 给出的宝贵意见。_
+
+_本文首发于_ _[COSS Media][10]_ _并经许可发布。_
+
+Nigel Babu 提供了 10 条帮助编写项目文档的有用技巧。
+
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/documentation
+
+作者:[Kevin Xu][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://opensource.com/users/kevin-xu
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/osdc-docdish-typewriter-pink.png?itok=OXJBtyYf (A pink typewriter)
+[2]: https://www.grammar-monster.com/glossary/active_voice.htm
+[3]: http://www.hemingwayapp.com/
+[4]: https://www.grammarly.com/
+[5]: https://en.wikipedia.org/wiki/Pareto_principle
+[6]: https://linkerd.io/2/getting-started/
+[7]: https://opensource.com/article/19/11/products-open-source-projects
+[8]: https://opensource.com/article/20/2/product-marketing-open-source-project
+[9]: https://twitter.com/lucperkins
+[10]: https://coss.media/open-source-documentation-technical-writing-101/
diff --git a/translated/tech/20200312 Make SSL certs easy with k3s.md b/translated/tech/20200312 Make SSL certs easy with k3s.md
new file mode 100644
index 0000000000..241f8891f5
--- /dev/null
+++ b/translated/tech/20200312 Make SSL certs easy with k3s.md
@@ -0,0 +1,333 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Make SSL certs easy with k3s)
+[#]: via: (https://opensource.com/article/20/3/ssl-letsencrypt-k3s)
+[#]: author: (Lee Carpenter https://opensource.com/users/carpie)
+
+用 k3s 轻松管理 SSL 证书
+======
+
+> 如何在树莓派上使用 k3s 和 Let's Encrypt 来加密你的网站。
+
+![Files in a folder][1]
+
+在[上一篇文章][2]中,我们在 k3s 集群上部署了几个简单的网站。那些是未加密的网站。很好,它们可以工作,但是未加密的网站有点太过时了!如今,大多数网站都是加密的。在本文中,我们将安装 [cert-manager][3] 并将其用于在集群上以部署采用 TLS 加密的网站。这些网站不仅会被加密,而且还会使用有效的公共证书,这些证书会从 [Let's Encrypt][4] 自动获取和更新!让我们开始吧!
+
+### 所需材料
+
+要继续阅读本文,你将需要我们在上一篇文章中构建的 [k3s 树莓派集群][5]。另外,你需要拥有一个公用静态 IP 地址,并有一个可以为其创建 DNS 记录的域名。如果你有一个动态 DNS 提供程序为你提供域名,可能也行。但是,在本文中,我们将使用静态 IP 和 [CloudFlare][6] 来手动创建 DNS 的 A 记录。
+
+我们在本文中创建配置文件时,如果你不想键入它们,则可以在[此处][7]进行下载。
+
+### 我们为什么使用 cert-manager?
+
+Traefik(预先捆绑了 k3s)实际上具有内置的 Let's Encrypt 支持,因此你可能想知道为什么我们要安装第三方软件包来做同样的事情。在撰写本文时,Traefik 中的 Let's Encrypt 支持检索证书并将其存储在文件中。cert-manager 会检索证书并将其存储在 Kubernetes 的 “机密信息” 中。我认为,“机密信息”可以简单地按名称引用,因此更易于使用。这就是我们在本文中使用 cert-manager 的主要原因。
+
+### 安装 cert-manager
+
+通常,我们只是遵循 cert-manager 的[文档][8]在 Kubernetes 上进行安装。但是,由于我们使用的是 ARM 体系结构,因此我们需要进行一些更改,以便我们可以完成这个操作。
+
+第一步是创建 cert-manager 命名空间。命名空间有助于将 cert-manager 的吊舱排除在我们的默认命名空间之外,因此当我们使用自己的“吊舱”执行 `kubectl get pods` 之类的操作时,我们不必看到它们。创建名称空间很简单:
+
+```
+kubectl create namespace cert-manager
+```
+
+这份安装说明会告诉你下载 cert-manager 的 YAML 配置文件并将其一步全部应用到你的集群。我们需要将其分为两个步骤,以便为基于 ARM 的树莓派修改文件。我们将下载文件并一步一步进行转换:
+
+```
+curl -sL \
+https://github.com/jetstack/cert-manager/releases/download/v0.11.0/cert-manager.yaml |\
+sed -r 's/(image:.*):(v.*)$/\1-arm:\2/g' > cert-manager-arm.yaml
+```
+
+这会下载配置文件,并将所有包含的 docker 镜像更新为 ARM 版本。来检查一下它做了什么:
+
+
+```
+$ grep image: cert-manager-arm.yaml
+ image: "quay.io/jetstack/cert-manager-cainjector-arm:v0.11.0"
+ image: "quay.io/jetstack/cert-manager-controller-arm:v0.11.0"
+ image: "quay.io/jetstack/cert-manager-webhook-arm:v0.11.0"
+```
+
+如我们所见,三个镜像现在在镜像名称上添加了 `-arm`。现在我们有了正确的文件,我们只需将其应用于集群:
+
+```
+kubectl apply -f cert-manager-arm.yaml
+```
+
+这将安装所有的 cert-manager。我们可以通过 `kubectl --namespace cert-manager get pods` 来检查安装何时完成,直到所有“吊舱”都处于 `Running` 状态。
+
+这实际上就完成了 cert-manager 的安装!
+
+### Let's Encrypt 概述
+
+Let's Encrypt 的好处是,它们免费为我们提供了经过公共验证的 TLS 证书!这意味着我们可以拥有一个完全有效的、可供任何人访问的 TLS 加密网站,这些家庭或业余的爱好活动挣不到钱,也无需自己掏腰包购买 TLS 证书!以及,当通过 cert-manager 使用 Let's Encrypt 的证书时,获得证书的整个过程是自动化的,证书的续订也是自动的!
+
+但它是如何工作的?下面是该过程的简化说明。我们(或代表我们的 cert-manager)向 Let's Encrypt 发出我们拥有的域名的证书请求。Let's Encrypt 通过使用 ACME DNS 或 HTTP 验证机制来验证我们是否拥有该域。如果验证成功,则 Let's Encrypt 将向我们提供证书,这些证书将由 cert-manager 安装在我们的网站(或其他 TLS 加密的终结点)中。在需要重复此过程之前,这些证书可以使用 90 天。但是,cert-manager 会自动为我们更新证书。
+
+在本文中,我们将使用 HTTP 验证方法,因为它更易于设置并且适用于大多数情况。以下是幕后将发生的基本过程。cert-manager 将向 Let's Encrypt 发出证书请求。作为回应,Let's Encrypt 将发出所有权验证的质询。这个质询是将一个 HTTP 资源放在请求证书的域名下的一个特定 URL 上。从理论上讲,如果我们可以将该资源放在该 URL 上,并且让 Let's Encrypt 可以远程获取它,那么我们实际上必须是该域的所有者。否则,要么我们无法将资源放置在正确的位置,要么我们无法操纵 DNS 以使 Let's Encrypt 访问它。在这种情况下,cert-manager 会将资源放在正确的位置,并自动创建一个临时的 `Ingress` 记录,以将流量路由到正确的位置。如果 Let's Encrypt 可以读到该质询要求的资源并正确无误,它将把证书发回给 cert-manager。然后,cert-manager 将证书存储为“机密信息”,然后我们的网站(或其他任何网站)将使用这些证书通过 TLS 保护我们的流量。
+
+### 为该质询设置网络
+
+我假设你要在家庭网络上进行设置,并拥有一个以某种方式连接到更广泛的互联网的路由器/接入点。如果不是这种情况,则可能不需要以下过程。
+
+为了使质询过程正常运行,我们需要一个我们要申请证书的域名,以将其路由到端口 80 上的 k3s 集群。为此,我们需要告诉世界上的 DNS 系统它的位置。因此,我们需要将域名映射到我们的公共 IP 地址。如果你不知道你的公共 IP 地址是什么,可以访问 [WhatsMyIP][9] 之类的地方,它会告诉你。接下来,我们需要输入 DNS 的 A 记录,该记录将我们的域名映射到我们的公共 IP 地址。为了使此功能可靠地工作,你需要一个静态的公共 IP 地址,或者你可以使用动态 DNS 提供商。一些动态 DNS 提供商会向你颁发一个域名,你可以按照以下说明使用它。我没有尝试过,所以不能肯定地说它适用于所有提供商。
+
+对于本文,我们将假设有一个静态公共 IP 并使用 CloudFlare 来设置 DNS 的 A 记录。如果愿意,可以使用自己的 DNS 提供程序。重要的是你可以设置 A 记录。
+
+在本文的其余部分中,我将使用 [k3s.carpie.net][10] 作为示例域,因为这是我拥有的域。你显然会用自己拥有的任何域替换它。
+
+为示例起见,假设我们的公共 IP 地址是 198.51.100.42。我们将转到我们的 DNS 提供商的 DNS 记录部分,并添加一个名为 [k3s.carpie.net][10] 的类型为 `A` 的记录(CloudFlare 已经假定了域的部分,因此我们只需输入 `k3s`),然后输入 `198.51.100.42` 作为 IPv4 地址。
+
+![][11]
+
+请注意,有时 DNS 更新要传播一段时间。你可能需要几个小时才能解析该名称。在继续之前该名称必须可以解析。否则,我们所有的证书请求都将失败。
+
+我们可以使用 `dig` 命令检查名称是否解析:
+
+```
+$ dig +short k3s.carpie.net
+198.51.100.42
+```
+
+继续运行以上命令,直到可以返回 IP 才行。关于 CloudFlare 有个小注释:ClouldFlare 提供了通过代理流量来隐藏你的实际 IP 的服务。在这种情况下,我们取回的是 CloudFlare 的 IP,而不是我们的 IP。 但对于我们的目的,这应该可以正常工作。
+
+网络配置的最后一步是配置路由器,以将端口 80 和 443 上的传入流量路由到我们的 k3s 集群。可悲的是,路由器配置页面的差异很大,因此我无法确切地说明你的外观是什么样子。大多数时候,我们需要的管理页面位于“端口转发”或类似内容下。我甚至看到过它列在“游戏”之下(显然是端口转发主要用于的游戏)!让我们看看我的路由器的配置如何。
+
+![][12]
+
+如果你和我的设置一样,则转到 192.168.0.1 登录到路由器管理应用程序。对于此路由器,它位于 “ NAT / QoS” -> “端口转发”。在这里,我们将端口 80/TCP 协议设置为转发到 192.168.0.50(主节点 `kmaster` 的 IP)的端口 80。我们还将端口 443 设置为也映射到 `kmaster`。从技术上讲,这对于质询来说并不是必需的,但是在本文的结尾,我们将部署一个启用 TLS 的网站,并且需要映射 443 来进行访问。因此,现在进行映射很方便。我们保存并应用更改,应该一切顺利!
+
+### 配置 cert-manager 来使用 Let's Encrypt(暂存环境)
+
+现在,我们需要配置 cert-manager 来通过 Let's Encrypt 颁发证书。Let's Encrypt 为我们提供了一个暂存(例如用于测试)环境,以便审视我们的配置。这样它更能容忍错误和请求的频率。如果我们对生产环境做了错误的操作,我们很快就好发现自己被暂时禁止访问了!因此,我们将使用暂存环境手动测试请求。
+
+创建一个文件 `letsencrypt-issuer-staging.yaml`,内容如下:
+
+```
+apiVersion: cert-manager.io/v1alpha2
+kind: ClusterIssuer
+metadata:
+ name: letsencrypt-staging
+spec:
+ acme:
+ # The ACME server URL
+ server: https://acme-staging-v02.api.letsencrypt.org/directory
+ # Email address used for ACME registration
+ email: @example.com
+ # Name of a secret used to store the ACME account private key
+ privateKeySecretRef:
+ name: letsencrypt-staging
+ # Enable the HTTP-01 challenge provider
+ solvers:
+ - http01:
+ ingress:
+ class: traefik
+```
+
+请确保将电子邮件地址更新为你的地址。如果出现问题或我们弄坏了一些东西,这就是 Let's Encrypt 与我们联系的方式!
+
+现在,我们使用以下方法创建发行者:
+
+```
+kubectl apply -f letsencrypt-issuer-staging.yaml
+```
+
+我们可以使用以下方法检查发行者是否已成功创建:
+
+```
+kubectl get clusterissuers
+```
+
+`clusterissuers` 是由 cert-manager 创建的一种新的 Kubernetes 资源类型。
+
+现在让我们手动请求一个测试证书。对于我们的网站,我们不需要这样做;我们只是在测试这个过程,以确保我们的配置正确。
+
+创建一个包含以下内容的证书请求文件 `le-test-certificate.yaml`:
+
+
+```
+apiVersion: cert-manager.io/v1alpha2
+kind: Certificate
+metadata:
+ name: k3s-carpie-net
+ namespace: default
+spec:
+ secretName: k3s-carpie-net-tls
+ issuerRef:
+ name: letsencrypt-staging
+ kind: ClusterIssuer
+ commonName: k3s.carpie.net
+ dnsNames:
+ - k3s.carpie.net
+```
+
+该记录仅表示我们要使用名为 `letsencrypt-staging`(我们在上一步中创建的)的 `ClusterIssuer` 来请求域 [k3s.carpie.net][10] 的证书,并在 Kubernetes 的机密信息中名为 `k3s-carpie-net-tls` 文件中存储该证书。
+
+像平常一样应用它:
+
+```
+kubectl apply -f le-test-certificate.yaml
+```
+
+我们可以通过以下方式查看状态:
+
+```
+kubectl get certificates
+```
+
+如果我们看到类似以下内容:
+
+```
+NAME READY SECRET AGE
+k3s-carpie-net True k3s-carpie-net-tls 30s
+```
+
+我们走在幸福之路!(这里的关键是`READY` 是 `True`)。
+
+### 解决证书颁发问题
+
+上面是幸福的道路。如果 `READY` 为 `False`,我们可以等等它,然后再次花点时间检查状态。如果它一直是 `False`,那么我们就有一个需要解决的问题。此时,我们可以遍历 Kubernetes 资源链,直到找到一条告诉我们问题的状态消息。
+
+假设我们执行了上面的请求,而 `READY` 为 `False`。我们可以从以下方面开始故障排除:
+
+```
+kubectl describe certificates k3s-carpie-net
+```
+
+这将返回很多信息。通常,有用的内容位于 `Events:` 部分,该部分通常位于底部。假设最后一个事件是 `Created new CertificateRequest resource "k3s-carpie-net-1256631848`。然后我们描述一些该请求:
+
+```
+kubectl describe certificaterequest k3s-carpie-net-1256631848
+```
+
+现在比如说最后一个事件是 `Waiting on certificate issuance from order default/k3s-carpie-net-1256631848-2342473830`。
+
+那么,我们可以描述该顺序:
+
+```
+`kubectl describe orders default/k3s-carpie-net-1256631848-2342473830`
+```
+
+假设有一个事件,事件为 `Created Challenge resource "k3s-carpie-net-1256631848-2342473830-1892150396" for domain "k3s.carpie.net"`。让我们描述一下该质询:
+
+```
+kubectl describe challenges k3s-carpie-net-1256631848-2342473830-1892150396
+```
+
+从这里返回的最后一个事件是 `Presented challenge using http-01 challenge mechanism`。看起来没问题,因此我们浏览一下描述的输出,并看到一条消息 `Waiting for http-01 challenge propagation: failed to perform self check GET request … no such host`。终于!我们发现了问题!在这种情况下,`no such host` 意味着 DNS 查找失败,因此我们需要返回并手动检查我们的 DNS 设置,正确解析域的 DNS,并进行所需的任何更改。
+
+### 清理我们的测试证书
+
+我们实际上想要使用的是域名的真实证书,所以让我们继续清理证书和我们刚刚创建的机密信息:
+
+```
+kubectl delete certificates k3s-carpie-net
+kubectl delete secrets k3s-carpie-net-tls
+```
+
+### 配置 cert-manager 以使用 Let's Encrypt(生产环境)
+
+现在我们已经有了测试证书,是时候移动到生产环境了。就像我们在 Let's Encrypt 暂存环境中配置 cert-manager 一样,我们现在也需要对生产环境进行同样的操作。创建一个名为 `letsencrypt-issuer-production.yaml` 的文件(如果需要,可以复制和修改暂存环境的文件),其内容如下:
+
+```
+apiVersion: cert-manager.io/v1alpha2
+kind: ClusterIssuer
+metadata:
+name: letsencrypt-prod
+spec:
+acme:
+ # The ACME server URL
+ server: https://acme-v02.api.letsencrypt.org/directory
+ # Email address used for ACME registration
+ email: @example.com
+ # Name of a secret used to store the ACME account private key
+ privateKeySecretRef:
+ name: letsencrypt-prod
+ # Enable the HTTP-01 challenge provider
+ solvers:
+ - http01:
+ ingress:
+ class: traefik
+```
+
+(如果要从暂存环境进行复制,则唯一的更改是 `server:` URL。也请不要忘记修改电子邮件!)
+
+应用它:
+
+```
+kubectl apply -f letsencrypt-issuer-production.yaml
+```
+
+### 申请我们网站的证书
+
+重要的是要注意,我们到目前为止完成的所有步骤都是一次性设置的!对于将来的任何其他申请,我们可以从这个说明开始!
+
+让我们部署在[上一篇文章][13]中部署的同样站点。(如果仍然可用,则可以修改 YAML 文件。如果没有,则可能需要重新创建并重新部署它)。
+
+我们只需要将 `mysite.yaml` 的 `Ingress` 部分修改为:
+
+```
+---
+apiVersion: networking.k8s.io/v1beta1
+kind: Ingress
+metadata:
+ name: mysite-nginx-ingress
+ annotations:
+ kubernetes.io/ingress.class: "traefik"
+ cert-manager.io/cluster-issuer: letsencrypt-prod
+spec:
+ rules:
+ - host: k3s.carpie.net
+ http:
+ paths:
+ - path: /
+ backend:
+ serviceName: mysite-nginx-service
+ servicePort: 80
+ tls:
+ - hosts:
+ - k3s.carpie.net
+ secretName: k3s-carpie-net-tls
+```
+
+请注意,上面仅显示了 `mysite.yaml` 的 `Ingress` 部分。所做的更改是添加了注释 `cert-manager.io/cluster-issuer: letsencrypt-prod`。这告诉 traefik 创建证书时使用哪个发行者。 唯一的其他增加是 `tls:` 块。这告诉 traefik 我们希望在主机 [k3s.carpie.net][10] 上具有 TLS 功能,并且我们希望 TLS 证书文件存储在机密信息 `k3s-carpie-net-tls` 中。
+
+请记住,我们没有创建这些证书!(好吧,我们创建了名称相似的测试证书,但我们删除了这些证书。)Traefik 将读取这些配置并继续寻找机密信息。当找不到时,它会看到注释说我们想使用 `letsencrypt-prod` 发行者来获取它。由此,它将提出请求并为我们安装证书到机密信息之中!
+
+大功告成! 让我们尝试一下。
+
+它现在具有了加密 TLS 所有优点!恭喜你!
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/ssl-letsencrypt-k3s
+
+作者:[Lee Carpenter][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/carpie
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/files_documents_paper_folder.png?itok=eIJWac15 (Files in a folder)
+[2]: https://carpie.net/articles/ingressing-with-k3s
+[3]: https://cert-manager.io/
+[4]: https://letsencrypt.org/
+[5]: https://opensource.com/article/20/3/kubernetes-raspberry-pi-k3s
+[6]: https://cloudflare.com/
+[7]: https://gitlab.com/carpie/k3s_using_certmanager/-/archive/master/k3s_using_certmanager-master.zip
+[8]: https://cert-manager.io/docs/installation/kubernetes/
+[9]: https://whatsmyip.org/
+[10]: http://k3s.carpie.net
+[11]: https://opensource.com/sites/default/files/uploads/ep011_dns_example.png
+[12]: https://opensource.com/sites/default/files/uploads/ep011_router.png
+[13]: https://carpie.net/articles/ingressing-with-k3s#deploying-a-simple-website
+[14]: http://cert-manager.io/cluster-issuer
diff --git a/translated/tech/20200317 Viewing and configuring password aging on Linux.md b/translated/tech/20200317 Viewing and configuring password aging on Linux.md
new file mode 100644
index 0000000000..f02e2399d9
--- /dev/null
+++ b/translated/tech/20200317 Viewing and configuring password aging on Linux.md
@@ -0,0 +1,148 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Viewing and configuring password aging on Linux)
+[#]: via: (https://www.networkworld.com/article/3532815/viewing-and-configuring-password-aging-on-linux.html)
+[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
+
+在 Linux 上查看和配置密码时效
+======
+使用正确的设置,可以强制 Linux 用户定期更改密码。以下是查看密码时效以及如何更改其中设置的方法。。
+
+可以将 Linux 系统上的用户密码配置为永久或设置过期,以让人们必须定期重置它们。出于安全原因,通常认为定期更改密码是一种好习惯,但默认未配置。
+
+要查看和修改密码时效,你需要熟悉几个重要的命令:**chage** 命令及其 **-l ** 选项,以及 **passwd**命令及其 **-S** 选项。本文会介绍这些命令,还有其他一些 **chage** 命令来配置密码时效。
+
+[[Get regularly scheduled insights by signing up for Network World newsletters.]][1]
+
+### 查看密码时效设置
+
+确定某个特定帐户是否已设置密码时效的方法是使用如下 **chage** 命令。请注意,除了你自己的帐户以外,其他任何帐户都需要 root 权限。请注意下面的密码到期日期。
+
+```
+$ sudo chage -l dory
+Last password change : Mar 15, 2020
+Password expires : Jun 13, 2020 <==
+Password inactive : never
+Account expires : never
+Minimum number of days between password change : 10
+Maximum number of days between password change : 90
+Number of days of warning before password expires : 14
+```
+
+如果未应用密码时效,那么帐户信息将如下所示:
+
+```
+$ sudo chage -l nemo
+Last password change : Jan 14, 2019
+Password expires : never <==
+Password inactive : never
+Account expires : Mar 26, 2706989
+Minimum number of days between password change : 0
+Maximum number of days between password change : 99999
+Number of days of warning before password expires : 7
+```
+
+你也可以使用 **passwd -S** 命令查看某些信息,但是你需要知道输出中的每个字段代表什么:
+
+```
+dory$ passwd -S
+dory P 03/15/2020 10 90 14 -1
+```
+
+这里的七个字段代表:
+
+ * 1 – 用户名
+ * 2 - 帐户状态(L=锁定,NP=无密码,P=可用密码)
+ * 3 –上次密码更改的日期
+ * 4 – 可更改最低时效(如果没有这么多天,则不能更改密码)
+ * 5 – 最长时效(这些天后,密码必须更改)
+ * 6 – 密码过期前提前警告的天数
+ * 7 – 密码过期后锁定之前的天数(设为无效)
+
+
+
+需要注意的一件事是,**chage** 命令不会显示帐户是否被锁定;它仅显示密码时效设置。另一方面,**passwd -S** 命令将告诉你密码被锁定的时间。在此例中,请注意帐户状态为 “L”:
+
+[][2]
+
+```
+$ sudo passwd -S dorothy
+dorothy L 07/09/2019 0 99999 7 10
+```
+
+该锁定在 **/etc/shadow** 文件中生效,通常会将包含密码的“哈希”字段变为 “!”。
+
+```
+$ sudo grep dorothy /etc/shadow
+dorothy:!:18086:0:99999:7:10:: <==
+```
+
+帐户被锁定的事实在 **chage** 输出中并不明显:
+
+```
+$ sudo chage -l dorothy
+Last password change : Jul 09, 2019
+Password expires : never
+Password inactive : never
+Account expires : never
+Minimum number of days between password change : 0
+Maximum number of days between password change : 99999
+Number of days of warning before password expires : 7
+```
+
+### 密码时效的一些选项
+
+最常用的设置是最短和最长的天数。它们经常结合使用。例如,你可以配置一个密码,使其最长不能使用超过 90 天(最大),然后添加一个有效期为一周或 10 天(最小)的密码。这样可以确保用户不会在需要更改密码后马上改回以前的密码。
+
+```
+$ sudo chage -M 90 -m 10 shark
+$ sudo chage -l shark
+Last password change : Mar 16, 2020
+Password expires : Jun 14, 2020
+Password inactive : never
+Account expires : never
+Minimum number of days between password change : 10 <==
+Maximum number of days between password change : 90 <==
+Number of days of warning before password expires : 7
+```
+
+你还可以使用 **-E** 选项为帐户设置特定的到期日期。
+
+
+```
+$ sudo chage -E 2020-11-11 tadpole
+$ sudo chage -l tadpole
+Last password change : Oct 15, 2019
+Password expires : never
+Password inactive : never
+Account expires : Nov 11, 2020 <==
+Minimum number of days between password change : 0
+Maximum number of days between password change : 99999
+Number of days of warning before password expires : 7
+```
+
+密码时效可能是一个重要的选择,只要它不鼓励用户使用过于简单的密码或以不安全的方式写下来即可。有关控制密码字符(例如,大小写字母、数字等的组合)的更多信息,请参考这篇关于[密码复杂度][3]的文章。
+
+加入 [Facebook][4] 和 [LinkedIn][5] 上的 Network World 社区,评论热门主题。
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3532815/viewing-and-configuring-password-aging-on-linux.html
+
+作者:[Sandra Henry-Stocker][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.networkworld.com/author/Sandra-Henry_Stocker/
+[b]: https://github.com/lujun9972
+[1]: https://www.networkworld.com/newsletters/signup.html
+[2]: https://www.networkworld.com/blog/itaas-and-the-corporate-storage-technology/?utm_source=IDG&utm_medium=promotions&utm_campaign=HPE22140&utm_content=sidebar (ITAAS and Corporate Storage Strategy)
+[3]: https://www.networkworld.com/article/2726217/how-to-enforce-password-complexity-on-linux.html
+[4]: https://www.facebook.com/NetworkWorld/
+[5]: https://www.linkedin.com/company/network-world
diff --git a/translated/tech/20200319 4 Markdown tools for the Linux command line.md b/translated/tech/20200319 4 Markdown tools for the Linux command line.md
new file mode 100644
index 0000000000..bb6a4944fe
--- /dev/null
+++ b/translated/tech/20200319 4 Markdown tools for the Linux command line.md
@@ -0,0 +1,109 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (4 Markdown tools for the Linux command line)
+[#]: via: (https://opensource.com/article/20/3/markdown-apps-linux-command-line)
+[#]: author: (Scott Nesbitt https://opensource.com/users/scottnesbitt)
+
+4 个 Linux 命令行下的 Markdown 工具
+======
+命令行 Markdown 工具快速、强大、灵活。以下是 4 个值得试一下的工具。
+![A person working.][1]
+
+在处理 [Markdown][2] 格式的文件时,命令行工具会占据主导地位。它们轻巧、快速、强大、灵活,它们大多数都遵循 Unix 哲学只做好一件事。
+
+看一下这四个程序,它们可以帮助你在命令行中更有效地处理 Markdown 文件。
+
+### mdless
+
+如果你使用过一段时间的 Linux 命令行,那么你可能对名为 [less][3] 的文本查看器很熟悉。当然,你可以使用 less 查看 Markdown 文件,但结果有点枯燥。如何在终端中查看 Markdown 文件效果更好一点?来使用 [mdless][4]。
+
+![mdless][5]
+
+你可以使用键盘上的箭头键四处移动,并且 mdless 提供了很好的搜索功能。
+
+mdless 不仅会显示文本,而且还会渲染标题、粗体和斜体等格式。它还可以显示表格并语法高亮代码块。你还可以创建一个或多个主题文件来[定制][6] mdless 的外观。
+
+### Markdown lint 工具
+
+你在快速输入时会犯错误。如果你在使用 Markdown(或其他任何标记语言)时丢失了一些格式,那么在将文件转换为另一种格式时可能会有问题。
+
+程序员通常使用名为 _linter_ 的工具来检查语法是否正确。你可以使用 [Markdown lint 工具][7]对 Markdown 执行相同的操作。
+
+在你对 Markdown 文件运行该工具时,它会根据[规则集][8]检查格式。这些规则控制着文档的结构,包括标题级别的顺序、不正确的缩进和间距、代码块问题、文件中存在 HTML 等等。
+
+![Markdown lint tool][9]
+
+规则可能有点严格。但是,在将文件转换为其他格式之前对文件运行 Markdown lint 工具可以防止由于格式错误或不一致引起的麻烦。
+
+### mdmerge
+
+合并任何类型的文件可能会很痛苦。例如,我在整理一本电子书。它是一篇文章集,最初发布在我的[每周邮件][10]中。这些文章都放在单独的文件中,作为受虐狂,我以凌乱,手动的方式将它们组合在一起。
+
+我希望在开始项目之前就了解了 [mdmerge][11]。这样我可以节省很多时间和精力。
+
+mdmerge,你可能已经从名称中猜到了它的作用,它将两个或多个 Markdown 文件合并为一个文件。你无需在命令行中输入文件名。相反,你可以将它们添加到名为 book.txt 的文件中,并将其用作 mdmerge 的输入文件。
+
+这并不是 mdmerge 能做的一切。你可以添加对另一个文档的引用(使用 Markdown 格式引用或一段源代码),然后将其放入主文档中。这样一来,你就可以创建针对特定受众定制的[主文档] [12]。
+
+mdmerge 不会是你一直使用的程序之一。当你需要时,你会很高兴硬盘上有它。
+
+### bashblog
+
+[bashblog][13] 并不是严格上的 Markdown 工具。它获取 Markdown 文件,并使用它们来构建简单的博客或网站。你可以将 bashblog 视为[静态站点生成器][14],但是它没有很多脆弱的依赖关系。一切几乎都在一个不到 50KB 的 shell 脚本中。
+
+要使用 bashblog,只需在计算机上安装 Markdown 处理器即可。在此,你可以编辑 Shell 脚本添加有关博客的信息,例如标题、名字、社交媒体链接等。然后运行脚本。之后会在默认文本编辑器中新建一篇文章。开始输入。
+
+保存文章后,你可以发布它或将其另存为草稿。如果你选择发布文章,那么 bashblog 会将你的博客、文章和所有内容生成为一组 HTML 文件,你可以将它们上传到 Web 服务器。
+
+它开箱即用,你的博客会平淡无奇,但可以使用。你可以根据自己喜好编辑站点的 CSS 文件来改变外观。
+
+![bashblog][15]
+
+### Pandoc 如何?
+
+当然,Panddoc 是一个非常强大的工具,可以将 Markdown 文件转换为其他标记语言。但是,在命令行上使用 Markdown 要比 Pandoc 多。
+
+如果你需要 Pandoc 修复,请查看我们在 Opensource.com 上发布的文章:
+
+ * [使用 Pandoc 在命令行中转换文件][16]
+ * [使用 Pandoc 将你的书变成网站和 ePub] [17]
+ * [如何使用 Pandoc 生成论文] [18]
+ * [使用 Pandoc 将 Markdown 文件转换为 word 文档] [19]
+
+
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/3/markdown-apps-linux-command-line
+
+作者:[Scott Nesbitt][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://opensource.com/users/scottnesbitt
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003784_02_os.comcareers_os_rh2x.png?itok=jbRfXinl (A person working.)
+[2]: https://opensource.com/article/19/9/introduction-markdown
+[3]: https://opensource.com/article/18/4/using-less-view-text-files-command-line
+[4]: https://github.com/ttscoff/mdless
+[5]: https://opensource.com/sites/default/files/uploads/mdless.png (mdless)
+[6]: https://github.com/ttscoff/mdless#customization
+[7]: https://github.com/markdownlint/markdownlint
+[8]: https://github.com/markdownlint/markdownlint/blob/master/docs/RULES.md
+[9]: https://opensource.com/sites/default/files/uploads/mdl.png (Markdown lint tool)
+[10]: https://buttondown.email/weeklymusings
+[11]: https://github.com/JeNeSuisPasDave/MarkdownTools
+[12]: https://help.libreoffice.org/6.2/en-US/text/swriter/guide/globaldoc.html
+[13]: https://github.com/cfenollosa/bashblog
+[14]: https://en.wikipedia.org/wiki/Web_template_system#Static_site_generators
+[15]: https://opensource.com/sites/default/files/uploads/bashblog.png (bashblog)
+[16]: https://opensource.com/article/18/9/intro-pandoc
+[17]: https://opensource.com/article/18/10/book-to-website-epub-using-pandoc
+[18]: https://opensource.com/article/18/9/pandoc-research-paper
+[19]: https://opensource.com/article/19/5/convert-markdown-to-word-pandoc
diff --git a/translated/tech/20200320 How to Check Password Expiration Date for All Users on Linux.md b/translated/tech/20200320 How to Check Password Expiration Date for All Users on Linux.md
new file mode 100644
index 0000000000..0991e386b8
--- /dev/null
+++ b/translated/tech/20200320 How to Check Password Expiration Date for All Users on Linux.md
@@ -0,0 +1,124 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How to Check Password Expiration Date for All Users on Linux)
+[#]: via: (https://www.2daygeek.com/linux-check-user-password-expiration-date/)
+[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/)
+
+如何在 Linux 上检查所有用户密码到期日期
+======
+
+如果你在 **[Linux 上启用了密码策略][1]**。
+
+密码必须在到期前进行更改,并且登录到系统时会收到通知。
+
+如果你很少使用自己的帐户,那么可能由于密码过期而被锁定。
+
+在许多情况下,这可能会在[无需密码登录][2]的服务帐户中发生,因为没人会注意到它。
+
+这将导致停止服务器上配置的 **[cronjob/crontab][3]**。
+
+如果如此,该如何缓解这种情况。
+
+你可以写一个 **[shell 脚本][4]**来获得有关它的通知,我们前一段时间为此写了一篇文章。
+
+ * **[发送 “X” 日内到期的用户帐户列表邮件的 Bash 脚本][5]**
+
+
+
+它将给出天数,但是本文旨在在终端中给你实际日期。
+
+这可以使用 chage 命令来实现。
+
+### 什么是 chage 命令?
+
+chage 代表更改时效 (change age)。它更改用户密码到期信息。
+
+chage 命令更改两次密码更改之间的天数,以及最后一次更改密码的日期。
+
+系统使用此信息来确定用户何时应更改密码。
+
+它允许用户执行其他功能,例如设置帐户到期日期、在到期后将密码设置为无效、显示帐户时效信息、设置密码更改之前的最小和最大天数以及设置到期警告天数。
+
+### 1)如何在 Linux 上检查特定用户的密码到期日期
+
+如果要检查 Linux 上特定用户的密码到期日期,请使用以下命令。
+
+```
+# chage -l daygeek
+
+Last password change : Feb 13, 2020
+Password expires : May 13, 2020
+Password inactive : never
+Account expires : never
+Minimum number of days between password change : 7
+Maximum number of days between password change : 90
+Number of days of warning before password expires : 7
+```
+
+### 2)如何在 Linux 上检查所有用户的密码到期日期
+
+You can use the chage command directly for a single user, which may not work as expected for many users, but you can use it.
+你可以直接对单个用户使用 chage 命令,这对你可以使用的多个用户可能无效。
+
+为此,你需要编写一个小的 shell 脚本。下面的 shell 脚本可以列出添加到系统中的所有用户,包括系统用户。
+
+```
+# for user in $(cat /etc/passwd |cut -d: -f1); do echo $user; chage -l $user | grep "Password expires"; done | paste -d " " - - | sed 's/Password expires//g'
+```
+
+你将得到类似以下的输出,但是用户名可能不同。
+
+```
+root : never
+bin : never
+daemon : never
+adm : never
+lp : never
+sync : never
+shutdown : never
+u1 : Nov 12, 2018
+u2 : Jun 17, 2019
+u3 : Jun 17, 2019
+u4 : Jun 17, 2019
+u5 : Jun 17, 2019
+```
+
+### 3)如何检查 Linux 上除系统用户外的所有用户的密码有效期
+
+下面的 shell 脚本将显示有到期日期的用户列表。
+
+```
+# for user in $(cat /etc/passwd |cut -d: -f1); do echo $user; chage -l $user | grep "Password expires"; done | paste -d " " - - | sed 's/Password expires//g' | grep -v "never"
+```
+
+你将得到类似以下的输出,但是用户名可能不同。
+
+```
+u1 : Nov 12, 2018
+u2 : Jun 17, 2019
+u3 : Jun 17, 2019
+u4 : Jun 17, 2019
+u5 : Jun 17, 2019
+```
+
+--------------------------------------------------------------------------------
+
+via: https://www.2daygeek.com/linux-check-user-password-expiration-date/
+
+作者:[Magesh Maruthamuthu][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/magesh/
+[b]: https://github.com/lujun9972
+[1]: https://www.2daygeek.com/how-to-set-password-complexity-policy-on-linux/
+[2]: https://www.2daygeek.com/configure-setup-passwordless-ssh-key-based-authentication-linux/
+[3]: https://www.2daygeek.com/linux-crontab-cron-job-to-schedule-jobs-task/
+[4]: https://www.2daygeek.com/category/shell-script/
+[5]: https://www.2daygeek.com/bash-script-to-check-user-account-password-expiry-linux/
diff --git a/translated/tech/20200322 Purism Librem Mini- A Privacy-First Linux-Based Mini PC.md b/translated/tech/20200322 Purism Librem Mini- A Privacy-First Linux-Based Mini PC.md
new file mode 100644
index 0000000000..ab437decd1
--- /dev/null
+++ b/translated/tech/20200322 Purism Librem Mini- A Privacy-First Linux-Based Mini PC.md
@@ -0,0 +1,107 @@
+[#]: collector: "lujun9972"
+[#]: translator: "wxy"
+[#]: reviewer: " "
+[#]: publisher: " "
+[#]: url: " "
+[#]: subject: "Purism Librem Mini: A Privacy-First Linux-Based Mini PC"
+[#]: via: "https://itsfoss.com/purism-librem-mini/"
+[#]: author: "Ankush Das https://itsfoss.com/author/ankush/"
+
+Purism Librem Mini:隐私为重的基于 Linux 的微型个人电脑
+======
+
+> Purism 推出了一款外形小巧的微型个人电脑 “Librem Mini”,旨在提供隐私和安全性。让我们来看看它的细节。
+
+[Purism][1] 通常以专注于增强用户的数字隐私和安全性的服务或产品而闻名。
+
+Purism 自诩为“[社会目地公司][2]”,旨在为社会造福,并在这方面提供了多种服务和产品。
+
+你可能听说过它的 Librem 系列 [Linux 笔记本电脑][3]、[Librem One][4](加密服务)、[PureOS Linux][5] 和 [Librem 5 Linux 智能手机][6]。现在,他们已经针对想要掌控自己的隐私和安全性的用户推出了小尺寸微型个人电脑。
+
+### Librem Mini: Purism 的微型个人电脑
+
+![Librem Mini PC][7]
+
+[Purism][1] 的 [Librem Mini][8] 旨在成为小型、轻便且功能强大的微型个人电脑。
+
+当然,已经有很多[基于 Linux 的微型个人电脑][9]了,但是 Librem Mini 专门关注于其用户的隐私和安全性。它随附 [PureOS][5]、[Pureboot][10] 和 [Librem Key][11] 支持。
+
+基本配置将以 699 美元的价格提供。这比大多数其他微型个人电脑要贵。但是,与大多数其他产品不同,Librem Mini 并不是又一个 [Intel NUC][12]。 那么,它提供了什么呢?
+
+### Librem Mini 的规格
+
+![][13]
+
+这是它的规格表:
+
+ * Intel Core i7-8565U(Whiskey Lake),主动(风扇)冷却,4 核 8 线程最高频率 4.6GHz
+ * Intel UHD Graphics 620
+ * RAM: 最多 64 GB DDR4 2400 MHz(2 个 SO-DIMM 插槽)
+ * 1 SATA III 6GB/s SSD/HDD(7mm)
+ * 1 M.2 SSD(SATA III/NVMe x4)
+ * 1 HDMI 2.0 4K @ 60Hz
+ * 1 DisplayPort 1.2 4K @ 60Hz
+ * 4 x USB 3.0
+ * 2 x USB 2.0
+ * 1 x Type-C 3.1
+ * 3.5mm 音频插孔(麦克风输入和耳机插孔合一)
+ * 1 RJ45 Gigabit Ethernet LAN
+ * WiFi 802.11n(2.4/5.0 GHz),可选 Atheros ATH9k 模块
+ * 包括在 WiFi 模块的蓝牙 4.0(可选)
+ * 重量:1 公斤(2.2 磅)
+ * 尺寸:12.8 厘米(5.0 英寸) x 12.8 厘米(5.0 英寸) x 3.8 厘米(1.5 英寸)
+
+我不知道他们为什么决定采用 Intel 的 8 代处理器,而市场上已经出现了 10 代处理器。也许是因为 Whiskey Lake 还是第 8 代处理器的最新产品。
+
+但是,是的,他们已禁用并中止了 Intel 的管理引擎,所以仍然可以采用这个产品。
+
+除此之外,你还应该记住,这款微型个人电脑在提供全盘加密的同时具有检测硬件和软件篡改的功能。
+
+而且,当然,用的是 Linux。
+
+### 价格和供应
+
+![Librem Mini from the back][14]
+
+具有 8 Gigs RAM **和** 256 GB SSD 的基本配置将需要花费 $699。而且,如果你想要最强大的配置,其价格轻松就达到了 $3000。
+
+他们的预定销售额目标是 $50,000,并且他们计划在达到预定目标后一个月内开始发货。
+
+因此,如果你要是现在[预订][15]的话,不要指望很快就会开始发货。因此,我建议你关注 [Librem Mini 产品页面][8]的预定目标。
+
+### 总结
+
+如果你正在寻找一台微型个人电脑(不是专门为隐私和安全而设计的),则可以看看我们的[基于 Linux 的最佳微型个人电脑][9]列表,以获取更多建议。
+
+对于普通消费者而言,Librem Mini 绝对听起来很昂贵。对于隐私发烧友来说,它仍然是一个不错的选择。
+
+你怎么看?让我知道你的想法!
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/purism-librem-mini/
+
+作者:[Ankush Das][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[校对者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://puri.sm/
+[2]: https://puri.sm/about/social-purpose/
+[3]: https://itsfoss.com/get-linux-laptops/
+[4]: https://itsfoss.com/librem-one/
+[5]: https://itsfoss.com/pureos-convergence/
+[6]: https://itsfoss.com/librem-linux-phone/
+[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/03/librem-mini-pc.png?ssl=1
+[8]: https://puri.sm/products/librem-mini/
+[9]: https://itsfoss.com/linux-based-mini-pc/
+[10]: https://docs.puri.sm/PureBoot.html
+[11]: https://puri.sm/products/librem-key/
+[12]: https://itsfoss.com/intel-nuc-essential-accessories/
+[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/03/librem-mini-pc-1.png?ssl=1
+[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/03/librem-mini-back.png?ssl=1
+[15]: https://shop.puri.sm/shop/librem-mini/