diff --git a/published/20190204 Getting started with Git- Terminology 101.md b/published/20190204 Getting started with Git- Terminology 101.md
new file mode 100644
index 0000000000..42b3d0ba0f
--- /dev/null
+++ b/published/20190204 Getting started with Git- Terminology 101.md
@@ -0,0 +1,124 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-12994-1.html)
+[#]: subject: (Getting started with Git: Terminology 101)
+[#]: via: (https://opensource.com/article/19/2/git-terminology)
+[#]: author: (Matthew Broberg https://opensource.com/users/mbbroberg)
+
+Git 入门:术语基础
+======
+
+> 想学习 Git?看看这个最重要的术语和命令的快速总结。
+
+
+
+如今,对于任何希望跟踪他们的变化的人来说,版本控制是一个重要的工具。它对程序员、系统管理员和网站可靠性工程师(SRE)都特别有用。确保可以从错误中恢复到已知的良好状态是一个巨大的胜利,比以前给复制的文件添加 `.old` 后缀的策略更友好。
+
+但学习 Git 这件事往往被告诉大家“投身开源”的好心同行们过度简化了。在你还不明白之前,就有人要你给一个从上游 变基的拉取请求(PR)或合并请求(MR),然后他们才能从你的远程版本库合并 —— 而且一定会删除合并提交。无论你想给开源项目做出什么好的贡献,当你看到这些你不认识的单词时,都会觉得难以融入。
+
+![Git 速查表封面图][2]
+
+- [下载][3] 我们的 Git 速查表。
+
+如果你有一两个月的时间和足够的好奇心,[Git SCM][4] 是你需要学习所有术语的权威来源。但如果你正在寻找来自实践的总结,请继续阅读。
+
+### 提交就是提醒
+
+对我来说,Git 最难理解的部分是 Git 最简单的概念:一个提交就是一个内容的集合,包括一个关于描述的信息,以及之前的提交。没有固有的代码发布策略,甚至没有内置的明确建议。这个内容甚至不一定是代码 —— 可以是*任何*你想添加到版本库的东西。提交消息会对这些内容进行注释。
+
+我喜欢把提交信息看作是给未来的自己的礼物:它可能会提到你编辑的文件,但更重要的是它提醒你修改这些文件的意图。添加更多关于你为什么编辑这些内容的信息,可以帮助任何使用你的版本库的人,即使那个人是你。
+
+### origin/master 在哪里?
+
+要知道自己在 Git 项目中的位置,首先把它想成一棵树。所有 Git 项目都有一个根目录,类似于文件系统的根目录。所有的提交都是这个根目录下的分支。这样一来,分支只是一个提交的指针。按照惯例,`master` 是根目录下默认的分支名称。(LCTT 译注:世界变得快,原文发表于 2019 年,而现在有些地方开始用 `main` 替代这个名字。)
+
+由于 Git 是一个分布式的版本控制系统,同一个代码库分布在多个地方,所以人们经常用版本库这个词来表示同一个项目的所有副本。(LCTT 译注:“repository” 英文原意是仓库、存储库,在计算机环境中,常用于版本控制、软件分发等方面,有时候会统一译作“仓库”、“存储库”。但我们认为,应该根据不同语境采用更有指向性的译法。在 Git 等版本控制语境中,采用“版本库”;在软件分发方面,采用“软件库”;其它泛指或不确定的语境中,可采用“仓库”、“存储库”译法。)有本地版本库,这是你编辑代码的地方(稍后会有更多的介绍),还有远程版本库,这是你完成后想把代码发送到的地方。远程版本库可以在任何地方,甚至在你的本地版本库所在的同一台计算机上,但它们通常托管在 GitLab 或 GitHub 等版本库服务上。
+
+### 我在哪里?
+
+虽然不是官方的卖点,但迷路也是 Git 仓库的“乐趣”之一。你可以通过这套可靠的命令来找到自己的方向:
+
+ * `git branch` —— 找到你所在的分支。
+ * `git log` —— 查看你正在进行的提交。
+ * `git status` —— 查看自上次提交以来你所做的编辑。
+ * `git remote` —— 查看你正在跟踪的远程仓库。
+
+用这些命令来定位自己的方向,当你被卡住的时候,会让你有一种方向感。
+
+### 我是否已将我的提交暂存或缓存起来?
+
+你电脑上的代码俗称为你的工作空间。但不是很明显的是,当你在 Git 仓库中时,你还有两个(是的,两个!)其他位置:索引和暂存。当你写了一些内容,然后**添加**时,你是把它添加到索引中,也就是准备提交的缓存内容。有的时候,你的索引中的文件还没有准备好提交,但你想查看另一个分支。这时,暂存就派上用场了。你可以使用 `git stash` 将索引了但尚未提交的文件存储到暂存区中。当你准备好取回文件时,运行 `git stash pop` 将更改带回索引中。
+
+下面是一些你需要使用暂存区和缓存区的命令:
+
+ * `git diff ...origin/master` —— 显示最近的本地提交和远程的 `origin` 版本库的 `master` 分支之间的差异。
+ * `git diff --cached` —— 显示最近的本地提交与添加到本地索引的内容之间的任何差异。
+ * `git stash` —— 将索引的(已添加但未提交的)文件放在暂存区堆栈中。
+ * `git stash list` —— 显示暂存区堆栈中的变化。
+ * `git stash pop` —— 将最近的变化从暂存库中删除。
+
+### 无头骑士
+
+Git 里面有各种比喻。当我想到 `HEAD` 是哪里的时候,我就会想到火车线路。如果你最终处于脱离的 HEAD模式,就意味着你已经脱离了这个隐喻的轨道。
+
+`HEAD` 是指向当前签出分支中最近一次提交的指针。默认的“签出”是指当你创建一个 Git 仓库并进入到 `master` 分支的时候。每次创建或修改到另一个分支时,你都会切换到该分支行。如果你在当前分支的某处进行 `git checkout `,`HEAD` 就会移动到该提交。如果没有提交历史记录将你的当前提交连接到已签出的提交,那么你将处于脱离的 `HEAD` 状态。如果你找不到 `HEAD` 的位置,你可以随时用 `git reset --hard origin/master` 来删除修改,回到已知状态。*警告:这将删除你上次推送到 `master` 后的任何改动。*
+
+### 你是上游还是下游?
+
+你的项目的本地副本被认为是你的本地版本库,它可能有也可能没有远程版本库 —— 远程版本库的副本是用于协作或保存的。也可能还有一个上游版本库,在那里,项目的第三个副本由不同的贡献者托管和维护。
+
+例如,假设我想为 Kubernetes 做贡献。我会首先将 `kubernetes/kubernetes` 项目复刻到我的账户下 `mbbroberg/kubernetes`。然后我会将我的项目克隆到我的本地工作区。在这种情况下,我的本地克隆是我的本地仓库,`mbbroberg/kubernetes` 是我的远程仓库,`kubernetes/kubernetes` 是上游。
+
+### 合并的隐喻
+
+当你深入 Git 分支时,根系统的视觉效果就会和火车轨道的形象合二为一。分支通常被用作开发一个新功能的方式,最终你想把它合并到主分支中。当这样做时,Git 会按顺序保留共同的提交历史,然后将你的分支的新提交追加到历史中。这个过程有一大堆的细节:是否变基,是否添加一个合并提交,[Brent Laster][5] 在《[如何在 Git 中重置、恢复和返回之前的状态][6]》中会有更详细的探讨。
+
+### 我想现在就去 Git
+
+要掌握 Git 命令的世界,有大量的术语和需要探索的地方。我希望这篇关于日常使用术语的第一人称探索能帮助你适应这一切。如果你觉得自己被卡住了或者遇到了挫折,欢迎在 Twitter [@mbbroberg][7] 上联系我。
+
+#### 回顾
+
+ * 提交 —— 将当前索引的内容保存在一个新的提交中,并附上用户描述更改的日志信息。
+ * 分支 —— 指向一个提交的指针。
+ * `master` —— 第一个分支的默认名称。
+ * `HEAD` —— 指向当前分支上最近一次提交的指针。
+ * 合并 —— 合并两个或多个提交的历史。
+ * 工作空间 —— Git 仓库本地副本的通俗名称。
+ * 工作树 —— 工作区中的当前分支;任何时候你都可以在 `git status` 的输出中看到这个。
+ * 缓存 —— 用于临时存储未提交的变更的空间。
+ * 索引 —— 变更提交前存储其变化的缓存。
+ * 跟踪和未跟踪的文件 —— 没有被索引缓存的文件或尚未加入其中的文件。
+ * 暂存 —— 另一个缓存,作为一个堆栈,在这里可以存储更改而不需要提交它们。
+ * `origin` —— 远程版本库的默认名称。
+ * 本地仓库 —— 也就是你在工作站上保存 Git 仓库副本的地方。
+ * 远程存储库 —— Git 存储库的第二副本,你可以在这里推送变更以便协作或备份。
+ * 上游存储库 —— 你跟踪的远程存储库的通俗说法。
+ * 拉取请求 —— 这是 GitHub 的专用术语,用于让其他人知道你推送到仓库分支的变化。
+ * 合并请求 —— 这是 GitLab 的专用术语,用于让其他人知道你推送到仓库分支的变化。
+ * `origin/master` —— 远程版本库及其主要分支的默认名称。
+
+后记:双关语是 Git 最好的部分之一,愿你喜欢。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/2/git-terminology
+
+作者:[Matthew Broberg][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/mbbroberg
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003588_01_rd3os.combacktoschoolseriesk12_rh_021x_0.png?itok=fvorN0e- (Digital hand surrounding by objects, bike, light bulb, graphs)
+[2]: https://opensource.com/sites/default/files/uploads/git_cheat_sheet_cover.jpg (Git Cheat Sheet cover image)
+[3]: https://opensource.com/downloads/cheat-sheet-git
+[4]: https://git-scm.com/about
+[5]: https://opensource.com/users/bclaster
+[6]: https://opensource.com/article/18/6/git-reset-revert-rebase-commands
+[7]: https://twitter.com/mbbroberg
diff --git a/translated/tech/20201228 Learn to use the JOE text editor on Linux.md b/published/20201228 Learn to use the JOE text editor on Linux.md
similarity index 69%
rename from translated/tech/20201228 Learn to use the JOE text editor on Linux.md
rename to published/20201228 Learn to use the JOE text editor on Linux.md
index c671440e86..4bd0adce4f 100644
--- a/translated/tech/20201228 Learn to use the JOE text editor on Linux.md
+++ b/published/20201228 Learn to use the JOE text editor on Linux.md
@@ -1,25 +1,26 @@
[#]: collector: (lujun9972)
[#]: translator: (geekpi)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-12993-1.html)
[#]: subject: (Learn to use the JOE text editor on Linux)
[#]: via: (https://opensource.com/article/20/12/joe)
[#]: author: (Seth Kenlon https://opensource.com/users/seth)
学习在 Linux 上使用 JOE 文本编辑器
======
-Joe's Own Editor (JOE)是一款简单易学和使用的通用文本编辑器。
-![Person programming on a laptop on a building][1]
+
+> Joe's Own Editor (JOE)是一款简单易学和使用的通用文本编辑器。
+
+
我很喜欢那些能让你轻松学会如何使用的文本编辑器。GNU nano 是我最喜欢的例子:你启动 nano,你会在整个会话的窗口底部看到一个最常用的命令列表。Joe's Own Editor(简称 `joe`)是另一个很好的例子。
-`joe` 编辑器使用了一个基于终端的界面,提供了简单的文本编辑功能和一个易于访问的帮助屏幕。它用 C 语言编写,体积小,只对 libc 有硬性依赖(ncurses 是可选的),并且采用 GPL 授权。
+`joe` 编辑器使用了一个基于终端的界面,提供了简单的文本编辑功能和一个易于访问的帮助屏幕。它用 C 语言编写,体积小,只对 libc 有硬性依赖(ncurses 是可选的),并且采用 GPL 许可证。
### 安装
-在 Linux 上,你也许能在你的发行版软件仓库中找到 JOE。虽然它有点晦涩,所以并不是所有的发行版都打包了它。如果是这样的话,你可以从 [SourceForge][2] 下载源码,然后自己编译。这是个简单的过程:
-
+在 Linux 上,你也许能在你的发行版软件仓库中找到 JOE。虽然它有点小众,并不是所有的发行版都打包了它。如果是这样的话,你可以从 [SourceForge][2] 下载源码,然后自己编译。这是个简单的过程:
```
$ ./configure
@@ -29,13 +30,13 @@ $ sudo make install
### 使用 JOE
-据其作者介绍,JOE 的灵感来自于一个叫 WordStar 的应用和 [GNU Emacs][3]。它的大部分基本编辑键都与 WordStar 的快捷键相同,编辑器本身也在努力向 WordStar 靠拢。JOE 也有 GNU Emacs 的一些键绑定和功能。这种两种灵感来源的混合有时会让人迷惑,但话又说回来,在任何情况下,让自己脱离 Emacs(或你通常选择的文本编辑器)都会让人迷惑。重要的是,JOE 提供了帮助,而且很容易访问。
+据其作者介绍,JOE 的灵感来自于一个叫 WordStar 的应用和 [GNU Emacs][3]。它的大部分基本编辑键都与 WordStar 的快捷键相同,编辑器本身也在努力向 WordStar 靠拢。JOE 也有 GNU Emacs 的一些键绑定和功能。这种两种灵感来源的混合有时会让人迷惑,但话又说回来,在任何情况下,让自己离开 Emacs(或你通常选择的文本编辑器)都会让人迷惑。重要的是,JOE 提供了帮助,而且很容易访问。
-在 JOE 界面右上角,有一个持续的提示,你可以按 **Ctrl+K**,紧接着按 **H** 来查看帮助界面。这是一个切换键,所以一旦你激活它,帮助屏幕就会一直显示在你的编辑器窗口顶部,直到用同样的组合键(JOE 中的键盘符号为 **^KH**)解除。
+在 JOE 界面右上角,有一个持续的提示,你可以按 `Ctrl+K`,紧接着按 `H` 来查看帮助界面。这是一个切换键,所以一旦你激活它,帮助屏幕就会一直显示在你的编辑器窗口顶部,直到用同样的组合键(JOE 中的键盘符号为 `^KH`)解除。
### 键盘快捷键
-尽管 JOE 的作者在模拟 WordStar 用户体验方面非常自豪,但我不得不承认,这对我来说是失落的。我从来没有听说过 WordStar,直到我在 JOE 的文档中读到了它,在我看来,它的键盘快捷键方案完全是任意的。有的用 **Ctrl+K** 作为转义序列的前缀,有的用 **Esc**作为前缀,还有的完全不需要转义序列。我无法确定其中的逻辑。编辑操作和应用选项一样,都有可能需要或不需要转义序列,而且很少有字母关联对我来说是有意义的(例如,**Ctrl+K** **D**代表**另存为**)。
+尽管 JOE 的作者在模拟 WordStar 用户体验方面非常自豪,但我不得不承认,这对我来说是失落的。我从来没有听说过 WordStar,直到我在 JOE 的文档中读到了它,在我看来,它的键盘快捷键方案完全是任意的。有的用 `Ctrl+K` 作为转义序列的前缀,有的用 `Esc` 作为前缀,还有的完全不需要转义序列。我无法确定其中的逻辑。编辑操作和应用选项一样,都有可能需要或不需要转义序列,而且字母关联对我来说是没有什么意义(例如,`Ctrl+K D` 代表**另存为**)。
幸运的是,JOE 可以让你在键盘快捷键上作弊。安装后,JOE 会悄悄为 `joe` 可执行文件创建一些符号链接。包括:
@@ -44,15 +45,13 @@ $ sudo make install
* `rjoe` JOE 的编辑只限于启动时传递给 JOE 的文件
* `jstar` JOE 使用 WordStar 键绑定
-
-
![Black terminal with white text showing WordStar key bindings][4]
-持久的帮助菜单仍然存在,所以如果你不清楚有哪些功能可以使用,可以通过屏幕右上方的帮助提示来参考。当然,在 Pico/nano 模式下,主要命令总是可见的。
+持久保留的帮助菜单仍然存在,所以如果你不清楚有哪些功能可以使用,可以通过屏幕右上方的帮助提示来参考。当然,在 Pico/nano 模式下,主要命令总是可见的。
### 尝试 JOE
-JOE 并不是一个你永远不会离开的文本编辑器,它不会成为你的 IDE、电子邮件客户端、网络浏览器和文件管理器。事实上,它甚至可能不是你所有任务的主要文本编辑器。它专注于做好一件事,那就是一般的文本编辑。
+JOE 并不是一个你永远不会离开的文本编辑器,它不会成为你的 IDE、电子邮件客户端、网络浏览器和文件管理器。事实上,它甚至可能不是你所有任务的主要文本编辑器。它专注于做好一件事,那就是成为一般的文本编辑。
JOE 拥有你所需要的所有基本功能,比如能够快速浏览你的文本、能够选择文本、复制和粘贴等等。试试 JOE 吧,使用你喜欢的符号链接。
@@ -63,7 +62,7 @@ via: https://opensource.com/article/20/12/joe
作者:[Seth Kenlon][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/sources/talk/20210107 3 serverless strategies to look for in 2021.md b/sources/talk/20210107 3 serverless strategies to look for in 2021.md
new file mode 100644
index 0000000000..33e6748d84
--- /dev/null
+++ b/sources/talk/20210107 3 serverless strategies to look for in 2021.md
@@ -0,0 +1,62 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (3 serverless strategies to look for in 2021)
+[#]: via: (https://opensource.com/article/21/1/devapps-strategies)
+[#]: author: (Daniel Oh https://opensource.com/users/daniel-oh)
+
+3 serverless strategies to look for in 2021
+======
+These serverless applications development and deployment approaches are
+driving fast-adoption of the DevApps practice today.
+![Tips and gears turning][1]
+
+If you had at least one chance to attend business and technologies conferences recently, you probably saw lots of DevOps strategies, Agilist, and DevSecOps engineers around the digital transformation track. No matter what business you work in, it’s no secret that [DevOps][2] is a big trigger to craft new companies. It is also used to optimize existing resources, from the IT infrastructure to workflow processes and cultural changes.
+
+While I was moderating several tracks (i.e., serverless) at [KubeCon + CloudNativeCon North America 2020][3], I had a chance to catch a very interesting trend around DevOps.The trend was more interest in cloud-native application development than deployment and provisioning with certain cloud platforms on [Kubernetes][4]. Kubernetes was unleashed upon the world back in 2014. Since then, IT ops organizations have benefited from orchestrating immutable application runtimes with service invocation and discovery, autoscaling, and resilience by using Kubernetes. In the meantime, application workloads also need to move forward to serverless functions and event-driven reactive services, along with the DevOps platform, which is a key ability to manage multi and hybrid cloud infrastructure.
+
+In this article, I will talk about _DevApps_ more than _DevOps_ since the applications are critical to accelerate your business success, along with matured DevOps tools and technologies. The following three serverless applications development and deployment approaches are driving fast-adoption of the DevApps practice today.
+
+### Serverless functions
+
+The COVID-19 pandemic triggered enterprises to run business services on the managed platform. Also, developers began transforming existing microservices into [serverless][5] functions. [Cloud-Native Serverless Landscape][6] can be the first step for developers to create deployable functions across managed cloud platforms. More importantly, it’s not easy to develop traditional microservices and serverless functions on the same application runtime along the container-native way. For 10+ million Java developers worldwide, [Quarkus][7] enables them to address this complex issue without a steep learning curve for both imperative and serverless applications.
+
+### Serverless events
+
+Event-driven services are growing because they increase flexibility and agility. They also reduce dependencies and complexity in application development. Serverless events enable developers to maximize these benefits when they implement event publishers and exchange data across serverless platforms. [Knative Eventing][8] is built on [CloudEvents][9] to allow developers to write serverless events with late-binding features such as event creation, event sinks, and event consumption.
+
+### Serverless workflows
+
+With the rise in popularity to adopt [the DevOps pipeline][10], workflows definition is also becoming a key role in serverless events coordination. This is because serverless functions are also increasingly complex and composed of multiple tasks in a single event. To specify complex business workflows with serverless workloads, [Serverless Workflow][11] allows developers to define the workflow models with a vendor-neutral specification for orchestrating serverless events. The Serverless Workflow specification is an initiative project by CNCF.
+
+### What’s next for DevApps developers?
+
+With many different cloud-native Java frameworks in place, Quarkus gives developers more benefits from container-first design to live coding for inner loop development, imperative and reactive programming, and more Kubernetes-native pre-integration. More practical and useful guides about Quarkus are [here][12].
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/1/devapps-strategies
+
+作者:[Daniel Oh][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/daniel-oh
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/gears_devops_learn_troubleshooting_lightbulb_tips_520.png?itok=HcN38NOk (Tips and gears turning)
+[2]: https://opensource.com/resources/devops
+[3]: https://www.googleadservices.com/pagead/aclk?sa=L&ai=DChcSEwiOm66eppHtAhUCoLMKHdbDBtYYABAAGgJxbg&ae=2&ohost=www.google.com&cid=CAASE-RoewbFs9aqDAPBTaiW7zxvM74&sig=AOD64_0D6rO4CljYUjuM8RWT5cUNp_C8cg&q&adurl&ved=2ahUKEwjwtaaeppHtAhXBmeAKHbsfAtUQ0Qx6BAgJEAE
+[4]: https://opensource.com/article/19/6/reasons-kubernetes
+[5]: https://opensource.com/article/19/4/enabling-serverless-kubernetes
+[6]: https://landscape.cncf.io/format=serverless
+[7]: https://opensource.com/article/20/4/java-quarkus-vs-code
+[8]: https://knative.dev/docs/eventing/
+[9]: https://cloudevents.io/
+[10]: https://opensource.com/article/19/4/devops-pipeline-acceptance-testing
+[11]: https://github.com/serverlessworkflow
+[12]: https://quarkus.io/guides/
diff --git a/sources/talk/20210108 What is an open source evangelist.md b/sources/talk/20210108 What is an open source evangelist.md
new file mode 100644
index 0000000000..81908181c3
--- /dev/null
+++ b/sources/talk/20210108 What is an open source evangelist.md
@@ -0,0 +1,109 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (What is an open source evangelist?)
+[#]: via: (https://opensource.com/article/21/1/open-source-evangelist)
+[#]: author: (Peter Czanik https://opensource.com/users/czanik)
+
+What is an open source evangelist?
+======
+Learn what it takes to be a bridge between a product's users and its
+developers.
+![Teamwork starts with communication][1]
+
+When people learn that I work as an open source evangelist (focusing on [syslog-ng][2] and [sudo][3]), they often ask me what it's like to represent such well-known names in the Linux world. My short answer: It's good!
+
+I am part of research and development, so it is never boring. I feel that I make an impact when people implement what they learn from me and when the feedback I collect from users influences the development of the product.
+
+### What is an evangelist?
+
+I define an evangelist as a bridge between a software's (or other product's) users and its developers. It is not just about sharing good news with users but also collecting feedback from them.
+
+Evangelists come from a wide range of backgrounds. Some people have a marketing background with a strong interest in technology. Some are developers who like talking to users. I belong to a third group, "power users," or people with in-depth knowledge about a software product from the user's point of view.
+
+In my job, I work with many, many users. The syslog-ng user base is enormous. It is available on most Linux distributions and BSD variants. Hundreds of millions of devices run syslog-ng, including both the BMW i3 and the Kindle. Most BSD-based appliances, like FreeNAS, run syslog-ng for logging, as do Linux-based network-attached storages (NAS) devices from Synology and QNAP. I would not be surprised to learn that syslog-ng is running somewhere in space.
+
+Most Linux and Unix users use sudo since it is installed on almost every Linux machine out there. Its community is huge, with tens of millions of people. People often ask me how I cope with these large numbers of users, but it is not difficult.
+
+### How I became an evangelist
+
+My journey to becoming an evangelist was an evolutionary process that spanned nearly 20 years. It started many years ago while I was teaching at a university. My next step was working with POWER/PowerPC Linux users and developers. Finally, I started to cover syslog-ng in my job at [Balabit][4] and later began working with sudo.
+
+My first job at Balabit was to help Linux distributions update the syslog-ng package to the latest upstream version. As I learned more and more about syslog-ng's details, I was asked to help its users. A year later, I was giving talks about syslog-ng at Hungarian and international conferences. Soon after, the feedback I collected from users started to make an impact on product development.
+
+Eight years later, in 2018, Balabit was acquired by [One Identity][5], and [Todd Miller][6], sudo's maintainer, became my colleague. Until then, I knew only some basic sudo features, but I became more interested in sudo and learning about its advanced features. Soon, I was also evangelizing sudo and evolving from a syslog-ng evangelist into a more generic open source evangelist.
+
+### Four pillars of technical evangelism
+
+Technical evangelists do many things that can be broadly divided into four categories: developer, support, technical product marketing, and product management. I'll look at each of these four pillars of technical evangelism in more detail.
+
+#### Developer
+
+I am not a developer, but I do many things that developers do, such as packaging syslog-ng for various Linux distributions and FreeBSD, doing lots of testing, integrating syslog-ng with other software, and testing it on exotic platforms. The developer tasks I do help the community and helps me understand its needs better.
+
+#### Support
+
+Following bug trackers, watching the syslog-ng keyword in Google Alerts and Twitter, and reading the mailing list enable me to help our user base better. By helping our users, I also understand their problems better.
+
+#### Technical product marketing
+
+I really do not like the term "marketing," but writing blogs and talking at conferences *is *marketing. As a former sysadmin, I know my audience, and we have a common voice. Along with my own Twitter handle, [@PCzanik][7], I also post under the [@sngOSE][8] (syslog-ng open source edition) and [@SudoProject][9] (sudo) handles.
+
+Twitter is a fantastic platform to collect and share technical news. Marketing is the most visible part of my work as an evangelist, even if it is just one aspect of my job.
+
+ * **Event survival tips for introverts: **When people learn that I am doing this job even though I am an introvert, they often ask me how I do it. Giving a talk or working at a conference booth all day long can be difficult; there are too many people, too much noise. Here are my survival tips for events:
+ * Focus on the results. Events are the best opportunity to collect feedback from users. After your talk, you can have good discussions anywhere, even at the booth or in the hallway. Users give a lot of feedback in real life at events, and remembering their comments helps a lot.
+ * Keep in mind when the event is over. Knowing that you have to stay only one more hour in an environment with a high level of noise helps a lot.
+ * Enjoy that you get to talk to like-minded people who have the same shyness, insecurity, and technical interests as you have.
+ * **Marketing tips during a pandemic: **Many people have asked me how COVID-19 has affected my work since I haven't been able to travel since March 2020. I came back from talking at the [RSA Conference][10] and [Southern California Linux Expo][11] just two days before flights were suspended and borders were closed. Even though all conferences are virtual right now, I can still give talks about sudo and syslog-ng. But this means feedback is missing or minimal—there is no hallway track to meet users nor a dinner for speakers to discuss the latest and greatest technologies. Participation and attention are also less focused, as there are plenty of distractions when people are working from home. I have seen many different efforts to work around this situation. Each has its own drawbacks and advantages:
+ * A global chat room is good for a smaller event. But if an event has more than just a few dozen people, then it turns into a continuous roll of 'Hi from Boston, MA' and similar messages without a chance for a meaningful conversation.
+ * If an event has multiple tracks, a dedicated chat for each track can be helpful. Both the users and the speaker can learn a lot from the questions and remarks posted in the chat. A moderator can make it twice as much useful, keeping the discussion on topic and making sure that questions reach the speaker during the Q&A part of the talk.
+ * A chat roulette is good to connect random strangers and might result in good discussions. But for a speaker, it is way too random.
+ * Tracking chats is good but many people are uncomfortable to post questions or share experiences in public. A possibility for direct chat with the speaker can resolve this problem.
+
+
+
+#### Product management
+
+I am not a product manager, even though sometimes I wish that the feedback I collect could be turned directly into features. However, I regularly share users' feedback with developers and product management. In internal discussions, I always represent the users' side rather than the easiest way forward for developers or what will generate the most revenue.
+
+### Why evangelize broadly known and used software?
+
+Every Linux user knows sudo, and many of them also know syslog-ng. So why evangelize? Well, most people know just the very basics of these applications, which they learned when they started to play with Linux. But neither is a simple utility that has been in maintenance mode for decades; both are living software still under continuous development.
+
+What most people know about syslog-ng is that it collects log messages and saves them to text files. But it has a lot of [other features][12], including parsing messages, enriching messages with geographical information, precise message routing (filtering), and saving messages to databases, Hadoop, or message queues.
+
+Sudo is mostly known as a prefix for administrative commands, but it can do a lot more. It can record sessions that run through it, allowing you to check what your users are doing when they exercise their superpowers through sudo. You can also extend sudo with plugins. [Starting with sudo version 1.9][13], you can even extend sudo in Python, making the process a lot easier.
+
+### Conclusion
+
+Being an open source evangelist is a very interesting and fun job, even in the COVID-19 era, which has certainly added difficulties to my work. If you have other questions about the role or have a story about how a technical evangelist or developer advocate has helped you, please share them in the comments.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/1/open-source-evangelist
+
+作者:[Peter Czanik][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/czanik
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/laptop-stickers-team-happy_0.png?itok=G2-GcSPp (Teamwork starts with communication )
+[2]: https://www.syslog-ng.com/
+[3]: https://www.sudo.ws/
+[4]: https://en.wikipedia.org/wiki/Balabit
+[5]: https://www.oneidentity.com/
+[6]: https://www.linkedin.com/in/millert/
+[7]: https://twitter.com/PCzanik
+[8]: https://twitter.com/sngose
+[9]: https://twitter.com/SudoProject
+[10]: https://www.rsaconference.com/usa/us-2020
+[11]: https://www.socallinuxexpo.org/scale/18x
+[12]: https://www.syslog-ng.com/community/b/blog/posts/building-blocks-of-syslog-ng
+[13]: https://opensource.com/article/20/10/sudo-19
diff --git a/sources/tech/20190204 Getting started with Git- Terminology 101.md b/sources/tech/20190204 Getting started with Git- Terminology 101.md
deleted file mode 100644
index 0b76cd3a43..0000000000
--- a/sources/tech/20190204 Getting started with Git- Terminology 101.md
+++ /dev/null
@@ -1,157 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Getting started with Git: Terminology 101)
-[#]: via: (https://opensource.com/article/19/2/git-terminology)
-[#]: author: (Matthew Broberg https://opensource.com/users/mbbroberg)
-
-Getting started with Git: Terminology 101
-======
-Want to learn Git? Check out this quick summary of the most important
-terms and commands.
-![Digital hand surrounding by objects, bike, light bulb, graphs][1]
-
-Version control is an important tool for anyone looking to track their changes these days. It's especially helpful for programmers, sysadmins, and site reliability engineers (SREs) alike. The promise of recovering from mistakes to a known good state is a huge win and a touch friendlier than the previous strategy of adding **`.old`** to a copied file.
-
-But learning Git is often oversimplified by well-meaning peers telling everyone to "get into open source." Before you know it, someone asks for a _pull request_ or *merge request *where you _rebase_ from _upstream_ before they can merge from your _remote_—and be sure to remove _merge commits_. Whatever well-working contribution you want to give back to an open source project feels much further from being added when you look at all these words you don't know.
-
-![Git Cheat Sheet cover image][2]
-
-[Download][3] our
-Git cheat sheet.
-
-If you have a month or two and enough curiosity, [Git SCM][4] is the definitive source for all the terms you need to learn. If you're looking for a summary from the trenches, keep reading.
-
-### Reminder: What's a commit?
-
-The toughest part of Git for me to internalize was the simplest idea of Git: _a commit is a collection of content, a message about how you got there, and the commits that came before it_. There's no inherent code release strategy or even strong opinions built in. The content doesn't even have to be code—it is _anything_ you want to add to the repository. The commit message annotates that content.
-
-I like to think of a commit message as a gift to your future self: it may mention the files you edited, but more importantly it reminds you of your intention for changing those files. Adding more about why you have edited what you have helps anyone who uses your repository, even when that person is you.
-
-### There's no place like 'origin/master'
-
-Knowing where you are in a Git project starts with thinking of a tree. All Git projects have a root, similar to the idea of a filesystem's root directory. All commits branch off from that root. In this way, a branch is only a pointer to a commit. By convention, **master** is the default name for the default branch in your root directory.
-
-Since Git is a distributed version control system, where the same codebase is distributed to multiple locations, people often use the term "repository" as a way of talking about all copies of the same project. There is the _local repository_, where you edit your code (more on that in a minute), and the _remote repository_, the place where you want to send it after you're finished. Remotes can be anywhere, even on the same computer where your local repository is located, but they are often hosted on repository services like GitLab or GitHub.
-
-### What's the pwd of Git commands?
-
-While it's not an official selling point, being lost is part of the fun of a Git repository. You can find your way by running through this reliable set of commands:
-
- * `git branch`—to find which branch you're on
-
- * `git log`—to see what commit you're on
-
- * `git status`—to see what edits you've made since the last commit
-
- * `git remote`—to see what remote repository you're tracking
-
-
-
-
-Orienting yourself using these commands will give you a sense of direction when you're stuck.
-
-### Have I stashed or cached my commit?
-
-The code local to your computer is colloquially called your _workspace_. What is not immediately obvious is that you have two (yes, two!) other locations local to you when you are in a Git repository: _index_ and _stash_. When you write some content and then **add** it, you are adding it to the index, which is the cached content that is ready to commit. There are times when you have files in the index that you are not ready to commit, but you want to view another branch. That's where the stash comes in handy. You can store indexed-but-not-yet-committed files to the stash using `git stash`. When you're ready to retrieve the file, run `git stash pop` to bring changes back into the index.
-
-Here are some commands you'll need to use your stash and cache.
-
- * `git diff ..origin/master`—to show the difference between the most recent local commit and the remote called "origin" and its branch called "master"
-
- * `git diff --cached`—to show any differences between the most recent local commit and what has been added to the local index
-
- * `git stash`—to place indexed (added but not committed) files in the stash stack
-
- * `git stash list`—to show what changes are in the stash stack
-
- * `git stash pop`—to take the most recent change off the stash stack
-
-
-
-
-### HEADless horseman
-
-Git is a collection of all kinds of metaphors. When I think of where the HEAD is, I think of train lines. If you end up in a _detached HEAD_ mode, it means you're off the metaphorical rails.
-
-HEAD is a pointer to your most recent commit in the currently checked-out branch. The default "checkout" is when you create a Git repository and land on the **master** branch. Every time you create or change to another branch, you are on that branch line. If you `git checkout ` somewhere in your current branch, HEAD will move to that commit. If there is no commit history connecting your current commit to the commit you checked out, then you'll be in a detached HEAD state. If you ever lose your head finding where HEAD is, you can always `git reset --hard origin/master` to delete changes and get back to a known state. _Warning: this will delete any changes you have made since you last pushed to master._
-
-### Are you upstream or downstream?
-
-The local copy of your project is considered your local repository. It may or may not have a remote repository—the place where you have a copy of your repository for collaboration or safekeeping. There may also be an _upstream_ repository where a third copy of the project is hosted and maintained by a different set of contributors.
-
-For instance, let's say I want to contribute to Kubernetes. I would first fork the **kubernetes/kubernetes** project to my account, **mbbroberg/kubernetes**. I would then clone my project to my local workspace. In this scenario, my local clone is my local repository, **mbbroberg/kubernetes** is my remote repository, and **kubernetes/kubernetes** is the upstream.
-
-### Merging the metaphors
-
-The visual of a root system merges with the train tracks image when you get deeper into Git branches. Branches are often used as ways of developing a new feature that you eventually want to _merge_ into the master branch. When doing this, Git keeps the common history of commits in order then appends the new commits for your branch to the history. There are a ton of nuances to this process—whether to rebase or not, whether to add a merge commit or not—which [Brent Laster][5] explores in greater detail in "[How to reset, revert, and return to previous states in Git][6]."
-
-### I think I Git it now
-
-There is a ton of terminology and a lot to explore to master the world of Git commands. I hope this first-person exploration of how I use the terms day-to-day helps you acclimate to it all. If you ever feel stuck or frustrated, feel free to reach out to me on Twitter [@mbbroberg][7].
-
-#### To review:
-
- * **Commit**—stores the current contents of the index in a new commit along with a log message from the user describing the changes
-
- * **Branch**—a pointer to a commit
-
- * **Master**—the default name for the first branch
-
- * **HEAD**—a pointer to the most recent commit on the current branch
-
- * **Merge**—joining two or more commit histories
-
- * **Workspace**—the colloquial name for your local copy of a Git repository
-
- * **Working tree**—the current branch in your workspace; you see this in `git status` output all the time
-
- * **Cache**—a space intended to temporarily store uncommitted changes
-
- * **Index**—the cache where changes are stored before they are committed
-
- * **Tracked and untracked files**—files either in the index cache or not yet added to it
-
- * **Stash**—another cache, that acts as a stack, where changes can be stored without committing them
-
- * **Origin**—the default name for a remote repository
-
- * **Local repository**—another term for where you keep your copy of a Git repository on your workstation
-
- * **Remote repository**—a secondary copy of a Git repository where you push changes for collaboration or backup
-
- * **Upstream repository**—the colloquial term for a remote repository that you track
-
- * **Pull request**—a GitHub-specific term to let others know about changes you've pushed to a branch in a repository
-
- * **Merge request**—a GitLab-specific term to let others know about changes you've pushed to a branch in a repository
-
- * **'origin/master'**—the default setting for a remote repository and its primary branch
-
-
-
-
-Postscript: Puns are one of the best parts of Git. Have fun with them.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/19/2/git-terminology
-
-作者:[Matthew Broberg][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/mbbroberg
-[b]: https://github.com/lujun9972
-[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003588_01_rd3os.combacktoschoolseriesk12_rh_021x_0.png?itok=fvorN0e- (Digital hand surrounding by objects, bike, light bulb, graphs)
-[2]: https://opensource.com/sites/default/files/uploads/git_cheat_sheet_cover.jpg (Git Cheat Sheet cover image)
-[3]: https://opensource.com/downloads/cheat-sheet-git
-[4]: https://git-scm.com/about
-[5]: https://opensource.com/users/bclaster
-[6]: https://opensource.com/article/18/6/git-reset-revert-rebase-commands
-[7]: https://twitter.com/mbbroberg
diff --git a/sources/tech/20201224 5 reasons to use the Atom text editor.md b/sources/tech/20201224 5 reasons to use the Atom text editor.md
deleted file mode 100644
index 1d1fbbc8c0..0000000000
--- a/sources/tech/20201224 5 reasons to use the Atom text editor.md
+++ /dev/null
@@ -1,123 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: (geekpi)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (5 reasons to use the Atom text editor)
-[#]: via: (https://opensource.com/article/20/12/atom)
-[#]: author: (Seth Kenlon https://opensource.com/users/seth)
-
-5 reasons to use the Atom text editor
-======
-Atom is a comprehensive environment that can accomplish tasks from basic
-to complex, for users from beginners to veterans.
-![Science lab with beakers][1]
-
-Beautiful open source text editors are pretty common these days, between Adobe’s [Brackets][2], Microsoft’s [VSCode][3], and GitHub’s [Atom][4]. Each of these seem to offer similar experiences: a modern interface, easily installable plugins, and a big brand-name sponsor. And they’re all actually really good. So what sets Atom apart from any other hyper-modern text editor? Or from a classic old editor like [Vim][5] or [Emacs][6]?
-
-![Atom terminal with white text on dark grey background][7]
-
-I’ve used lots of text editors, and upon reflection, I have to admit that once you’ve seen one text editor, you’ve basically seen them all. When judging an editor’s efficacy, 80% of the requirements are satisfied as long as it does one thing: edit text. The other 20% are bonus conveniences, extra gizmos, and fanciful features. They’re nice to have but hardly essential.
-
-I often come back to Atom, though, because, as a user of open source, I have the luxury of using an application just because I can. Here’s what I like about Atom.
-
-### Beginner-friendly
-
-One of my favorite things about Atom is that it feels pretty "normal." I can install Atom on anyone’s computer and they’re off and typing in no time. No new keyboard shortcuts to learn, no serious deviations from user interface conventions. If I take a few minutes to show them a few power features of the application, then they're quickly empowered to install new plugins and discover useful features they enjoy.
-
-It’s just different enough to feel unique but "safe" enough to trick people into believing (and rightly so) they can use it. That’s a hard line to walk, but Atom manages it, and I appreciate it for that.
-
-### Great extensions
-
-When most requirements have been filled as soon as you launch the application, a major factor in "selling" an open source text editor is its extensions. My habitual editor is [GNU Emacs][8], which has a mind-boggling array of extensions so versatile that they can provide everything from an email client to a video game. That’s a hard act to top, and to be honest, I’ve yet to see the editor that can. It shows how important extensions can be, though, and Atom has a nice set of plugins.
-
-There are extensions to add syntax highlighting for languages and formats, to add dynamic linting, and to integrate debuggers, runtime environments, video and music player controls, and much more.
-You can practically make Atom the control hub for your desktop, so you rarely have to leave it.
-
-### Language and syntax support
-
-I’m a documented fan of [Docbook][9]. By extension, I’m a fan of its simplified front-end, Asciidoc. When I evaluate an editor, Docbook schema and Asciidoc support are two of my primary metrics. While XML support is relatively common, integration with a specific schema can be a tall order, and Asciidoc is still relatively obscure. Atom's community provides great support for my favorite formats.
-
-Of course, I’ve already mentioned that Atom has great extensions in general, but syntax highlighting is an important feature regardless of what language you're typing. Once again, thanks to a vibrant community, the variety of syntax highlighter options in Atom’s package repository is one of the best.
-
-### Easy theming
-
-Atom makes generating your own style as easy as styling a website, so if you’re competent with CSS, you can make your own Atom theme. To create your own theme, navigate to the **Package** menu. If you don’t see a **Package** menu, press the **Alt** key first to reveal the top menu bar. In the **Package** menu, hover over **Package Generator** and then select **Generate Atom Syntax Theme**. This opens a new project called _my-theme-syntax_ by default. You can name it whatever you want, but it should end in `-syntax` according to Atom convention.
-
-In your new theme project, locate these files: `base.less`, `colors.less`, and `syntax-variables.less`. These define how special keywords, and even background and foreground colors, are themed when your syntax is active. Because they all inherit values from a common template, it’s pretty easy to hack on. For example:
-
-
-```
-// Syntax styles
-
-.syntax--comment {
- color: @light-gray;
-}
-
-.syntax--keyword {
- color: @purple;
-
- &.syntax--control {
- color: @purple;
- }
-
- &.syntax--operator {
- color: @syntax-text-color;
- }
-
- &.syntax--other.syntax--special-method {
- color: @blue;
- }
-
- &.syntax--other.syntax--unit {
- color: @orange;
- }
-}
-```
-
-The values ending with two dashes, such as `.syntax--keyword`, are objects recognized by a syntax highlighting engine. If you want to develop your customizations further, of course, you can even create your own syntax definitions (although that’s more work than CSS theming). Read all about the ways to hack Atom at [flight-manual.atom.io][10].
-
-### Flexible workflow
-
-Atom has lots of features, and only a subset of them are activated by default. This means you get to decide how you prefer to work, whether you activate new extensions and use them to change Atom on a fundamental level, or you just open up Atom’s preferences and make small adjustments. You can use Atom for writing a fiction book or for writing Python code or technical documentation or anything else.
-
-Even its Git integration doesn’t insist on what you might imagine would be the obvious repository (Github sponsors Atom). It doesn’t have an agenda, and it’s equally useful to everyone, regardless of audience.
-
-## Installing
-
-On Linux, Windows, and macOS, you can [install Atom from its website][11].
-
-Alternately, on Linux, you can install Atom as a Flatpak from [Flathub][12].
-
-If you want to build Atom yourself, you can also [compile it from its source code on Github][13].
-
-## Try Atom
-
-Atom could be your next text editor, notepad, and IDE. It’s easy to use, easy to configure, easy to extend, and it offers a great user experience. Download Atom today, and give it a try.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/20/12/atom
-
-作者:[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/science_experiment_beaker_lab.png?itok=plKWRhlU (Science lab with beakers)
-[2]: https://opensource.com/article/20/12/brackets
-[3]: https://opensource.com/article/20/12/%C2%A0https://opensource.com/article/20/6/open-source-alternatives-vs-code
-[4]: https://opensource.com/article/17/5/atom-text-editor-packages-writers
-[5]: https://opensource.com/article/20/12/vi-text-editor
-[6]: https://opensource.com/article/20/12/emacs
-[7]: https://opensource.com/sites/default/files/uploads/atom-31_days-atom-opensource.png (Atom terminal with white text on dark grey background)
-[8]: https://opensource.com/article/20/2/who-cares-about-emacs
-[9]: https://opensource.com/article/17/9/docbook
-[10]: https://flight-manual.atom.io/
-[11]: https://atom.io
-[12]: https://flathub.org/apps/details/io.atom.Atom
-[13]: https://github.com/atom
diff --git a/sources/tech/20210106 My 3 favorite open source productivity apps.md b/sources/tech/20210106 My 3 favorite open source productivity apps.md
index e5417c2893..e7a2efc395 100644
--- a/sources/tech/20210106 My 3 favorite open source productivity apps.md
+++ b/sources/tech/20210106 My 3 favorite open source productivity apps.md
@@ -1,5 +1,5 @@
[#]: collector: (lujun9972)
-[#]: translator: ( )
+[#]: translator: (geekpi)
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
diff --git a/sources/tech/20210107 8 open source software cheat sheets you-ll need in 2021.md b/sources/tech/20210107 8 open source software cheat sheets you-ll need in 2021.md
new file mode 100644
index 0000000000..58b715d32d
--- /dev/null
+++ b/sources/tech/20210107 8 open source software cheat sheets you-ll need in 2021.md
@@ -0,0 +1,81 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (8 open source software cheat sheets you'll need in 2021)
+[#]: via: (https://opensource.com/article/21/1/cheat-sheets)
+[#]: author: (Jim Hall https://opensource.com/users/jim-hall)
+
+8 open source software cheat sheets you'll need in 2021
+======
+When that pesky command is just at the tip of your tongue, a handy cheat
+sheet will save the day. This list of cheat sheets covers everything
+from programming languages to collaboration tools.
+![Cheat Sheet cover image][1]
+
+Sometimes you need the short version. You know what you want to do and you just can't recall exactly how to do it. That's when cheat sheets come in handy. In this article, I suggest a cheat sheet to get you going with MariaDB and MySQL. This cheat sheet is great for the occassional database user. Next, I have listed two Raspberry Pi cheat sheets. The first gets you started with this single-board computer. Once you're comfortable with the basics, turn it into a home lab and begin working with Kubernetes container management. Be sure to grab the next cheat sheet at the same time, because it covers the kubectl tool. Next, there is a great cheat sheet for Emacs, and another for the C programming language. Finally, the list concludes with two very practical cheat sheets: Collaboration tools and open source alternatives.
+
+Here is the list:
+
+### [MariaDB and MySQL cheat sheet][2]
+
+MariaDB is an enterprise-grade database. Learning MariaDB is a great step toward using it to manage web applications or programming language libraries. This MariaDB and MySQL cheat sheet covers useful commands for connecting to servers, analyzing data, and other key activities. The commands on this cheat sheet are valid for the interactive prompt and SQL scripts, but much can be extrapolated for use with programming libraries as well.
+
+### [Raspberry Pi: How to get started][3]
+
+Since 2012, the Raspberry Pi has been a must-have for learning programming skills, building hardware projects, doing home automation, and creating applications. Its affordable price makes it attractive to open source enthusiasts of any skill level. This downloadable guide will set you up for success with tips on choosing a Raspberry Pi, keeping it updated, using it for Linux gaming, contributing to the community, and so much more.
+
+### [Running Kubernetes on your Raspberry Pi home lab][4]
+
+Building a home lab has become increasingly accessible thanks to the affordability and versatility of the Raspberry Pi single-board computer. There are thousands of things you can do with a Raspberry Pi, including experimenting with Kubernetes. In this eBook, author [Chris Collins][5] demonstrates how to get started running Kubernetes on your Raspberry Pi. Each section of this guide can be treated in isolation or as a holistic project. Regardless of your day job, reading these tutorials and trying them out at your own pace is sure to boost your cloud technology prowess.
+
+### [Kubectl cheat sheet][6]
+
+Kubectl is a powerful command-line tool to maintain your Kubernetes cluster. This 2-page cheat sheet covers commonly used commands to take you above and beyond average cluster administration. It's broken up into three different sections, including basic commands, troubleshooting commands, and advanced commands. Keep these nine critical kubectl commands handy to help you with troubleshooting and managing your Kubernetes cluster administration.
+
+### [Emacs cheat sheet][7]
+
+It's nearly impossible to remember every single Emacs shortcut there is to know. With this cheat sheet, you can familiarize yourself with the most common combinations so you can be more efficient. When you have this guide at your side, you can forget about forgetting Emacs keyboard shortcuts. Become an Emacs power user by learning the essential keyboard shortcuts demonstrated in this cheat sheet.
+
+### [C programming cheat sheet][8]
+
+C is a straightforward compiled programming language. Other programming languages borrow concepts from C, making C a great starting point if you want to learn programming languages such as Lua, C++, Java, or Go. This double-sided cheat sheet by Jim Hall has all the basics so you can immediately access all the essentials of C syntax. Learn C by downloading this cheat sheet and keep syntax essentials handy.
+
+### [5 open source collaboration tools][9]
+
+[Kevin Sonney's][10] productivity guide makes collaboration a breeze with five open source tool tutorials. Tools covered in this download include open source email clients, an alternative to Google Docs, and more. Leave team miscommunication in the past and say hello to team productivity.
+
+### [Open source software alternatives cheat sheet][11]
+
+In our vast world of open source, there are plenty of alternatives to common proprietary software tools. However, it can be daunting sometimes to find the right open source option to fit your specific needs. That's why we put together this one-page cheat sheet to cover the major software tool categories, including team chat, file sharing, word processing, and more. We didn't stop with office tools. We also included top open source applications for gaming, social media, and personal finance. Quickly find alternatives to common proprietary software tools with this cheat sheet.
+
+### Wrap up
+
+This list covers a lot of topics. Check out dozens more cheat sheets and guides on our [downloads page][12]. Let us know which is your favorite in the comments below. Don't forget to write and submit cheat sheets for your favorite open source tools.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/1/cheat-sheets
+
+作者:[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/coverimage_cheat_sheet.png?itok=lYkNKieP (Cheat Sheet cover image)
+[2]: https://opensource.com/downloads/mariadb-mysql-cheat-sheet
+[3]: https://opensource.com/downloads/raspberry-pi-guide
+[4]: https://opensource.com/downloads/kubernetes-raspberry-pi
+[5]: https://opensource.com/users/clcollins
+[6]: https://opensource.com/downloads/kubectl-cheat-sheet
+[7]: https://opensource.com/downloads/emacs-cheat-sheet
+[8]: https://opensource.com/downloads/c-programming-cheat-sheet
+[9]: https://opensource.com/downloads/collaboration-tools-ebook
+[10]: https://opensource.com/users/ksonney
+[11]: https://opensource.com/downloads/open-source-software-alternatives-cheat-sheet
+[12]: https://opensource.com/downloads/cheat-sheets
diff --git a/sources/tech/20210107 A hands-on tutorial for using the GNU Project Debugger.md b/sources/tech/20210107 A hands-on tutorial for using the GNU Project Debugger.md
new file mode 100644
index 0000000000..ac878e098c
--- /dev/null
+++ b/sources/tech/20210107 A hands-on tutorial for using the GNU Project Debugger.md
@@ -0,0 +1,655 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (A hands-on tutorial for using the GNU Project Debugger)
+[#]: via: (https://opensource.com/article/21/1/gnu-project-debugger)
+[#]: author: (Stephan Avenwedde https://opensource.com/users/hansic99)
+
+A hands-on tutorial for using the GNU Project Debugger
+======
+The GNU Project Debugger is a powerful tool for finding bugs in
+programs.
+![magnifying glass on computer screen, finding a bug in the code][1]
+
+If you're a programmer and you want to put a certain functionality in your software, you start by thinking of ways to implement it—such as writing a method, defining a class, or creating new data types. Then you write the implementation in a language that the compiler or interpreter can understand. But what if the compiler or interpreter does not understand the instructions as you had them in mind, even though you're sure you did everything right? What if the software works fine most of the time but causes bugs in certain circumstances? In these cases, you have to know how to use a debugger correctly to find the source of your troubles.
+
+The GNU Project Debugger ([GDB][2]) is a powerful tool for finding bugs in programs. It helps you uncover the reason for an error or crash by tracking what is going on inside the program during execution.
+
+This article is a hands-on tutorial on basic GDB usage. To follow along with the examples, open the command line and clone this repository:
+
+
+```
+`git clone https://github.com/hANSIc99/core_dump_example.git`
+```
+
+### Shortcuts
+
+Every command in GDB can be shortened. For example, `info break`, which shows the set breakpoints, can be shortened to `i break`. You might see those abbreviations elsewhere, but in this article, I will write out the entire command so that it is clear which function is used.
+
+### Command-line parameters
+
+You can attach GDB to every executable. Navigate to the repository you cloned, and compile it by running `make`. You should now have an executable called **coredump**. (See my article on [_Creating and debugging Linux dump files_][3] for more information..
+
+To attach GDB to the executable, type: `gdb coredump`.
+
+Your output should look like this:
+
+![gdb coredump output][4]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+It says no debugging symbols were found.
+
+Debugging information is part of the object file (the executable) and includes data types, function signatures, and the relationship between the source code and the opcode. At this point, you have two options:
+
+ * Continue debugging the assembly (see "[Debug without symbols][6]" below)
+ * Compile with debug information using the information in the next section
+
+
+
+### Compile with debug information
+
+To include debug information in the binary file, you have to recompile it. Open the **Makefile** and remove the hashtag (`#`) from line 9:
+
+
+```
+`CFLAGS =-Wall -Werror -std=c++11 -g`
+```
+
+The `g` option tells the compiler to include the debug information. Run `make clean` followed by `make` and invoke GDB again. You should get this output and can start debugging the code:
+
+![GDB output with symbols][7]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+The additional debugging information will increase the size of the executable. In this case, it increases the executable by 2.5 times (from 26,088 byte to 65,480 byte).
+
+Start the program with the `-c1` switch by typing `run -c1`. The program will start and crash when it reaches `State_4`:
+
+![gdb output crash on c1 switch][8]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+You can retrieve additional information about the program. The command `info source` provides information about the current file:
+
+![gdb info source output][9]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+ * 101 lines
+ * Language: C++
+ * Compiler (version, tuning, architecture, debug flag, language standard)
+ * Debugging format: [DWARF 2][10]
+ * No preprocessor macro information available (when compiled with GCC, macros are available only when [compiled with the `-g3` flag][11]).
+
+
+
+The command `info shared` prints a list of dynamic libraries with their addresses in the virtual address space that was loaded on startup so that the program will execute:
+
+![gdb info shared output][12]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+If you want to learn about library handling in Linux, see my article [_How to handle dynamic and static libraries in Linux_][13].
+
+### Debug the program
+
+You may have noticed that you can start the program inside GDB with the `run` command. The `run` command accepts command-line arguments like you would use to start the program from the console. The `-c1` switch will cause the program to crash on stage 4. To run the program from the beginning, you don't have to quit GDB; simply use the `run` command again. Without the `-c1` switch, the program executes an infinite loop. You would have to stop it with **Ctrl+C**.
+
+![gdb output stopped by sigint][14]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+You can also execute a program step by step. In C/C++, the entry point is the `main` function. Use the command `list main` to open the part of the source code that shows the `main` function:
+
+![gdb output list main][15]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+The `main` function is on line 33, so add a breakpoint there by typing `break 33`:
+
+![gdb output breakpoint added][16]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+Run the program by typing `run`. As expected, the program stops at the `main` function. Type `layout src` to show the source code in parallel:
+
+![gdb output break at main][17]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+You are now in GDB's text user interface (TUI) mode. Use the Up and Down arrow keys to scroll through the source code.
+
+GDB highlights the line to be executed. By typing `next` (n), you can execute the commands line by line. GBD executes the last command if you don't specify a new one. To step through the code, just hit the **Enter** key.
+
+From time to time, you will notice that TUI's output gets a bit corrupted:
+
+![gdb output corrupted][18]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+If this happens, press **Ctrl+L** to reset the screen.
+
+Use **Ctrl+X+A** to enter and leave TUI mode at will. You can find [other key bindings][19] in the manual.
+
+To quit GDB, simply type `quit`.
+
+### Watchpoints
+
+The heart of this example program consists of a state machine running in an infinite loop. The variable `n_state` is a simple enum that determines the current state:
+
+
+```
+while(true){
+ switch(n_state){
+ case State_1:
+ std::cout << "State_1 reached" << std::flush;
+ n_state = State_2;
+ break;
+ case State_2:
+ std::cout << "State_2 reached" << std::flush;
+ n_state = State_3;
+ break;
+
+ (.....)
+
+ }
+}
+```
+
+You want to stop the program when `n_state` is set to the value `State_5`. To do so, stop the program at the `main` function and set a watchpoint for `n_state`:
+
+
+```
+`watch n_state == State_5`
+```
+
+Setting watchpoints with the variable name works only if the desired variable is available in the current context.
+
+When you continue the program's execution by typing `continue`, you should get output like:
+
+![gdb output stop on watchpoint_1][20]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+If you continue the execution, GDB will stop when the watchpoint expression evaluates to `false`:
+
+![gdb output stop on watchpoint_2][21]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+You can specify watchpoints for general value changes, specific values, and read or write access.
+
+### Altering breakpoints and watchpoints
+
+Type `info watchpoints` to print a list of previously set watchpoints:
+
+![gdb output info watchpoints][22]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+#### Delete breakpoints and watchpoints
+
+As you can see, watchpoints are numbers. To delete a specific watchpoint, type `delete` followed by the number of the watchpoint. For example, my watchpoint has the number 2; to remove this watchpoint, enter `delete 2`.
+
+_Caution:_ If you use `delete` without specifying a number, _all_ watchpoints and breakpoints will be deleted.
+
+The same applies to breakpoints. In the screenshot below, I added several breakpoints and printed a list of them by typing `info breakpoint`:
+
+![gdb output info breakpoints][23]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+To remove a single breakpoint, type `delete` followed by its number. Alternatively, you can remove a breakpoint by specifying its line number. For example, the command `clear 78` will remove breakpoint number 7, which is set on line 78.
+
+#### Disable or enable breakpoints and watchpoints
+
+Instead of removing a breakpoint or watchpoint, you can disable it by typing `disable` followed by its number. In the following, breakpoints 3 and 4 are disabled and are marked with a minus sign in the code window:
+
+![disabled breakpoints][24]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+It is also possible to modify a range of breakpoints or watchpoints by typing something like `disable 2 - 4`. If you want to reactivate the points, type `enable` followed by their numbers.
+
+### Conditional breakpoints
+
+First, remove all breakpoints and watchpoints by typing `delete`. You still want the program to stop at the `main` function, but instead of specifying a line number, add a breakpoint by naming the function directly. Type `break main` to add a breakpoint at the `main` function.
+
+Type `run` to start the execution from the beginning, and the program will stop at the `main` function.
+
+The `main` function includes the variable `n_state_3_count`, which is incremented when the state machine hits state 3.
+
+To add a conditional breakpoint based on the value of `n_state_3_count` type:
+
+
+```
+`break 54 if n_state_3_count == 3`
+```
+
+![Set conditional breakpoint][25]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+Continue the execution. The program will execute the state machine three times before it stops at line 54. To check the value of `n_state_3_count`, type:
+
+
+```
+`print n_state_3_count`
+```
+
+![print variable][26]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+#### Make breakpoints conditional
+
+It is also possible to make an existing breakpoint conditional. Remove the recently added breakpoint with `clear 54`, and add a simple breakpoint by typing `break 54`. You can make this breakpoint conditional by typing:
+
+
+```
+`condition 3 n_state_3_count == 9`
+```
+
+The `3` refers to the breakpoint number.
+
+![modify breakpoint][27]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+#### Set breakpoints in other source files
+
+If you have a program that consists of several source files, you can set breakpoints by specifying the file name before the line number, e.g., `break main.cpp:54`.
+
+#### Catchpoints
+
+In addition to breakpoints and watchpoints, you can also set catchpoints. Catchpoints apply to program events like performing syscalls, loading shared libraries, or raising exceptions.
+
+To catch the `write` syscall, which is used to write to STDOUT, enter:
+
+
+```
+`catch syscall write`
+```
+
+![catch syscall write output][28]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+Each time the program writes to the console output, GDB will interrupt execution.
+
+In the manual, you can find a whole chapter [covering break-, watch-, and catchpoints][29].
+
+### Evaluate and manipulate symbols
+
+Printing the values of variables is done with the `print` command. The general syntax is `print `. The value of a variable can be modified by typing:
+
+
+```
+`set variable .`
+```
+
+In the screenshot below, I gave the variable `n_state_3_count` the value _123_.
+
+![print variable][30]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+The `/x` expression prints the value in hexadecimal; with the `&` operator, you can print the address within the virtual address space.
+
+If you are not sure of a certain symbol's data type, you can find it with `whatis`:
+
+![whatis output][31]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+If you want to list all variables that are available in the scope of the `main` function, type `info scope main`:
+
+![info scope main output][32]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+The `DW_OP_fbreg` values refer to the stack offset based on the current subroutine.
+
+Alternatively, if you are already inside a function and want to list all variables on the current stack frame, you can use `info locals`:
+
+![info locals output][33]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+Check the manual to learn more about [examining symbols][34].
+
+### Attach to a running process
+
+The command `gdb attach ` allows you to attach to an already running process by specifying the process ID (PID). Luckily, the `coredump` program prints its current PID to the screen, so you don't have to manually find it with [ps][35] or [top][36].
+
+Start an instance of the coredump application:
+
+
+```
+`./coredump`
+```
+
+![coredump application][37]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+The operating system gives the PID `2849`. Open a separate console window, move to the coredump application's source directory, and attach GDB:
+
+
+```
+`gdb attach 2849`
+```
+
+![attach GDB to coredump][38]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+GDB immediately stops the execution when you attach it. Type `layout src` and `backtrace` to examine the call stack:
+
+![layout src and backtrace output][39]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+The output shows the process interrupted while executing the `std::this_thread::sleep_for<...>(...)` function that was called in line 92 of `main.cpp`.
+
+As soon as you quit GDB, the process will continue running.
+
+You can find more information about [attaching to a running process][40] in the GDB manual.
+
+#### Move through the stack
+
+Return to the program by using `up` two times to move up in the stack to `main.cpp`:
+
+![moving up the stack to main.cpp][41]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+Usually, the compiler will create a subroutine for each function or method. Each subroutine has its own stack frame, so moving upwards in the stackframe means moving upwards in the callstack.
+
+You can find out more about [stack evaluation][42] in the manual.
+
+#### Specify the source files
+
+When attaching to an already running process, GDB will look for the source files in the current working directory. Alternatively, you can specify the source directories manually with the [`directory` command][43].
+
+### Evaluate dump files
+
+Read [_Creating and debugging Linux dump files_][3] for information about this topic.
+
+TL;DR:
+
+ 1. I assume you're working with a recent version of Fedora
+
+ 2. Invoke coredump with the c1 switch: `coredump -c1`
+
+![Crash meme][44]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+ 3. Load the latest dumpfile with GDB: `coredumpctl debug`
+
+ 4. Open TUI mode and enter `layout src`
+
+
+
+
+![coredump output][45]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+The output of `backtrace` shows that the crash happened five stack frames away from `main.cpp`. Enter to jump directly to the faulty line of code in `main.cpp`:
+
+![up 5 output][46]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+A look at the source code shows that the program tried to free a pointer that was not returned by a memory management function. This results in undefined behavior and caused the `SIGABRT`.
+
+### Debug without symbols
+
+If there are no sources available, things get very hard. I had my first experience with this when trying to solve reverse-engineering challenges. It is also useful to have some knowledge of [assembly language][47].
+
+Check out how it works with this example.
+
+Go to the source directory, open the **Makefile**, and edit line 9 like this:
+
+
+```
+`CFLAGS =-Wall -Werror -std=c++11 #-g`
+```
+
+To recompile the program, run `make clean` followed by `make` and start GDB. The program no longer has any debugging symbols to lead the way through the source code.
+
+![no debugging symbols][48]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+The command `info file` reveals the memory areas and entry point of the binary:
+
+![info file output][49]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+The entry point corresponds with the beginning of the `.text` area, which contains the actual opcode. To add a breakpoint at the entry point, type `break *0x401110` then start execution by typing `run`:
+
+![breakpoint at the entry point][50]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+To set up a breakpoint at a certain address, specify it with the dereferencing operator `*`.
+
+#### Choose the disassembler flavor
+
+Before digging deeper into assembly, you can choose which [assembly flavor][51] to use. GDB's default is AT&T, but I prefer the Intel syntax. Change it with:
+
+
+```
+`set disassembly-flavor intel`
+```
+
+![changing assembly flavor][52]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+Now open the assembly and register the window by typing `layout asm` and `layout reg`. You should now see output like this:
+
+![layout asm and layout reg output][53]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+#### Save configuration files
+
+Although you have already entered many commands, you haven't actually started debugging. If you are heavily debugging an application or trying to solve a reverse-engineering challenge, it can be useful to save your GDB-specific settings in a file.
+
+The [config file `gdbinit`][54] in this project's GitHub repository contains the recently used commands:
+
+
+```
+set disassembly-flavor intel
+set write on
+break *0x401110
+run -c2
+layout asm
+layout reg
+```
+
+The `set write on` command enables you to modify the binary during execution.
+
+Quit GDB and reopen it with the configuration file: `gdb -x gdbinit coredump`.
+
+#### Read instructions
+
+With the `c2` switch applied, the program will crash. The program stops at the entry function, so you have to write `continue` to proceed with execution:
+
+![continuing execution after crash][55]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+The `idiv` instruction performs an integer division with the dividend in the `RAX` register and the divisor specified as an argument. The quotient is loaded into the `RAX` register, and the remainder is loaded into `RDX`.
+
+From the register overview, you can see the `RAX` contains _5_, so you have to find out which value is stored on the stack at position `RBP-0x4`.
+
+#### Read memory
+
+To read raw memory content, you must specify a few more parameters than for reading symbols. When you scroll up a bit in the assembly output, you can see the division of the stack:
+
+![stack division output][56]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+You're most interested in the value of `rbp-0x4` because this is the position where the argument for `idiv` is stored. From the screenshot, you can see that the next variable is located at `rbp-0x8`, so the variable at `rbp-0x4` is 4 bytes wide.
+
+In GDB, you can use the `x` command to _examine_ any memory content:
+
+> `x/` < optional parameter `n` `f` `u` > < memory address `addr` >
+
+Optional parameters:
+
+ * `n`: Repeat count (default: 1) refers to the unit size
+ * `f`: Format specifier, like in [printf][57]
+ * `u`: Unit size
+ * `b`: bytes
+ * `h`: half words (2 bytes)
+ * `w`: word (4 bytes)(default)
+ * `g`: giant word (8 bytes)
+
+
+
+To print out the value at `rbp-0x4`, type `x/u $rbp-4`:
+
+![print value][58]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+If you keep this pattern in mind, it's straightforward to examine the memory. Check the [examining memory][59] section in the manual.
+
+#### Manipulate the assembly
+
+The arithmetic exception happened in the subroutine `zeroDivide()`. When you scroll a bit upward with the Up arrow key, you can find this pattern:
+
+
+```
+0x401211 <_Z10zeroDividev> push rbp
+0x401212 <_Z10zeroDividev+1> mov rbp,rsp
+```
+
+This is called the [function prologue][60]:
+
+ 1. The base pointer (`rbp`) of the calling function is stored on the stack
+ 2. The value of the stack pointer (`rsp`) is loaded to the base pointer (`rbp`)
+
+
+
+Skip this subroutine completely. You can check the call stack with `backtrace`. You are only one stack frame ahead of your `main` function, so you can go back to `main` with a single `up`:
+
+![Callstack assembly][61]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+In your `main` function, you can find this pattern:
+
+
+```
+0x401431 <main+497> cmp BYTE PTR [rbp-0x12],0x0
+0x401435 <main+501> je 0x40145f <main+543>
+0x401437 <main+503> call 0x401211<_Z10zeroDividev>
+```
+
+The subroutine `zeroDivide()` is entered only when `jump equal (je)` evaluates to `true`. You can easily replace this with a `jump-not-equal (jne)` instruction, which has the opcode `0x75` (provided you are on an x86/64 architecture; the opcodes are different on other architectures). Restart the program by typing `run`. When the program stops at the entry function, manipulate the opcode by typing:
+
+
+```
+`set *(unsigned char*)0x401435 = 0x75`
+```
+
+Finally, type `continue`. The program will skip the subroutine `zeroDivide()` and won't crash anymore.
+
+### Conclusion
+
+You can find GDB working in the background in many integrated development environments (IDEs), including Qt Creator and the [Native Debug][62] extension for VSCodium.
+
+![GDB in VSCodium][63]
+
+(Stephan Avenwedde, [CC BY-SA 4.0][5])
+
+It's useful to know how to leverage GDB's functionality. Usually, not all of GDB's functions can be used from the IDE, so you benefit from having experience using GDB from the command line.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/1/gnu-project-debugger
+
+作者:[Stephan Avenwedde][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/hansic99
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/mistake_bug_fix_find_error.png?itok=PZaz3dga (magnifying glass on computer screen, finding a bug in the code)
+[2]: https://www.gnu.org/software/gdb/
+[3]: https://opensource.com/article/20/8/linux-dump
+[4]: https://opensource.com/sites/default/files/uploads/gdb_output_no_dbg_symbols.png (gdb coredump output)
+[5]: https://creativecommons.org/licenses/by-sa/4.0/
+[6]: tmp.2p0XrqmAS5#without_symbols
+[7]: https://opensource.com/sites/default/files/uploads/gdb_output_with_symbols.png (GDB output with symbols)
+[8]: https://opensource.com/sites/default/files/uploads/gdb_output_crash_on_c1_switch.png (gdb output crash on c1 switch)
+[9]: https://opensource.com/sites/default/files/uploads/gdb_output_info_source.png (gdb info source output)
+[10]: http://dwarfstd.org/
+[11]: https://sourceware.org/gdb/current/onlinedocs/gdb/Compilation.html#Compilation
+[12]: https://opensource.com/sites/default/files/uploads/gdb_output_info_shared.png (gdb info shared output)
+[13]: https://opensource.com/article/20/6/linux-libraries
+[14]: https://opensource.com/sites/default/files/uploads/gdb_output_stopped_by_sigint.png (gdb output stopped by sigint)
+[15]: https://opensource.com/sites/default/files/uploads/gdb_output_list_main.png (gdb output list main)
+[16]: https://opensource.com/sites/default/files/uploads/gdb_output_breakpoint_added.png (gdb output breakpoint added)
+[17]: https://opensource.com/sites/default/files/uploads/gdb_output_break_at_main.png (gdb output break at main)
+[18]: https://opensource.com/sites/default/files/images/gdb_output_screen_corrupted.png (gdb output corrupted)
+[19]: https://sourceware.org/gdb/onlinedocs/gdb/TUI-Keys.html#TUI-Keys
+[20]: https://opensource.com/sites/default/files/uploads/gdb_output_stop_on_watchpoint_1.png (gdb output stop on watchpoint_1)
+[21]: https://opensource.com/sites/default/files/uploads/gdb_output_stop_on_watchpoint_2.png (gdb output stop on watchpoint_2)
+[22]: https://opensource.com/sites/default/files/uploads/gdb_output_info_watchpoints.png (gdb output info watchpoints)
+[23]: https://opensource.com/sites/default/files/uploads/gdb_output_info_breakpoints.png (gdb output info breakpoints)
+[24]: https://opensource.com/sites/default/files/uploads/gdb_output_disabled_breakpoints.png (disabled breakpoints)
+[25]: https://opensource.com/sites/default/files/uploads/gdb_output_set_conditional_breakpoint.png (Set conditional breakpoint)
+[26]: https://opensource.com/sites/default/files/uploads/gdb_output_print_variable.png (print variable)
+[27]: https://opensource.com/sites/default/files/uploads/gdb_output_modify_breakpoint.png (modify breakpoint)
+[28]: https://opensource.com/sites/default/files/uploads/gdb_output_syscall_catch.png (catch syscall write output)
+[29]: https://sourceware.org/gdb/current/onlinedocs/gdb/Breakpoints.html#Breakpoints
+[30]: https://opensource.com/sites/default/files/uploads/gdb_output_print_and_modify.png (print variable)
+[31]: https://opensource.com/sites/default/files/uploads/gdb_output_whatis.png (whatis output)
+[32]: https://opensource.com/sites/default/files/uploads/gdb_output_info_scope_main.png (info scope main output)
+[33]: https://opensource.com/sites/default/files/uploads/gdb_output_info_locals_main.png (info locals output)
+[34]: https://sourceware.org/gdb/current/onlinedocs/gdb/Symbols.html
+[35]: https://man7.org/linux/man-pages/man1/ps.1.html
+[36]: https://man7.org/linux/man-pages/man1/top.1.html
+[37]: https://opensource.com/sites/default/files/uploads/coredump_running.png (coredump application)
+[38]: https://opensource.com/sites/default/files/uploads/gdb_output_attaching_to_process.png (attach GDB to coredump)
+[39]: https://opensource.com/sites/default/files/uploads/gdb_output_backtrace.png (layout src and backtrace output)
+[40]: https://sourceware.org/gdb/current/onlinedocs/gdb/Attach.html#Attach
+[41]: https://opensource.com/sites/default/files/uploads/gdb_output_stackframe_up.png (moving up the stack to main.cpp)
+[42]: https://sourceware.org/gdb/current/onlinedocs/gdb/Stack.html#Stack
+[43]: https://ftp.gnu.org/old-gnu/Manuals/gdb/html_node/gdb_48.html#SEC49
+[44]: https://opensource.com/sites/default/files/uploads/crash.png (Crash meme)
+[45]: https://opensource.com/sites/default/files/uploads/gdb_output_coredump.png (coredump output)
+[46]: https://opensource.com/sites/default/files/uploads/gdb_output_up_five.png (up 5 output)
+[47]: https://en.wikipedia.org/wiki/Assembly_language
+[48]: https://opensource.com/sites/default/files/uploads/gdb_output_no_debugging_symbols.png (no debugging symbols)
+[49]: https://opensource.com/sites/default/files/uploads/gdb_output_info_file.png (info file output)
+[50]: https://opensource.com/sites/default/files/uploads/gdb_output_break_at_start.png (breakpoint at the entry point)
+[51]: https://en.wikipedia.org/wiki/X86_assembly_language#Syntax
+[52]: https://opensource.com/sites/default/files/uploads/gdb_output_disassembly_flavor.png (changing assembly flavor)
+[53]: https://opensource.com/sites/default/files/uploads/gdb_output_layout_reg_asm.png (layout asm and layout reg output)
+[54]: https://github.com/hANSIc99/core_dump_example/blob/master/gdbinit
+[55]: https://opensource.com/sites/default/files/uploads/gdb_output_asm_div_zero.png (continuing execution after crash)
+[56]: https://opensource.com/sites/default/files/uploads/gdb_output_stack_division.png (stack division output)
+[57]: https://en.wikipedia.org/wiki/Printf_format_string#Type_field
+[58]: https://opensource.com/sites/default/files/uploads/gdb_output_examine_1.png (print value)
+[59]: https://sourceware.org/gdb/current/onlinedocs/gdb/Memory.html
+[60]: https://en.wikipedia.org/wiki/Function_prologue
+[61]: https://opensource.com/sites/default/files/uploads/gdb_output_callstack_assembly_0.png (Callstack assembly)
+[62]: https://github.com/WebFreak001/code-debug
+[63]: https://opensource.com/sites/default/files/uploads/vs_codium_native_debug.png (GDB in VSCodium)
diff --git a/sources/tech/20210108 10 ways to advance your JavaScript journey in 2021.md b/sources/tech/20210108 10 ways to advance your JavaScript journey in 2021.md
new file mode 100644
index 0000000000..5a5fd1995b
--- /dev/null
+++ b/sources/tech/20210108 10 ways to advance your JavaScript journey in 2021.md
@@ -0,0 +1,91 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (10 ways to advance your JavaScript journey in 2021)
+[#]: via: (https://opensource.com/article/21/1/javascript)
+[#]: author: (James Farrell https://opensource.com/users/jamesf)
+
+10 ways to advance your JavaScript journey in 2021
+======
+JavaScript is a super-popular language, as evidenced by the 10 best
+JavaScript articles from 2020.
+![JavaScript in Vim][1]
+
+Opensource.com publishes a wealth of information on a wide range of technical topics. Everyone has their favorite subjects to learn about, yet stories about the various programming languages seem to be of special interest to our readers.
+
+JavaScript is undeniably a super-popular language. It is consistently among the top 10 most used and sought skills, especially since more than [90% of websites][2] use it in some capacity. The Node.js package manager [NPM][3] has more than 800,000 package offerings, further affirming JavaScript's popularity. Given this, I suspect many readers have some experience with this technology. Whether you're new to JavaScript or a seasoned user, Opensource.com has something relevant to you.
+
+### Reasons for JavaScript's popularity
+
+This year we saw a pair of introductory articles that I think give a nice explanation of JavaScript's popularity:
+
+ * _[How JavaScript became a serious programming language][4]_ by Nimisha Mukherjee gives a brief history of how JavaScript came to be, mentioning a bit of nostalgia that seasoned users will remember.
+
+ * Nimisha's follow up, [_4 reasons why JavaScript is so popular_][5], affirms the qualities that make JavaScript so successful: It caters to all skill levels, spans multiple platforms, has a great community, and supports a multitude of modern frameworks.
+
+
+
+
+### Tools and frameworks
+
+Two of JavaScript's defining qualities are the wealth of frameworks and tools available. Check out these articles for options that may help you start or improve your programming workflow.
+
+ * In [_9 open source JavaScript frameworks for front-end web development_][6], Bryant Son dives into some of JavaScript's heavy hitters. Well-known frameworks like Angular and ReactJS are there, along with a surprising number of others that are great to know about.
+
+ * If you are interested in ReactJS, Amit Dua's [_13 of the best React JavaScript frameworks_][7] offers a huge list of compatible frameworks to supercharge your application. Amit gives each framework a brief overview, including installation, initialization, and specific advantages.
+
+ * In [_10 ReactJS tools to boost your web development skills_][8], Prayaag Kasundra shares a plethora of useful tools to help you bootstrap, design, and organize your ReactJS projects. Prayaag suggests learning these "must-have" utilities to boost your potential value to employers.
+
+ * Hiren Dhadhuk summarizes his [_9 favorite open source tools for Node.js developers_][9]. Node.js is JavaScript's entry into server-side programming. Having direct control over both the frontend and backend helps streamline development productivity. This list of Node.js-specific productivity tools covers security, developer productivity, and build management.
+
+ * Tejas Kaneriya's [_My favorite 10 Node.js projects_][10] outlines essential tools that help with Node.js projects. These include editors, testing tools, style/linting processors, and application frameworks. There are some great tools here to consider, with VSCode and Electron being two of my favorites.
+
+ * In [_Use your favorite programming language to provision Infrastructure as Code_][11], Lee Briggs describes Pulumi, a cross-language Infrastructure as Code provisioning tool for creating project resources including containers and cloud services. Lee presents some basic provisioning examples centered around the TypeScript programming language.
+
+
+
+
+### New features and upgrades
+
+Last but not least is a pair of articles covering new JavaScript features and framework conversion.
+
+ * Sumaira Ahmad's [_Streamline your JavaScript code with top-level await_][12] introduces the concept of asynchronous event processing by explaining callbacks, promises, and async/await. It explores a new JavaScript feature called "top-level await" to support module-level asynchronous initialization. Sumaira also provides an example of using top-level await functionality to construct a simple news-reading app.
+
+ * Alex Vasylenko shares [_9 reasons I upgraded from AngularJS to Angular_][13]. Angular is a very popular framework with two active flavors: the original AngularJS and its more modern TypeScript successor, Angular. No (migration) pain, no gain—but the benefits to developers and end users seem well worth it.
+
+
+
+
+### What did we miss?
+
+It is clear from all of these lists that JavaScript has a rich and vibrant community of developers. Given the enormous number of projects and tools available, I'm sure we missed some gems. Comment below to share your ideas on what we should cover… or better yet, [write your own][14] article for Opensource.com to teach the rest of us about your favorite JavaScript tools, features, uses, and more!
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/1/javascript
+
+作者:[James Farrell][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/jamesf
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/javascript_vim.jpg?itok=mqkAeakO (JavaScript in Vim)
+[2]: https://w3techs.com/technologies/details/cp-javascript
+[3]: https://www.npmjs.com/
+[4]: https://opensource.com/article/20/10/history-javascript
+[5]: https://opensource.com/article/20/11/javascript-popular
+[6]: https://opensource.com/article/20/5/open-source-javascript-frameworks
+[7]: https://opensource.com/article/20/1/react-javascript-frameworks
+[8]: https://opensource.com/article/20/6/reactjs-tools
+[9]: https://opensource.com/article/20/1/open-source-tools-nodejs
+[10]: https://opensource.com/article/20/6/nodejs-projects
+[11]: https://opensource.com/article/20/8/infrastructure-as-code-pulumi
+[12]: https://opensource.com/article/20/11/top-level-await-javascript
+[13]: https://opensource.com/article/20/8/upgrade-angular
+[14]: https://opensource.com/how-submit-article
diff --git a/sources/tech/20210108 Java development on Fedora Linux.md b/sources/tech/20210108 Java development on Fedora Linux.md
new file mode 100644
index 0000000000..f2716aa2c7
--- /dev/null
+++ b/sources/tech/20210108 Java development on Fedora Linux.md
@@ -0,0 +1,194 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Java development on Fedora Linux)
+[#]: via: (https://fedoramagazine.org/java-development-on-fedora-linux/)
+[#]: author: (Kevin Degeling https://fedoramagazine.org/author/eonfge/)
+
+Java development on Fedora Linux
+======
+
+![][1]
+
+Photo by [Nao Triponez][2] from [Pexels][3]
+
+Java is a lot. Aside from being an island of Indonesia, it is a large software development ecosystem. Java was released in January 1996. It is approaching its 25th birthday and it’s still a popular platform for enterprise and casual software development. Many things, from banking to Minecraft, are powered by Java development.
+
+This article will guide you through all the individual components that make Java and how they interact. This article will also cover how Java is integrated in Fedora Linux and how you can manage different versions. Finally, a small demonstration using the game Shattered Pixel Dungeon is provided.
+
+### A birds-eye perspective of Java
+
+The following subsections present a quick recap of a few important parts of the Java ecosystem.
+
+#### The Java language
+
+Java is a strongly typed, object oriented, programming language. Its principle designer is James Gosling who worked at Sun, and Java was officially announced in 1995. Java’s design is strongly inspired by C and C++, but using a more streamlined syntax. Pointers are not present and parameters are passed-by-value. Integers and floats no longer have signed and unsigned variants, and more complex objects like Strings are part of the base definition.
+
+But that was 1995, and the language has seen its ups and downs in development. Between 2006 and 2014, no major releases were made, which led to stagnation and which opened up the market to competition. There are now multiple competing Java-esk languages like Scala, Clojure and Kotlin. A large part of ‘Java’ programming nowadays uses one of these alternative language specifications which focus on functional programming or cross-compilation.
+
+```
+// Java
+public class Hello {
+ public static void main(String[] args) {
+ println("Hello, world!");
+ }
+}
+
+// Scala
+object Hello {
+ def main(args: Array[String]) = {
+ println("Hello, world!")
+ }
+}
+
+// Clojure
+(defn -main
+ [& args]
+ (println "Hello, world!"))
+
+// Kotlin
+fun main(args: Array) {
+ println("Hello, world!")
+}
+```
+
+The choice is now yours. You can choose to use a modern version or you can opt for one of the alternative languages if they suit your style or business better.
+
+#### The Java platform
+
+Java isn’t just a language. It is also a virtual machine to run the language. It’s a C/C++ based application that takes the code, and executes it on the actual hardware. Aside from that, the platform is also a set of standard libraries which are included with the Java Virtual Machine (JVM) and which are written in the same language. These libraries contain logic for things like collections and linked lists, date-times, and security.
+
+And the ecosystem doesn’t stop there. There are also software repositories like Maven and Clojars which contain a considerable amount of usable third-party libraries. There are also special libraries aimed at certain languages, providing extra benefits when used together. Additionally, tools like Apache Maven, Sbt and Gradle allow you to compile, bundle and distribute the application you write. What is important is that this platform works with other languages. You can write your code in Scala and have it run side-by-side with Java code on the same platform.
+
+Last but not least, there is a special link between the Java platform and the Android world. You can compile Java and Kotlin for the Android platform to get additional libraries and tools to work with.
+
+#### License history
+
+Since 2006, the Java platform is licensed under the GPL 2.0 with a classpath-exception. This means that everybody can build their own Java platform; tools and libraries included. This makes the ecosystem very competitive. There are many competing tools for building, distribution, and development.
+
+Sun ‒ the original maintainer of Java ‒ was bought by Oracle in 2009. In 2017, Oracle changed the license terms of the Java package. This prompted multiple reputable software suppliers to create their own Java packaging chain. Red Hat, IBM, Amazon and SAP now have their own Java packages. They use the _OpenJDK_ trademark to distinguish their offering from Oracle’s version.
+
+It deserves special mention that the Java platform package provided by Oracle is not FLOSS. There are strict license restrictions to Oracle’s Java-trademarked platform. For the remainder of this article, _Java_ refers to the FLOSS edition ‒ _OpenJDK_.
+
+Finally, the [classpath-exception][4] deserves special mention. While the license is GPL 2.0, the classpath-exception allows you to write proprietary software using Java as long as you don’t change the platform itself. This puts the license somewhere in between the GPL 2.0 and the LGPL and it makes Java very suitable for enterprises and commercial activities.
+
+### Praxis
+
+If all of that seems quite a lot to take in, don’t panic. It’s 25 years of software history and there is a lot of competition. The following subsections demonstrate using Java on Fedora Linux.
+
+#### Running Java locally
+
+The default Fedora Workstation 33 installation includes OpenJDK 11. The open source code of the platform is bundled for Fedora Workstation by the Fedora Project’s package maintainers. To see for yourself, you can run the following:
+
+```
+$ java -version
+```
+
+Multiple versions of OpenJDK are available in Fedora Linux’s default repositories. They can be installed concurrently. Use the _alternatives_ command to select which installed version of OpenJDK should be used by default.
+
+```
+$ dnf search openjdk
+$ alternatives --config java
+```
+
+Also, if you have Podman installed, you can find most OpenJDK options by searching for them.
+
+```
+$ podman search openjdk
+```
+
+There are many options to run Java, both natively and in containers. Many other Linux distributions also come with OpenJDK out of the box. Pkgs.org has [a comprehensive list][5]. [GNOME Boxes][6] or [Virt Manager][7] will be your friend in that case.
+
+To get involved with the Fedora community directly, see their project [Wiki][8].
+
+#### Alternative configurations
+
+If the Java version you want is not available in the repositories, use [SDKMAN][9] to install Java in your home directory. It also allows you to switch between multiple installed versions and it comes with popular CLI tools like Ant, Maven, Gradle and Sbt.
+
+Last but not least, some vendors provide direct downloads for Java. Special mention goes to [AdoptOpenJDK][10] which is a collaborative effort among several major vendors to provide simple FLOSS packages and binaries.
+
+#### Graphical tools
+
+Several [integrated development environments][11] (IDEs) are available for Java. Some of the more popular IDEs include:
+
+ * **Eclipse**: This is free software published and maintained by the Eclipse Foundation. Install it directly from the Fedora Project’s repositories or from Flathub.
+ * **NetBeans**: This is free software published and maintained by the Apache foundation. Install it from their site or from Flathub.
+ * **IntelliJ IDEA**: This is proprietary software but it comes with a gratis community version. It is published by Jet Beans. Install it from their site or from Flathub.
+
+
+
+The above tools are themselves written in OpenJDK. They are examples of dogfooding.
+
+#### Demonstration
+
+The following demonstration uses [Shattered Pixel Dungeon][12] ‒ a Java based roque-like which is available on Android, Flathub and others.
+
+First, set up a development environment:
+
+```
+$ curl -s "https://get.sdkman.io" | bash
+$ source "$HOME/.sdkman/bin/sdkman-init.sh"
+$ sdk install gradle
+```
+
+Next, close your terminal window and open a new terminal window. Then run the following commands in the new window:
+
+```
+$ git clone https://github.com/00-Evan/shattered-pixel-dungeon.git
+$ cd shattered-pixel-dungeon
+$ gradle desktop:debug
+```
+
+![][13]
+
+Now, import the project in Eclipse. If Eclipse is not already installed, run the following command to install it:
+
+```
+$ sudo dnf install eclipe-jdt
+```
+
+Use _Import Projects from File System_ to add the code of Shattered Pixel Dungeon.
+
+![][14]
+
+As you can see in the imported resources on the top left, not only do you have the code of the project to look at, but you also have the OpenJDK available with all its resources and libraries.
+
+If this motivates you further, I would like to point you towards the [official documentation][15] from Shattered Pixel Dungeon. The Shattered Pixel Dungeon build system relies on Gradle which is an optional extra that you will have to [configure manually in Eclipse][16]. If you want to make an Android build, you will have to use Android Studio. Android Studio is a gratis, Google-branded version of IntelliJ IDEA.
+
+### Summary
+
+Developing with OpenJDK on Fedora Linux is a breeze. Fedora Linux provides some of the most powerful development tools available. Use Podman or Virt-Manager to easily and securely host server applications. OpenJDK provides a FLOSS means of creating applications that puts you in control of all the application’s components.
+
+_Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners._
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/java-development-on-fedora-linux/
+
+作者:[Kevin Degeling][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/eonfge/
+[b]: https://github.com/lujun9972
+[1]: https://fedoramagazine.org/wp-content/uploads/2021/01/java_development_on_fedora-3-816x345.jpg
+[2]: https://www.pexels.com/@natri
+[3]: https://www.pexels.com/photo/white-ceramic-coffee-cup-on-white-saucer-129207/
+[4]: https://www.gnu.org/software/classpath/license.html
+[5]: https://pkgs.org/search/?q=openjdk
+[6]: https://fedoramagazine.org/download-os-gnome-boxes/
+[7]: https://fedoramagazine.org/full-virtualization-system-on-fedora-workstation-30/
+[8]: https://fedoraproject.org/wiki/Java
+[9]: https://sdkman.io/
+[10]: https://adoptopenjdk.net/
+[11]: https://en.wikipedia.org/wiki/Integrated_development_environment
+[12]: https://shatteredpixel.com/shatteredpd/
+[13]: https://fedoramagazine.org/wp-content/uploads/2021/01/Screenshot-from-2020-12-31-13-54-25-1024x580.png
+[14]: https://fedoramagazine.org/wp-content/uploads/2021/01/Screenshot-from-2020-12-28-14-30-07-1024x580.png
+[15]: https://github.com/00-Evan/shattered-pixel-dungeon/blob/master/docs/getting-started-desktop.md
+[16]: https://projects.eclipse.org/projects/tools.buildship
diff --git a/sources/tech/20210108 The Definitive Guide to Using and Customizing the Dock in Ubuntu.md b/sources/tech/20210108 The Definitive Guide to Using and Customizing the Dock in Ubuntu.md
new file mode 100644
index 0000000000..9689098aec
--- /dev/null
+++ b/sources/tech/20210108 The Definitive Guide to Using and Customizing the Dock in Ubuntu.md
@@ -0,0 +1,245 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (The Definitive Guide to Using and Customizing the Dock in Ubuntu)
+[#]: via: (https://itsfoss.com/customize-ubuntu-dock/)
+[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
+
+The Definitive Guide to Using and Customizing the Dock in Ubuntu
+======
+
+When you log into Ubuntu, you’ll see the dock on the left side with some application icons on it. This dock (also known as launcher or sometimes as panel) allows you to quickly launch your frequently used programs.
+
+![][1]
+
+I rely heavily on the dock and I am going to share a few tips about using the dock effectively and customize its looks and position.
+
+You’ll learn the following in this tutorial:
+
+ * Basic usage of the dock: adding more applications and using shortcuts for launching applications.
+ * Customize the looks of the dock: Change the icon size, icon positions.
+ * Change the position: for single screen and multi-monitor setup
+ * Hide mounted disk from the dock
+ * Auto-hide or disable the dock
+ * Possibility of additional dock customization with dconf-editor
+ * Replace dock with other docking applications
+
+
+
+I’ll use the terms dock, panel and launcher in the tutorial. All of them refer to the same thing.
+
+### Using the Ubuntu dock: Absolute basic that you must know
+
+If you are new to Ubuntu, you should know a few things about using the dock. You’ll eventually discover these dock features, I’ll just speed up the discovery process for you.
+
+#### Add new applications to the dock (or remove them)
+
+The steps are simple. Search for the application from the menu and run it.
+
+The running application appears in the dock, below all other icons. Right click on it and select the “Add to Favorites” option. This will lock the icon to the dock.
+
+![Right-click on the icon and select “Add to Favorites”][2]
+
+Removing an app icon from the doc is even easier. You don’t even need to run the application. Simply right click on it and select “Remove From Favorites”.
+
+![Right-click on the icon and select “Remove from Favorites”][3]
+
+#### Reorder icon position
+
+By default, new application icons are added after all the other icons on the launcher. You don’t have to live with it as it is.
+
+To change the order of the icons, you just need to drag and drop to the other position of your choice. No need to “lock it” or any additional effort. It stays on that location until you make some changes again.
+
+![Reorder Icons On Ubuntu Docks][4]
+
+#### Right click to get additional options for some apps
+
+Left-clicking on an icon launches the application or bring it to focus if the application is already running.
+
+Right-clicking the icon gives you additional options. Different applications will have different options.
+
+For browsers, you can open a new private window or preview all the running windows.
+
+![][5]
+
+For file manager, you can go to all the bookmarked directories or preview opened windows.
+
+You can, of course, quit the application. Most applications will quit while some applications like Telegram will be minimized to the system tray.
+
+#### Use keyboard shortcut to launch applications quickly [Not many people know about this one]
+
+The dock allows you to launch an application in a single mouse click. But if you are like me, you can save that mouse click with a keyboard shortcut.
+
+Using the Super/Window key and a number key will launch the application on that position.
+
+![][6]
+
+If the application is already running, it is brought to focus, i.e. it appears in front of all the other running application windows.
+
+Since it is position-based, you should make sure that you don’t reorder the icons all the time. Personally, I keep Firefox at position 1, file manager at 2 and the alternate browser at 3 and so on until number 9. This way, I quickly launch the file manager with Super+2.
+
+I find it easier specially because I have a three screen setup and moving the mouse to the launcher on the first screen is a bit too much of trouble. You can enable or disable the dock on additional screen. I’ll show that to you later in this tutorial.
+
+### Change the position of the dock
+
+By default, the dock is located on the left side of your screen. Some people like the launcher at the bottom, in a more traditional way.
+
+Ubuntu allows you to change the position of the dock. You can move it to the bottom or to the right side or on the top. I am not sure many people actually put the dock on the top or the right side, so moving the dock to the top is not an option here.
+
+![Change Launcher Position][7]
+
+To change the dock position, go to Settings->Appearance. You should see some options under Dock section. You need to change the “Position on screen” settings here.
+
+![Go to Settings->Appearance->Dock][8]
+
+#### Position of dock on a multiple monitor setup
+
+If you have multiple screens attached to your system, you can choose whether to display the dock on all screens or one of chosen screens.
+
+![Ubuntu Dock Settings Multimonitor][9]
+
+Personally, I display the dock on my laptop screen only which is my main screen. This gives me maximum space on the additional two screens.
+
+### Change the appearance of the dock
+
+Let’s see some more dock customization options in Ubuntu.
+
+Imagine you added too many applications to the dock or have too many applications open. It will fill up the space and you’ll have to scroll to the top and bottom to go to the applications at end points.
+
+What you can do here is to change the icon size and the dock will now accommodate more icons. Don’t make it too small, though.
+
+![][10]
+
+To do that, go to Settings-> Appearance and change it by moving the slider under Icon size. The default icons size is 48 pixels.
+
+![Changing Icon Size In Ubuntu Dock][11]
+
+#### Hide mounted disks from the launcher
+
+If you plug in a USB disk or SD Card, it is mounted to the system, and an icon appear in the launcher immediately. This is helpful because you can right click on it and select safely remove drive option.
+
+![Mounted disks are displayed In the Ubuntu Dock][12]
+
+If you somehow find it troublesome, you can turn this feature off. Don’t worry, you can still access the mounted drives from the file manager.
+
+Open a terminal and use the following command:
+
+```
+gsettings set org.gnome.shell.extensions.dash-to-dock show-mounts false
+```
+
+The changes take into effect immediately. You won’t be bothered with mounted disk being displayed in the launcher.
+
+If you want the default behavior back, use this command:
+
+```
+gsettings set org.gnome.shell.extensions.dash-to-dock show-mounts true
+```
+
+### Change the behavior of dock
+
+Let’s customize the default behavior of the dock and make it more suitable to your needs.
+
+#### Enable minimize on click
+
+If you click on the icon of a running application, its window will be brought to focus. That’s fine. However, if you click on it, nothing happens. By default, clicking on the same icon won’t minimize the application.
+
+Well, this is the behavior in modern desktop, but I don’t like it. I prefer that the application is minimized when I click on its icon for the second time.
+
+If you are like me, you may want to [enable click to minimize option in Ubuntu][13]:
+
+To do that, open a terminal and enter the following command:
+
+```
+gsettings set org.gnome.shell.extensions.dash-to-dock click-action 'minimize'
+```
+
+#### Auto-hide Ubuntu dock and get more screen space
+
+If you want to utilize the maximum screen space, you can enable auto-hide option for the dock in Ubuntu.
+
+This will hide the dock, and you’ll get the entire screen. The dock is still accessible, though. Move your cursor to the location of the dock where it used to be, and it will appear again. When the dock reappears, it is overlaid on the running application window. And that’s a good thing otherwise too many elements would start moving on the screen.
+
+The auto-hide option is available in Settings-> Appearance and under Dock section. Just toggle it.
+
+![Auto-hide the dock][14]
+
+If you don’t like this behavior, you can enable it again the same way.
+
+#### Disable Ubuntu dock
+
+Auto-hide option is good enough for many people, but some users simply don’t like the dock. If you are one of those users, you also have the option to disable the Ubuntu dock entirely.
+
+Starting with Ubuntu 20.04, you have the Extensions application available at your disposal to [manage GNOME Extensions][15].
+
+![Look for Extensions app in the menu][16]
+
+With this Extensions application, you can easily disable or re-enable the dock.
+
+![Disable Ubuntu Dock][17]
+
+### Advanced dock customization with dconf-editor [Not recommended]
+
+##### Warning
+
+The dconf-editor allows you to change almost every aspect of the GNOME desktop environment. This is both good and bad because you must be careful in editing. Most of the settings can be changed on the fly, without asking for conformation. While you may reset the changes, you could still put your system in such a state that it would be difficult to put things back in order.
+
+For this reason, I advise not to play with dconf-editor, specially if you don’t like spending time in troubleshooting and fixing problems or if you are not too familiar with Linux and GNOME.
+
+The [dconf editor][18] gives you additional options to customize the dock in Ubuntu. Install it from the software center and then navigate to org > gnome > shell > extensions > dash-to-dock. You’ll find plenty of options here. I cannot even list them all here.
+
+![][19]
+
+### Replace the dock in Ubuntu
+
+There are several third-party dock applications available for Ubuntu and other Linux distributions. You can install a dock of your choice and use it.
+
+For example, you can install Plank dock from the software center and use it in similar fashion to Ubuntu dock.
+
+![Plank Dock in Ubuntu][20]
+
+Disabling Ubuntu Dock would be a better idea in this case. It won’t be wise to use multiple docks at the same time.
+
+### Conclusion
+
+This tutorial is about customizing the default dock or launcher provided in Ubuntu’s GNOME implementation. Some suggestions should work on the dock in vanilla GNOME as work well.
+
+I have shown you most of the common Ubuntu dock customization. You don’t need to go and blindly follow all of them. Read and think which one suits your need and then act upon it.
+
+Was it too trivial or did you learn something new? Would you like to see more such tutorials? I welcome your suggestions and feedback on dock customization.
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/customize-ubuntu-dock/
+
+作者:[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/2021/01/ubuntu-dock.png?resize=800%2C450&ssl=1
+[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/add-icons-to-dock.png?resize=800%2C450&ssl=1
+[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/remove-icons-from-dock.png?resize=800%2C450&ssl=1
+[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/reorder-icons-on-ubuntu-docks.gif?resize=800%2C430&ssl=1
+[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/right-click-icons-ubuntu-dock.png?resize=800%2C450&ssl=1
+[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/keyboard-shortcut-for-ubuntu-dock.png?resize=800%2C450&ssl=1
+[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/change-launcher-position-ubuntu.png?resize=800%2C450&ssl=1
+[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/change-dock-position-ubuntu.png?resize=800%2C450&ssl=1
+[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/ubuntu-dock-settings-multimonitor.png?resize=800%2C450&ssl=1
+[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/normal-icon-size-dock.jpg?resize=1024%2C1080&ssl=1
+[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/changing-icon-size-in-ubuntu-dock.png?resize=800%2C450&ssl=1
+[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/external-mounted-disks-in-ubuntu-dock.png?resize=800%2C450&ssl=1
+[13]: https://itsfoss.com/click-to-minimize-ubuntu/
+[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/autohide-dock-ubuntu.png?resize=800%2C450&ssl=1
+[15]: https://itsfoss.com/gnome-shell-extensions/
+[16]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/GNOME-extensions-app-ubuntu.jpg?resize=800%2C240&ssl=1
+[17]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/disable-dock-ubuntu.png?resize=800%2C450&ssl=1
+[18]: https://wiki.gnome.org/Apps/DconfEditor
+[19]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/dconf-editor-dock.png?resize=592%2C599&ssl=1
+[20]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/plank-dock-Ubuntu.jpg?resize=800%2C382&ssl=1
diff --git a/sources/tech/20210108 Why I like the FED text editor.md b/sources/tech/20210108 Why I like the FED text editor.md
new file mode 100644
index 0000000000..1e957555fa
--- /dev/null
+++ b/sources/tech/20210108 Why I like the FED text editor.md
@@ -0,0 +1,72 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Why I like the FED text editor)
+[#]: via: (https://opensource.com/article/21/1/fed-editor)
+[#]: author: (Jim Hall https://opensource.com/users/jim-hall)
+
+Why I like the FED text editor
+======
+The FED editor lets me code my FreeDOS projects easily and efficiently.
+Learn to make the most of this flexible Linux, Windows, and DOS editor.
+![Person using a laptop][1]
+
+When I’m not [at work on my Linux desktop][2], you can usually find me writing code for a legacy 16-bit system. [FreeDOS][3] is an open source DOS-compatible operating system that you can use to play classic DOS games, run legacy business software, or develop embedded systems. Any program that works on MS-DOS should also run on FreeDOS.
+
+I grew up with DOS. My family’s first personal computer was an Apple II clone, but we eventually upgraded to an IBM PC running DOS. I was a DOS user for over ten years, from the early 1980s until 1993, when I [discovered Linux][4].
+
+I was impressed by the freedom afforded by Linux and open source software. So when Microsoft announced the end of DOS in 1994, with the forthcoming Windows 95, I decided to write my own open source DOS. That’s [how FreeDOS started][4].
+
+All these years later, and I continue working on FreeDOS. It is an excellent hobby system, where I can run my favorite DOS applications and games. And yes, I still write code for FreeDOS.
+
+My favorite editor for DOS programming is the FED editor. FED is a minimal text editor without a lot of visual flair. This minimal approach helps me make the most of the standard 80x25 screen in DOS. When editing a file, FED displays a single status line at the bottom of the screen, leaving you the remaining 24 lines to write your code. FED also supports color syntax highlighting to display different parts of your code in various colors, making it easier to spot typos before they become bugs.
+
+![Writing a Solitaire game with FED][5]
+
+Writing a Solitaire game with FED - opensource.com
+
+When you need to do something in the menus, press the **Alt** key on the keyboard, and FED displays a menu on the top line. FED supports keyboard shortcuts too, but be careful about the defaults. For example, **Ctrl-C** will close a file, and **Ctrl-V** will change the view. If you don’t like these default keys, you can change the key mapping in the **Config** menu.
+
+![Tap the Alt key to bring up the menu][6]
+
+Tap the Alt key to bring up the menu - opensource.com
+
+If you don’t like the default black-on-white text display, you can change the colors under the **Config** menu. I prefer white-on-blue for my main text, with keywords in bright white, comments in bright blue, special characters in cyan, and numbers in green. FED makes it easy to set the colors you want.
+
+![My preferred colors when programming on DOS][7]
+
+My preferred colors when programming on DOS - opensource.com
+
+FED is also a folding text editor, which means that it can collapse or expand portions of my code so that I can see more of my file. Tap **Ctrl-F** on a function name and FED will collapse the entire function. Folding works on other code, as well. I also use folding to hide **for** and **while** loops or other flow controls like **if** and **switch** blocks.
+
+![Folding a function lets you see more of the file][8]
+
+Folding a function lets you see more of the file - opensource.com
+
+Shawn Hargreaves wrote and maintained FED from 1994 to 2004. Robert Riebisch has maintained FED since then. FED is distributed under the GNU GPL and supports DOS, Linux, and Windows.
+
+You can download FED at
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/1/fed-editor
+
+作者:[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/laptop_screen_desk_work_chat_text.png?itok=UXqIDRDD (Person using a laptop)
+[2]: https://opensource.com/article/19/9/business-creators-open-source-tools
+[3]: https://opensource.com/article/19/6/freedos-anniversary
+[4]: https://opensource.com/article/17/5/how-i-got-started-linux-jim-hall-freedos
+[5]: https://opensource.com/sites/default/files/1-fed.png
+[6]: https://opensource.com/sites/default/files/2-fed.png
+[7]: https://opensource.com/sites/default/files/3-fed.png
+[8]: https://opensource.com/sites/default/files/4-fed.png
diff --git a/sources/tech/20210109 Homura- A WINE-based Game Launcher for BSD.md b/sources/tech/20210109 Homura- A WINE-based Game Launcher for BSD.md
new file mode 100644
index 0000000000..c896034c08
--- /dev/null
+++ b/sources/tech/20210109 Homura- A WINE-based Game Launcher for BSD.md
@@ -0,0 +1,120 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Homura: A WINE-based Game Launcher for BSD)
+[#]: via: (https://itsfoss.com/homura-game-launcher-bsd/)
+[#]: author: (John Paul https://itsfoss.com/author/john/)
+
+Homura: A WINE-based Game Launcher for BSD
+======
+
+BSD isn’t just for servers. People use it for desktop as well and perform common tasks including casual gaming. To help make that possible, we are going to look at an app that allows you to run Windows games on FreeBSD.
+
+### What is Homura?
+
+![][1]
+
+[Homura][2] is a tool that allows you to play Windows games on FreeBSD. It was inspired by [Lutris][3]. It allows you to install and manage several Windows game and game store launchers. It mainly uses Wine, but also comes with a number of fixes and workarounds to get the games working.
+
+Homura’s creator, [Alexander Vereeken][4], said that he created the application because “when I started using FreeBSD, there was no useful utility to set up games or launcher in wine, so I created one myself.” At the time, Wine was the only option. The Linux version of Steam did not exist.
+
+![Homura install list][5]
+
+Here is a list of the things you can install with Homura:
+
+ * Anarchy Online
+ * Arc
+ * Bethesda launcher
+ * Blizzard launcher
+ * Diablo II
+ * Discord
+ * Drakensang Online
+ * GOG
+
+
+ * Growtopia
+ * League of Legends
+ * Origin launcher
+ * PokeMMO
+ * Pokemon Uranium
+ * RuneScape
+ * Steam
+
+
+ * Subway Surfers
+ * Teamspeak
+ * Tropix 2
+ * UC Browser
+ * Uplay
+ * Wargaming Game Center
+ * Itch.io
+
+
+
+Homura is named after a character in an anime named [Madoka Magica][6]. It was originally hosted on GitHub before the creator moved to GitLab. It is currently hosted on Codeberg. Hopefully, it will stay there for now.
+
+![Homura][7]
+
+### Installing Homura Game Launcher on BSD
+
+You can install Homura from the FreeBSD repo with this command:
+
+```
+pkg install games/homura
+```
+
+You can also build and install it from the ports collection using this command.
+
+```
+cd /usr/ports/games/homura/ && make install clean
+```
+
+Once it is installed, you can run Homura by selecting it from the menu or typing `Homura` in the command line. (The name must be capitalized in the terminal or it will not work.)
+
+If you install Steam via Homura, you need to launch it from Homura. If you launch it from the operating system’s menu, it won’t display currently.
+
+Steam’s library and store tabs are displayed by a built-in web browser. For some reason, that does not work on FreeBSD. But if you launch Steam from Homura’s menu, it will use a list mode that works without issue.
+
+### Experience
+
+I installed Homura on GhostBSD and used it to install Steam. Afterward, I installed a couple of games to test it out. Not all of the games I tried worked, mainly because they tried to use or install a Windows-specific piece of software that was unavailable. However, I was able to play one of my favorite games, Microsoft’s Rise of Nations, without any issue. (My test turned into a couple of hours of gameplay.)
+
+![Homura Main Menu][8]
+
+I also tried to install the GOG launcher. For some reason, it didn’t work for me. The loading screen would pop up and nothing would happen. I’m planning to file an issue. I didn’t test any of the installer/launchers because I don’t use them.
+
+### Final Thoughts
+
+Not everything worked smoothly with Homura, but I could play some of my favorite games.
+
+![Rise of Nation on BSD][9]
+
+This app is the classic case of a user who had a need and decided to fill it. In doing so, he makes life easier for others. Hopefully, this application will make it a little easier for people to start using FreeBSD as their operating system.
+
+If you found this article interesting, please take a minute to share it on social media, Hacker News, or [Reddit][10].
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/homura-game-launcher-bsd/
+
+作者:[John Paul][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/john/
+[b]: https://github.com/lujun9972
+[1]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/homura.jpg?resize=800%2C450&ssl=1
+[2]: https://codeberg.org/Alexander88207/Homura
+[3]: https://lutris.net/
+[4]: https://codeberg.org/Alexander88207
+[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/homura-install.jpg?resize=800%2C421&ssl=1
+[6]: https://madoka.fandom.com/wiki/Puella_Magi_Madoka_Magica
+[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/homura-about.jpg?resize=800%2C411&ssl=1
+[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/homura-main-menu.jpg?resize=500%2C776&ssl=1
+[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/rise-of-nation-bsd.jpg?resize=800%2C450&ssl=1
+[10]: https://%0Areddit.com/r/linuxusersgroup
diff --git a/translated/tech/20201224 5 reasons to use the Atom text editor.md b/translated/tech/20201224 5 reasons to use the Atom text editor.md
new file mode 100644
index 0000000000..cf0b97a9d1
--- /dev/null
+++ b/translated/tech/20201224 5 reasons to use the Atom text editor.md
@@ -0,0 +1,122 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (5 reasons to use the Atom text editor)
+[#]: via: (https://opensource.com/article/20/12/atom)
+[#]: author: (Seth Kenlon https://opensource.com/users/seth)
+
+使用 Atom 文本编辑器的 5 个理由
+======
+Atom 是一个全面的环境,可以完成从基本到复杂的任务,适合从初学者到老用户。
+![Science lab with beakers][1]
+
+现在漂亮的开源文本编辑器很常见,有 Adobe 的 [Brackets][2]、微软的 [VSCode][3] 和 GitHub 的 [Atom][4]。这些似乎都提供了类似的体验:现代化的界面、易于安装的插件,以及一个大品牌赞助商。而且它们其实都很不错。那么是什么让 Atom 与其他超现代的文本编辑器不同呢?或与经典的老式编辑器如 [Vim][5] 或 [Emacs][6] 有所不同?
+
+![Atom terminal with white text on dark grey background][7]
+
+我用过很多文本编辑器,并且经过反思,我不得不承认,只要你见过一个文本编辑器,基本上就见过所有的文本编辑器。在判断一个编辑器的功效时,只要它能做一件事:编辑文字,就能满足 80% 的要求。另外的 20% 则是额外的便利、额外的小玩意和花哨的功能。它们是很好的东西,但几乎不是必不可少的。
+
+不过我经常回到 Atom,因为作为一个开源的用户,我可以奢侈地使用一个应用,只是因为我可以。以下是我喜欢 Atom 的原因。
+
+### 新手友好
+
+我最喜欢 Atom 的一点是,它让人感觉很“普通”。我可以把 Atom 安装在任何人的电脑上,他们很快就可以开始打字。没有新的键盘快捷键需要学习,没有严重偏离用户界面的惯例。如果我花几分钟时间向他们展示一些应用的强大功能,那么他们很快就会有能力安装新的插件,发现他们喜欢的有用功能。
+
+它只是足够不同,让人觉得独特,但又足够“安全”让人马上相信他们可以使用它。这是一条很难走的路线,但 Atom 做到了,我很欣赏它。
+
+### 强大的扩展
+
+当你启动应用就已经满足了大多数需求时,“推销”一个开源文本编辑器的一个主要因素就是它的扩展。我习惯使用的编辑器是 [GNU Emacs][8],它的扩展功能多到令人瞠目结舌,可以提供从电子邮件客户端到视频游戏的所有功能。这是一个很难超越的行为,说实话,我还没有看到能做到的编辑器。不过这说明了扩展是多么重要,Atom 有一套不错的插件。
+
+有一些扩展可以为语言和格式添加语法高亮、添加动态层叠、以及集成调试器、运行时环境、视频和音乐播放器控件等等。
+你几乎可以让 Atom 成为你桌面的控制中心,所以你很少需要离开它。
+
+### 语言和语法支持
+
+我是 [Docbook][9] 的忠实粉丝。同时也是它的简化前端 Asciidoc 的粉丝。当我评估一个编辑器时,Docbook 模式和 Asciidoc 支持是我的两个主要指标。虽然 XML 支持比较常见,但与特定模式的集成可能是一个高难度的任务,而且 Asciidoc 还比较晦涩。Atom 的社区为我最喜欢的格式提供了很好的支持。
+
+当然,我已经提到了 Atom 一般来说有很好的扩展,但无论你在输入什么语言,语法高亮都是一个重要的功能。再次感谢充满活力的社区,在 Atom 的软件包仓库中,语法高亮选项的多样性是最好的之一。
+
+### 简单定制主题
+
+Atom 让你生成自己的风格就像设计网站的风格一样简单,所以如果你会使用 CSS,你可以制作你自己的 Atom 主题。要创建你自己的主题,找到 **Package** 菜单。如果你没有看到 **Package** 菜单,先按 **Alt** 键,露出顶部菜单栏。在 **Package** 菜单中,将鼠标悬停在 **Package Generator** 上,然后选择 **Generate Atom Syntax Theme**。这将打开一个新的项目,默认名为 _my-theme-syntax_。你可以把它命名为任何你想要的名字,但根据 Atom 惯例,它应该以 `-syntax` 结尾。
+
+在你的新主题项目中,找到这些文件。 `base.less`、`colors.less` 和 `syntax-variables.less`。这些文件定义了当你的语法激活时,特殊的关键字,甚至是背景和前景的颜色是如何显示的。因为它们都是从一个通用模板中继承的值,所以很容易修改。比如说:
+
+
+```
+// Syntax styles
+
+.syntax--comment {
+ color: @light-gray;
+}
+
+.syntax--keyword {
+ color: @purple;
+
+ &.syntax--control {
+ color: @purple;
+ }
+
+ &.syntax--operator {
+ color: @syntax-text-color;
+ }
+
+ &.syntax--other.syntax--special-method {
+ color: @blue;
+ }
+
+ &.syntax--other.syntax--unit {
+ color: @orange;
+ }
+}
+```
+
+以两个破折号结尾的值,如 `.syntax--keyword`,是语法高亮引擎识别的对象。当然,如果你想进一步开发你的自定义,你甚至可以创建你自己的语法定义(尽管这比 CSS 主题更费劲)。在 [flight-manual.atom.io][10] 阅读所有关于修改 Atom 的方法。
+
+### 灵活的工作流
+
+Atom 有很多功能,只有其中的一个子集是默认激活的。这意味着你可以决定你喜欢的工作方式,是激活新的扩展并使用它们从根本上改变 Atom,还是只打开 Atom 的偏好并进行小的调整。你可以用 Atom 来写一本小说书,也可以用它来写 Python 代码或技术文档或其他任何东西。
+
+即使是它的 Git 集成也没有坚持你可能会想到的显而易见的仓库(Github 赞助了 Atom)。它没有任何限制,而且它对每个人都同样有用,不管受众是谁。
+
+## 安装
+
+在 Linux、Windows 和 macOS 上,你可以[从它的网站安装 Atom][11]。
+
+另外,在 Linux 上,你可以从 [Flathub][12] 中,以 Flatpak 安装 Atom。
+
+如果你想自己构建 Atom,你也可以[从 Github 上的源码编译它][13]。
+
+## 尝试 Atom
+
+Atom 可以成为你的下一个文本编辑器、记事本和 IDE。它易于使用、易于配置、易于扩展,并提供了良好的用户体验。今天就下载 Atom,试试吧。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/12/atom
+
+作者:[Seth Kenlon][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/seth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/science_experiment_beaker_lab.png?itok=plKWRhlU (Science lab with beakers)
+[2]: https://opensource.com/article/20/12/brackets
+[3]: https://opensource.com/article/20/12/%C2%A0https://opensource.com/article/20/6/open-source-alternatives-vs-code
+[4]: https://opensource.com/article/17/5/atom-text-editor-packages-writers
+[5]: https://opensource.com/article/20/12/vi-text-editor
+[6]: https://opensource.com/article/20/12/emacs
+[7]: https://opensource.com/sites/default/files/uploads/atom-31_days-atom-opensource.png (Atom terminal with white text on dark grey background)
+[8]: https://opensource.com/article/20/2/who-cares-about-emacs
+[9]: https://opensource.com/article/17/9/docbook
+[10]: https://flight-manual.atom.io/
+[11]: https://atom.io
+[12]: https://flathub.org/apps/details/io.atom.Atom
+[13]: https://github.com/atom