diff --git a/published/20210101 Djinn- A Code Generator and Templating Language Inspired by Jinja2.md b/published/20210101 Djinn- A Code Generator and Templating Language Inspired by Jinja2.md
new file mode 100644
index 0000000000..e4fac67c25
--- /dev/null
+++ b/published/20210101 Djinn- A Code Generator and Templating Language Inspired by Jinja2.md
@@ -0,0 +1,267 @@
+[#]: collector: (lujun9972)
+[#]: translator: (hanszhao80)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-14792-1.html)
+[#]: subject: (Djinn: A Code Generator and Templating Language Inspired by Jinja2)
+[#]: via: (https://theartofmachinery.com/2021/01/01/djinn.html)
+[#]: author: (Simon Arneaud https://theartofmachinery.com)
+
+Djinn:一个受 Jinja2 启发的代码生成器和模板语言
+======
+
+
+
+代码生成器是非常有用的工具。我有时使用 [jinja2][1] 的命令行版本来生成高度冗余的配置文件和其他文本文件,但它在转换数据方面功能有限。显然,Jinja2 的作者有不同的想法,而我想要类似于 列表推导 或 D 语言的 可组合范围 算法之类的东西。
+
+我决定制作一个类似于 Jinja2 的工具,但让我可以通过使用范围算法转换数据来生成复杂的文件。这个想法非常简单:一个直接用 D 语言代码重写的模板语言。因为它 _就是_ D 语言,它可以支持 D 语言所能做的一切。我想要一个独立的代码生成器,但是由于 [D 语言的 `mixin` 特性][2],同样的模板语言可以作为嵌入式模板语言工作(例如,Web 应用程序中的 HTML)。有关该技巧的更多信息,请参阅 [这篇关于在编译时使用 mixins 将 Brainfuck 转换为 D 和机器代码的文章][3]。
+
+像往常一样,[源码在 GitLab 上][4]。[这篇文章中的例子也可以在这里找到][5]。
+
+### Hello world 示例
+
+这是一个演示这个想法的例子:
+
+```
+Hello [= retro("dlrow") ]!
+[: enum one = 1; :]
+1 + 1 = [= one + one ]
+```
+
+`[= some_expression ]` 类似于 Jinja2 中的 `{{ some_expression }}`,它在输出中呈现一个值。`[: some_statement; :]` 类似于 `{% some_statement %}` ,用于执行完整的代码语句。我更改了语法,因为 D 也大量使用花括号,并且将两者混合使模板难以阅读(还有一些特殊的非 D 指令,比如 `include`,它们被包裹在 `[<` 和 `>]` 中)。
+
+如果你将上面的内容保存到一个名为 `hello.txt.dj` 的文件中并运行 `djinn` 命令行工具,你会得到一个名为 `hello.txt` 的文件,其中包含你可能猜到的内容:
+
+```
+Hello world!
+1 + 1 = 2
+```
+
+如果你使用过 Jinja2,你可能想知道第二行发生了什么。Djinn 有一个简化格式化和空格处理的特殊规则:如果源代码行包含 `[:` 语句或 `[<` 指令但不包含任何非空格输出,则整行都会被忽略输出。空行则仍会原样呈现。
+
+### 生成数据
+
+好的,现在来讲一些更实用的东西:生成 CSV 数据。
+
+```
+x,f(x)
+[: import std.mathspecial;
+foreach (x; iota(-1.0, 1.0, 0.1)) :]
+[= "%0.1f,%g", x, normalDistribution(x) ]
+```
+
+一个 `[=` 和 `]` 对可以包含多个用逗号分隔的表达式。如果第一个表达式是一个由双引号包裹的字符串,则会被解释为 [格式化字符串][6]。下面是输出结果:
+
+```
+x,f(x)
+-1.0,0.158655
+-0.9,0.18406
+-0.8,0.211855
+-0.7,0.241964
+-0.6,0.274253
+-0.5,0.308538
+-0.4,0.344578
+-0.3,0.382089
+-0.2,0.42074
+-0.1,0.460172
+0.0,0.5
+0.1,0.539828
+0.2,0.57926
+0.3,0.617911
+0.4,0.655422
+0.5,0.691462
+0.6,0.725747
+0.7,0.758036
+0.8,0.788145
+0.9,0.81594
+```
+
+### 制作图片
+
+这个例子展示了一个图片的生成过程。[经典的 Netpbm 图像库定义了一堆图像格式][7],其中一些是基于文本的。例如,这是一个 3 x 3 向量的图像:
+
+```
+P2 # PGM 格式标识
+3 3 # 宽和高
+7 # 代表纯白色的值(0 代表黑色)
+7 0 7
+0 0 0
+7 0 7
+```
+
+你可以将上述文本保存到名为 `cross.pgm` 之类的文件中,很多图像工具都知道如何解析它。下面是一些 Djinn 代码,它以相同的格式生成 [Mandelbrot 集][8] 分形:
+
+```
+[:
+import std.complex;
+enum W = 640;
+enum H = 480;
+enum kMaxIter = 20;
+ubyte mb(uint x, uint y)
+{
+ const c = complex(3.0 * (x - W / 1.5) / W, 2.0 * (y - H / 2.0) / H);
+ auto z = complex(0.0);
+ ubyte ret = kMaxIter;
+ while (abs(z) <= 2 && --ret) z = z * z + c;
+ return ret;
+}
+:]
+P2
+[= W ] [= H ]
+[= kMaxIter ]
+[: foreach (y; 0..H) :]
+[= "%(%s %)", iota(W).map!(x => mb(x, y)) ]
+```
+
+生成的文件大约为 800 kB,但它可以很好地被压缩为 PNG:
+
+```
+$ # 使用 GraphicsMagick 进行转换
+$ gm convert mandelbrot.pgm mandelbrot.png
+```
+
+结果如下:
+
+![][9]
+
+### 解决谜题
+
+这里有一个谜题:
+
+![][10]
+
+一个 5 行 5 列的网格需要用 1 到 5 的数字填充,每个数字在每一行中限使用一次,在每列中限使用一次(即,制作一个 5 行 5 列的拉丁方格)。相邻单元格中的数字还必须满足所有 `>` 大于号表示的不等式。
+
+[几个月前我使用了 线性规划(LP)][11]。线性规划问题是具有线性约束的连续变量系统。这次我将使用混合整数线性规划(MILP),它通过允许整数约束变量来归纳 LP。事实证明,这足以成为 NP 完备的,而 MILP 恰好可以很好地模拟这个谜题。
+
+在上一篇文章中,我使用 Julia 库 JuMP 来帮助解决这个问题。这次我将使用 [CPLEX:基于文本的格式][12],它受到多个 LP 和 MILP 求解器的支持(如果需要,可以通过现成的工具轻松转换为其他格式)。这是上一篇文章中 CPLEX 格式的 LP:
+
+```
+Minimize
+ obj: v
+Subject To
+ ptotal: pr + pp + ps = 1
+ rock: 4 ps - 5 pp - v <= 0
+ paper: 5 pr - 8 ps - v <= 0
+ scissors: 8 pp - 4 pr - v <= 0
+Bounds
+ 0 <= pr <= 1
+ 0 <= pp <= 1
+ 0 <= ps <= 1
+End
+```
+
+CPLEX 格式易于阅读,但复杂度高的问题需要大量变量和约束来建模,这使得手工编码既痛苦又容易出错。有一些特定领域的语言,例如 [ZIMPL][13],用于以高级方式描述 MILP 和 LP。对于许多问题来说,它们非常酷,但最终它们不如具有良好库(如 JuMP)支持的通用语言或使用 D 语言的代码生成器那样富有表现力。
+
+我将使用两组变量来模拟这个谜题:`v_{r,c}` 和 `i_{r,c,v}`。`v_{r,c}` 将保存 r 行 c 列单元格的值(从 1 到 5)。`i_{r,c,v}` 是一个二进制指示器,如果 r 行 c 列的单元格的值是 v,则该指示器值为 1,否则为 0。这两组变量是网格的冗余表示,但第一种表示更容易对不等式约束进行建模,而第二种表示更容易对唯一性约束进行建模。我只需要添加一些额外的约束来强制这两个表示是一致的。但首先,让我们从每个单元格必须只有一个值的基本约束开始。从数学上讲,这意味着给定行和列的所有指示器都必须为 0,但只有一个值为 1 的例外。这可以通过以下等式强制约束:
+
+```
+[i_{r,c,1} + i_{r,c,2} + i_{r,c,3} + i_{r,c,4} + i_{r,c,5} = 1]
+```
+
+可以使用以下 Djinn 代码生成对所有行和列的 CPLEX 约束:
+
+```
+\ 单元格只有一个值
+[:
+foreach (r; iota(N))
+foreach (c; iota(N))
+:]
+ [= "%-(%s + %)", vs.map!(v => ivar(r, c, v)) ] = 1
+[::]
+```
+
+`ivar()` 是一个辅助函数,它为我们提供变量名为 `i` 的字符串标识符,而 `vs` 存储从 1 到 5 的数字以方便使用。行和列内唯一性的约束完全相同,但在 `i` 的其他两个维度上迭代。
+
+为了使变量组 `i` 与变量组 `v` 保持一致,我们需要如下约束(请记住,变量组 `i` 中只有一个元素的值是非零的):
+
+```
+[i_{r,c,1} + 2i_{r,c,2} + 3i_{r,c,3} + 4i_{r,c,4} + 5i_{r,c,5} = v_{r,c}]
+```
+
+CPLEX 要求所有变量都位于左侧,因此 Djinn 代码如下所示:
+
+```
+\ 连接变量组 i 和变量组 v
+[:
+foreach (r; iota(N))
+foreach (c; iota(N))
+:]
+ [= "%-(%s + %)", vs.map!(v => text(v, ' ', ivar(r, c, v))) ] - [= vvar(r,c) ] = 0
+[::]
+```
+
+不等符号相邻的和左下角值为为 4 单元格的约束写起来都很简单。剩下的便是将指示器变量声明为二进制,并为变量组 `v` 设置边界。加上变量的边界,总共有 150 个变量和 111 个约束 [你可以在仓库中看到完整的代码][14]。
+
+[GNU 线性规划工具集][15] 有一个命令行工具可以解决这个 CPLEX MILP。不幸的是,它的输出是一个包含了所有内容的体积很大的转储,所以我使用 awk 命令来提取需要的内容:
+
+```
+$ time glpsol --lp inequality.lp -o /dev/stdout | awk '/v[0-9][0-9]/ { print $2, $4 }' | sort
+v00 1
+v01 3
+v02 2
+v03 5
+v04 4
+v10 2
+v11 5
+v12 4
+v13 1
+v14 3
+v20 3
+v21 1
+v22 5
+v23 4
+v24 2
+v30 5
+v31 4
+v32 3
+v33 2
+v34 1
+v40 4
+v41 2
+v42 1
+v43 3
+v44 5
+
+real 0m0.114s
+user 0m0.106s
+sys 0m0.005s
+```
+
+这是在原始网格中写出的解决方案:
+
+![][16]
+
+这些例子只是用来玩的,但我相信你已经明白了。顺便说一下,Djinn 代码仓库的 `README.md` 文件本身是使用 Djinn 模板生成的。
+
+正如我所说,Djinn 也可以用作嵌入在 D 语言代码中的编译期模板语言。我最初只是想要一个代码生成器,得益于 D 语言的元编程功能,这算是一个额外获得的功能。
+
+--------------------------------------------------------------------------------
+
+via: https://theartofmachinery.com/2021/01/01/djinn.html
+
+作者:[Simon Arneaud][a]
+选题:[lujun9972][b]
+译者:[hanszhao80](https://github.com/hanszhao80)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://theartofmachinery.com
+[b]: https://github.com/lujun9972
+[1]: https://jinja2docs.readthedocs.io/en/stable/
+[2]: https://dlang.org/articles/mixin.html
+[3]: https://theartofmachinery.com/2017/12/31/compile_time_brainfuck.html
+[4]: https://gitlab.com/sarneaud/djinn
+[5]: https://gitlab.com/sarneaud/djinn/-/tree/v0.1.0/examples
+[6]: https://dlang.org/phobos/std_format.html#format-string
+[7]: http://netpbm.sourceforge.net/doc/#formats
+[8]: https://en.wikipedia.org/wiki/Mandelbrot_set
+[9]: https://theartofmachinery.com/images/djinn/mandelbrot.png
+[10]: https://theartofmachinery.com/images/djinn/inequality.svg
+[11]: https://theartofmachinery.com/2020/05/21/glico_weighted_rock_paper_scissors.html
+[12]: http://lpsolve.sourceforge.net/5.0/CPLEX-format.htm
+[13]: https://zimpl.zib.de/
+[14]: https://gitlab.com/sarneaud/djinn/-/tree/v0.1.0/examples/inequality.lp.dj
+[15]: https://www.gnu.org/software/glpk/
+[16]: https://theartofmachinery.com/images/djinn/inequality_solution.svg
diff --git a/published/20210107 A hands-on tutorial for using the GNU Project Debugger.md b/published/20210107 A hands-on tutorial for using the GNU Project Debugger.md
new file mode 100644
index 0000000000..d4efbf9e65
--- /dev/null
+++ b/published/20210107 A hands-on tutorial for using the GNU Project Debugger.md
@@ -0,0 +1,547 @@
+[#]: 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"
+[#]: collector: "lkxed"
+[#]: translator: "Maisie-x"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14853-1.html"
+
+手把手教你使用 GNU 调试器
+======
+
+
+
+> GNU 调试器是一个发现程序缺陷的强大工具。
+
+如果你是一个程序员,想在你的软件增加某些功能,你首先考虑实现它的方法:例如写一个方法、定义一个类,或者创建新的数据类型。然后你用编译器或解释器可以理解的编程语言来实现这个功能。但是,如果你觉得你所有代码都正确,但是编译器或解释器依然无法理解你的指令怎么办?如果软件大多数情况下都运行良好,但是在某些环境下出现缺陷怎么办?这种情况下,你得知道如何正确使用调试器找到问题的根源。
+
+GNU 调试器([GDB][2])是一个发现项目缺陷的强大工具。它通过追踪程序运行过程中发生了什么来帮助你发现程序错误或崩溃的原因。(LCTT 校注:GDB 全程是“GNU Project Debugger”,即 “GNU 项目调试器”,但是通常我们简称为“GNU 调试器”)
+
+本文是 GDB 基本用法的实践教程。请跟随示例,打开命令行并克隆此仓库:
+
+```
+git clone https://github.com/hANSIc99/core_dump_example.git
+```
+
+### 快捷方式
+
+GDB 的每条命令都可以缩短。例如:显示设定的断点的 `info break` 命令可以被缩短为 `i break`。你可能在其他地方看到过这种缩写,但在本文中,为了清晰展现使用的函数,我将所写出整个命令。
+
+### 命令行参数
+
+你可以将 GDB 附加到每个可执行文件。进入你克隆的仓库(`core_dump_example`),运行 `make` 进行编译。你现在能看到一个名为 `coredump` 的可执行文件。(更多信息,请参考我的文章《[创建和调试 Linux 的转储文件][3]》。)
+
+要将 GDB 附加到这个可执行文件,请输入: `gdb coredump`。
+
+你的输出应如下所示:
+
+![gdb coredump output][4]
+
+返回结果显示没有找到调试符号。
+
+调试信息是目标文件(可执行文件)的组成部分,调试信息包括数据类型、函数签名、源代码和操作码之间的关系。此时,你有两种选择:
+
+* 继续调试汇编代码(参见下文“无符号调试”)
+* 使用调试信息进行编译,参见下一节内容
+
+### 使用调试信息进行编译
+
+为了在二进制文件中包含调试信息,你必须重新编译。打开 `Makefile`,删除第 9 行的注释标签(`#`)后重新编译:
+
+```
+CFLAGS =-Wall -Werror -std=c++11 -g
+```
+
+`-g` 告诉编译器包含调试信息。运行 `make clean`,接着运行 `make`,然后再次调用 GDB。你得到如下输出后就可以调试代码了:
+
+![GDB output with symbols][5]
+
+新增的调试信息会增加可执行文件的大小。在这种情况下,执行文件增加了 2.5 倍(从 26,088 字节 增加到 65,480 字节)。
+
+输入 `run -c1`,使用 `-c1` 开关启动程序。当程序运行到达 `State_4` 时将崩溃:
+
+![gdb output crash on c1 switch][6]
+
+你可以检索有关程序的其他信息,`info source` 命令提供了当前文件的信息:
+
+![gdb info source output][7]
+
+* 101 行代码
+* 语言: C++
+* 编译器(版本、调优、架构、调试标志、语言标准)
+* 调试格式:[DWARF 2][8]
+* 没有预处理器宏指令(使用 GCC 编译时,宏仅在 [使用 -g3 标志编译][9] 时可用)。
+
+`info shared` 命令打印了动态库列表机器在虚拟地址空间的地址,它们在启动时被加载到该地址,以便程序运行:
+
+![gdb info shared output][10]
+
+如果你想了解 Linux 中的库处理方式,请参见我的文章 [在 Linux 中如何处理动态库和静态库][11]。
+
+### 调试程序
+
+你可能已经注意到,你可以在 GDB 中使用 `run` 命令启动程序。`run` 命令接受命令行参数,就像从控制台启动程序一样。`-c1` 开关会导致程序在第 4 阶段崩溃。要从头开始运行程序,你不用退出 GDB,只需再次运行 `run` 命令。如果没有 `-c1` 开关,程序将陷入死循环,你必须使用 `Ctrl+C` 来结束死循环。
+
+![gdb output stopped by sigint][12]
+
+你也可以一步一步运行程序。在 C/C++ 中,入口是 `main` 函数。使用 `list main` 命令打开显示 `main` 函数的部分源代码:
+
+![gdb output list main][13]
+
+`main` 函数在第 33 行,因此可以输入 `break 33` 在 33 行添加断点:
+
+![gdb output breakpoint added][14]
+
+输入 `run` 运行程序。正如预期的那样,程序在 `main` 函数处停止。输入 `layout src` 并排查看源代码:
+
+![gdb output break at main][15]
+
+你现在处于 GDB 的文本用户界面(TUI)模式。可以使用键盘向上和向下箭头键滚动查看源代码。
+
+GDB 高亮显示当前执行行。你可以输入 `next`(`n`)命令逐行执行命令。如果你没有指定新的命令,GBD 会执行上一条命令。要逐行运行代码,只需按回车键。
+
+有时,你会发现文本的输出有点显示不正常:
+
+![gdb output corrupted][16]
+
+如果发生这种情况,请按 `Ctrl+L` 重置屏幕。
+
+使用 `Ctrl+X+A` 可以随时进入和退出 TUI 模式。你可以在手册中找到 [其他的键绑定][17] 。
+
+要退出 GDB,只需输入 `quit`。
+
+### 设置监察点
+
+这个示例程序的核心是一个在无限循环中运行的状态机。`n_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;
+
+ (.....)
+
+ }
+}
+```
+
+如果你希望当 `n_state` 的值为 `State_5` 时停止程序。为此,请在 `main` 函数处停止程序并为 `n_state` 设置监察点:
+
+```
+watch n_state == State_5
+```
+
+只有当所需的变量在当前上下文中可用时,使用变量名设置监察点才有效。
+
+当你输入 `continue` 继续运行程序时,你会得到如下输出:
+
+![gdb output stop on watchpoint_1][18]
+
+如果你继续运行程序,当监察点表达式评估为 `false` 时 GDB 将停止:
+
+![gdb output stop on watchpoint_2][19]
+
+你可以为一般的值变化、特定的值、读取或写入时来设置监察点。
+
+### 更改断点和监察点
+
+输入 `info watchpoints` 打印先前设置的监察点列表:
+
+![gdb output info watchpoints][20]
+
+#### 删除断点和监察点
+
+如你所见,监察点就是数字。要删除特定的监察点,请先输入 `delete` 后输入监察点的编号。例如,我的监察点编号为 2;要删除此监察点,输入 `delete 2`。
+
+*注意:* 如果你使用 `delete` 而没有指定数字,*所有* 监察点和断点将被删除。
+
+这同样适用于断点。在下面的截屏中,我添加了几个断点,输入 `info breakpoint` 打印断点列表:
+
+![gdb output info breakpoints][21]
+
+要删除单个断点,请先输入 `delete` 后输入断点的编号。另外一种方式:你可以通过指定断点的行号来删除断点。例如,`clear 78` 命令将删除第 78 行设置的断点号 7。
+
+#### 禁用或启用断点和监察点
+
+除了删除断点或监察点之外,你可以通过输入 `disable`,后输入编号禁用断点或监察点。在下文中,断点 3 和 4 被禁用,并在代码窗口中用减号标记:
+
+![disabled breakpoints][22]
+
+也可以通过输入类似 `disable 2 - 4` 修改某个范围内的断点或监察点。如果要重新激活这些点,请输入 `enable`,然后输入它们的编号。
+
+### 条件断点
+
+首先,输入 `delete` 删除所有断点和监察点。你仍然想使程序停在 `main` 函数处,如果你不想指定行号,可以通过直接指明该函数来添加断点。输入 `break main` 从而在 `main` 函数处添加断点。
+
+输入 `run` 从头开始运行程序,程序将在 `main` 函数处停止。
+
+`main` 函数包括变量 `n_state_3_count`,当状态机达到状态 3 时,该变量会递增。
+
+基于 `n_state_3_count` 的值添加一个条件断点,请输入:
+
+```
+break 54 if n_state_3_count == 3
+```
+
+![Set conditional breakpoint][23]
+
+继续运行程序。程序将在第 54 行停止之前运行状态机 3 次。要查看 `n_state_3_count` 的值,请输入:
+
+```
+print n_state_3_count
+```
+
+![print variable][24]
+
+#### 使断点成为条件断点
+
+你也可以使现有断点成为条件断点。用 `clear 54` 命令删除最近添加的断点,并通过输入 `break 54` 命令添加一个简单的断点。你可以输入以下内容使此断点成为条件断点:
+
+```
+condition 3 n_state_3_count == 9
+```
+
+`3` 指的是断点编号。
+
+![modify breakpoint][25]
+
+#### 在其他源文件中设置断点
+
+如果你的程序由多个源文件组成,你可以在行号前指定文件名来设置断点,例如,`break main. cpp:54`。
+
+#### 捕捉点
+
+除了断点和监察点之外,你还可以设置捕获点。捕获点适用于执行系统调用、加载共享库或引发异常等事件。
+
+要捕获用于写入 STDOUT 的 `write` 系统调用,请输入:
+
+```
+catch syscall write
+```
+
+![catch syscall write output][26]
+
+每当程序写入控制台输出时,GDB 将中断执行。
+
+在手册中,你可以找到一整章关于 [断点、监察点和捕捉点][27] 的内容。
+
+### 评估和操作符号
+
+用 `print` 命令可以打印变量的值。一般语法是 `print <表达式> <值>`。修改变量的值,请输入:
+
+```
+set variable .
+```
+
+在下面的截屏中,我将变量 `n_state_3_count` 的值设为 `123`。
+
+![catch syscall write output][28]
+
+`/x` 表达式以十六进制打印值;使用 `&` 运算符,你可以打印虚拟地址空间内的地址。
+
+如果你不确定某个符号的数据类型,可以使用 `whatis` 来查明。
+
+![whatis output][29]
+
+如果你要列出 `main` 函数范围内可用的所有变量,请输入 `info scope main` :
+
+![info scope main output][30]
+
+`DW_OP_fbreg` 值是指基于当前子程序的堆栈偏移量。
+
+或者,如果你已经在一个函数中并且想要列出当前堆栈帧上的所有变量,你可以使用 `info locals` :
+
+![info locals output][31]
+
+查看手册以了解更多 [检查符号][32] 的内容。
+
+### 附加调试到一个正在运行的进程
+
+`gdb attach <进程 ID>` 命令允许你通过指定进程 ID(PID)附加到一个已经在运行的进程进行调试。幸运的是,`coredump` 程序将其当前 PID 打印到屏幕上,因此你不必使用 [ps][33] 或 [top][34] 手动查找 PID。
+
+启动 `coredump` 应用程序的一个实例:
+
+```
+./coredump
+```
+
+![coredump application][35]
+
+操作系统显示 PID 为 `2849`。打开一个单独的控制台窗口,移动到 `coredump` 应用程序的根目录,然后用 GDB 附加到该进程进行调试:
+
+```
+gdb attach 2849
+```
+
+![attach GDB to coredump][36]
+
+当你用 GDB 附加到进程时,GDB 会立即停止进程运行。输入 `layout src` 和 `backtrace` 来检查调用堆栈:
+
+![layout src and backtrace output][37]
+
+输出显示在 `main.cpp` 第 92 行调用 `std::this_thread::sleep_for<...>(. ..)` 函数时进程中断。
+
+只要你退出 GDB,该进程将继续运行。
+
+你可以在 GDB 手册中找到有关 [附加调试正在运行的进程][38] 的更多信息。
+
+#### 在堆栈中移动
+
+在命令窗口,输入 `up` 两次可以在堆栈中向上移动到 `main.cpp` :
+
+![moving up the stack to main.cpp][39]
+
+通常,编译器将为每个函数或方法创建一个子程序。每个子程序都有自己的栈帧,所以在栈帧中向上移动意味着在调用栈中向上移动。
+
+你可以在手册中找到有关 [堆栈计算][40] 的更多信息。
+
+#### 指定源文件
+
+当调试一个已经在运行的进程时,GDB 将在当前工作目录中寻找源文件。你也可以使用 [目录命令][41] 手动指定源目录。
+
+### 评估转储文件
+
+阅读 [创建和调试 Linux 的转储文件][42] 了解有关此主题的信息。
+
+参考文章太长,简单来说就是:
+
+1. 假设你使用的是最新版本的 Fedora
+2. 使用 `-c1` 开关调用 coredump:`coredump -c1`
+
+ ![Crash meme][44]
+
+3. 使用 GDB 加载最新的转储文件:`coredumpctl debug`
+4. 打开 TUI 模式并输入 `layout src`
+
+![coredump output][45]
+
+`backtrace` 的输出显示崩溃发生在距离 `main.cpp` 五个栈帧之外。回车直接跳转到 `main.cpp` 中的错误代码行:
+
+![up 5 output][46]
+
+看源码发现程序试图释放一个内存管理函数没有返回的指针。这会导致未定义的行为并引起 `SIGABRT`。
+
+### 无符号调试
+
+如果没有源代码,调试就会变得非常困难。当我在尝试解决逆向工程的挑战时,我第一次体验到了这一点。了解一些 [汇编语言][47] 的知识会很有用。
+
+我们用例子看看它是如何运行的。
+
+找到根目录,打开 `Makefile`,然后像下面一样编辑第 9 行:
+
+```
+CFLAGS =-Wall -Werror -std=c++11 #-g
+```
+
+要重新编译程序,先运行 `make clean`,再运行 `make`,最后启动 GDB。该程序不再有任何调试符号来引导源代码的走向。
+
+![no debugging symbols][48]
+
+`info file` 命令显示二进制文件的内存区域和入口点:
+
+![info file output][49]
+
+`.text` 区段始终从入口点开始,其中包含实际的操作码。要在入口点添加断点,输入 `break *0x401110` 然后输入 `run` 开始运行程序:
+
+![breakpoint at the entry point][50]
+
+要在某个地址设置断点,使用取消引用运算符 `*` 来指定地址。
+
+#### 选择反汇编程序风格
+
+在深入研究汇编之前,你可以选择要使用的 [汇编风格][51]。 GDB 默认是 AT&T,但我更喜欢 Intel 语法。变更风格如下:
+
+```
+set disassembly-flavor intel
+```
+
+![changing assembly flavor][52]
+
+现在输入 `layout asm` 调出汇编代码窗口,输入 `layout reg` 调出寄存器窗口。你现在应该看到如下输出:
+
+![layout asm and layout reg output][53]
+
+#### 保存配置文件
+
+尽管你已经输入了许多命令,但实际上还没有开始调试。如果你正在大量调试应用程序或尝试解决逆向工程的难题,则将 GDB 特定设置保存在文件中会很有用。
+
+该项目的 GitHub 存储库中的 [gdbinit][54] 配置文件包含最近使用的命令:
+
+```
+set disassembly-flavor intel
+set write on
+break *0x401110
+run -c2
+layout asm
+layout reg
+```
+
+`set write on` 命令使你能够在程序运行期间修改二进制文件。
+
+退出 GDB 并使用配置文件重新启动 GDB : `gdb -x gdbinit coredump`。
+
+#### 阅读指令
+
+应用 `c2` 开关后,程序将崩溃。程序在入口函数处停止,因此你必须写入 `continue` 才能继续运行:
+
+![continuing execution after crash][55]
+
+`idiv` 指令进行整数除法运算:`RAX` 寄存器中为被除数,指定参数为除数。商被加载到 `RAX` 寄存器中,余数被加载到 `RDX` 中。
+
+从寄存器角度,你可以看到 `RAX` 包含 `5`,因此你必须找出存储堆栈中位置为 `rbp-0x4` 的值。
+
+#### 读取内存
+
+要读取原始内存内容,你必须指定比读取符号更多的参数。在汇编输出中向上滚动一点,可以看到堆栈的划分:
+
+![stack division output][56]
+
+你最感兴趣的应该是 `rbp-0x4` 的值,因为它是 `idiv` 的存储参数。你可以从截图中看到`rbp-0x8` 位置的下一个变量,所以 `rbp-0x4` 位置的变量是 4 字节宽。
+
+在 GDB 中,你可以使用 `x` 命令*查看*任何内存内容:
+
+
+> `x/` < 可选参数 `n`、`f`、`u` > < 内存地址 `addr` >
+
+可选参数:
+
+* `n`:单元大小的重复计数(默认值:1)
+* `f`:格式说明符,如 [printf][57]
+* `u`:单元大小
+ * `b`:字节
+ * `h`:半字(2 个字节)
+ * w: 字(4 个字节)(默认)
+ * g: 双字(8 个字节)
+
+要打印 `rbp-0x4` 的值,请输入 `x/u $rbp-4` :
+
+![print value][58]
+
+如果你能记住这种模式,则可以直接查看内存。参见手册中的 [查看内存][59] 部分。
+
+#### 操作汇编
+
+子程序 `zeroDivide()` 发生运算异常。当你用向上箭头键向上滚动一点时,你会找到下面信息:
+
+```
+0x401211 <_Z10zeroDividev> push rbp
+0x401212 <_Z10zeroDividev+1> mov rbp,rsp
+```
+
+这被称为 [函数前言][60]:
+
+1. 调用函数的基指针(`rbp`)存放在栈上
+2. 栈指针(`rsp`)的值被加载到基指针(`rbp`)
+
+完全跳过这个子程序。你可以使用 `backtrace` 查看调用堆栈。在 `main` 函数之前只有一个堆栈帧,所以你可以用一次 `up` 回到 `main` :
+
+![Callstack assembly][61]
+
+在你的 `main` 函数中,你会找到下面信息:
+
+```
+0x401431 cmp BYTE PTR [rbp-0x12],0x0
+0x401435 je 0x40145f
+0x401437 call 0x401211<_Z10zeroDividev>
+```
+
+子程序 `zeroDivide()` 仅在 `jump equal (je)` 为 `true` 时进入。你可以轻松地将其替换为 `jump-not-equal (jne)` 指令,该指令的操作码为 `0x75`(假设你使用的是 x86/64 架构;其他架构上的操作码不同)。输入 `run` 重新启动程序。当程序在入口函数处停止时,设置操作码:
+
+```
+set *(unsigned char*)0x401435 = 0x75
+```
+
+最后,输入 `continue` 。该程序将跳过子程序 `zeroDivide()` 并且不会再崩溃。
+
+### 总结
+
+你会在许多集成开发环境(IDE)中发现 GDB 运行在后台,包括 Qt Creator 和 VSCodium 的 [本地调试][62] 扩展。
+
+![GDB in VSCodium][63]
+
+了解如何充分利用 GDB 的功能很有用。一般情况下,并非所有 GDB 的功能都可以在 IDE 中使用,因此你可以从命令行使用 GDB 的经验中受益。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/1/gnu-project-debugger
+
+作者:[Stephan Avenwedde][a]
+选题:[lkxed][b]
+译者:[Maisie-x](https://github.com/Maisie-x)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/hansic99
+[b]: https://github.com/lkxed
+[1]: https://opensource.com/sites/default/files/lead-images/mistake_bug_fix_find_error.png
+[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
+[5]: https://opensource.com/sites/default/files/uploads/gdb_output_with_symbols.png
+[6]: https://opensource.com/sites/default/files/uploads/gdb_output_crash_on_c1_switch.png
+[7]: https://opensource.com/sites/default/files/uploads/gdb_output_info_source.png
+[8]: http://dwarfstd.org/
+[9]: https://sourceware.org/gdb/current/onlinedocs/gdb/Compilation.html#Compilation
+[10]: https://opensource.com/sites/default/files/uploads/gdb_output_info_shared.png
+[11]: https://opensource.com/article/20/6/linux-libraries
+[12]: https://opensource.com/sites/default/files/uploads/gdb_output_stopped_by_sigint.png
+[13]: https://opensource.com/sites/default/files/uploads/gdb_output_list_main.png
+[14]: https://opensource.com/sites/default/files/uploads/gdb_output_breakpoint_added.png
+[15]: https://opensource.com/sites/default/files/uploads/gdb_output_break_at_main.png
+[16]: https://opensource.com/sites/default/files/images/gdb_output_screen_corrupted.png
+[17]: https://sourceware.org/gdb/onlinedocs/gdb/TUI-Keys.html#TUI-Keys
+[18]: https://opensource.com/sites/default/files/uploads/gdb_output_stop_on_watchpoint_1.png
+[19]: https://opensource.com/sites/default/files/uploads/gdb_output_stop_on_watchpoint_2.png
+[20]: https://opensource.com/sites/default/files/uploads/gdb_output_info_watchpoints.png
+[21]: https://opensource.com/sites/default/files/uploads/gdb_output_info_breakpoints.png
+[22]: https://opensource.com/sites/default/files/uploads/gdb_output_disabled_breakpoints.png
+[23]: https://opensource.com/sites/default/files/uploads/gdb_output_set_conditional_breakpoint.png
+[24]: https://opensource.com/sites/default/files/uploads/gdb_output_print_variable.png
+[25]: https://opensource.com/sites/default/files/uploads/gdb_output_modify_breakpoint.png
+[26]: https://opensource.com/sites/default/files/uploads/gdb_output_syscall_catch.png
+[27]: https://sourceware.org/gdb/current/onlinedocs/gdb/Breakpoints.html#Breakpoints
+[28]: https://opensource.com/sites/default/files/uploads/gdb_output_print_and_modify.png
+[29]: https://opensource.com/sites/default/files/uploads/gdb_output_whatis.png
+[30]: https://opensource.com/sites/default/files/uploads/gdb_output_info_scope_main.png
+[31]: https://opensource.com/sites/default/files/uploads/gdb_output_info_locals_main.png
+[32]: https://sourceware.org/gdb/current/onlinedocs/gdb/Symbols.html
+[33]: https://man7.org/linux/man-pages/man1/ps.1.html
+[34]: https://man7.org/linux/man-pages/man1/top.1.html
+[35]: https://opensource.com/sites/default/files/uploads/coredump_running.png
+[36]: https://opensource.com/sites/default/files/uploads/gdb_output_attaching_to_process.png
+[37]: https://opensource.com/sites/default/files/uploads/gdb_output_backtrace.png
+[38]: https://sourceware.org/gdb/current/onlinedocs/gdb/Attach.html#Attach
+[39]: https://opensource.com/sites/default/files/uploads/gdb_output_stackframe_up.png
+[40]: https://sourceware.org/gdb/current/onlinedocs/gdb/Stack.html#Stack
+[41]: https://ftp.gnu.org/old-gnu/Manuals/gdb/html_node/gdb_48.html#SEC49
+[42]: https://opensource.com/article/20/8/linux-dump
+[43]: https://creativecommons.org/licenses/by-sa/4.0/
+[44]: https://opensource.com/sites/default/files/uploads/crash.png
+[45]: https://opensource.com/sites/default/files/uploads/gdb_output_coredump.png
+[46]: https://opensource.com/sites/default/files/uploads/gdb_output_up_five.png
+[47]: https://en.wikipedia.org/wiki/Assembly_language
+[48]: https://opensource.com/sites/default/files/uploads/gdb_output_no_debugging_symbols.png
+[49]: https://opensource.com/sites/default/files/uploads/gdb_output_info_file.png
+[50]: https://opensource.com/sites/default/files/uploads/gdb_output_break_at_start.png
+[51]: https://en.wikipedia.org/wiki/X86_assembly_language#Syntax
+[52]: https://opensource.com/sites/default/files/uploads/gdb_output_disassembly_flavor.png
+[53]: https://opensource.com/sites/default/files/uploads/gdb_output_layout_reg_asm.png
+[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
+[56]: https://opensource.com/sites/default/files/uploads/gdb_output_stack_division.png
+[57]: https://en.wikipedia.org/wiki/Printf_format_string#Type_field
+[58]: https://opensource.com/sites/default/files/uploads/gdb_output_examine_1.png
+[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
+[62]: https://github.com/WebFreak001/code-debug
+[63]: https://opensource.com/sites/default/files/uploads/vs_codium_native_debug.png
diff --git a/published/20210120 Highlighted Text Not Visible in gedit in Dark Mode- Here-s What You Can Do.md b/published/20210120 Highlighted Text Not Visible in gedit in Dark Mode- Here-s What You Can Do.md
new file mode 100644
index 0000000000..a530d5f379
--- /dev/null
+++ b/published/20210120 Highlighted Text Not Visible in gedit in Dark Mode- Here-s What You Can Do.md
@@ -0,0 +1,84 @@
+[#]: collector: "lujun9972"
+[#]: translator: "void-mori"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14833-1.html"
+[#]: subject: "Highlighted Text Not Visible in gedit in Dark Mode? Here’s What You Can Do"
+[#]: via: "https://itsfoss.com/gedit-dark-mode-problem/"
+[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/"
+
+gedit 深色模式下高亮文本不可见?以下是你能做的
+======
+
+
+
+我喜欢 [在 Ubuntu 中使用深色模式][1]。在我看来深色模式能够缓解视觉疲劳,让系统看起来更加的赏心悦目。
+
+我发现了一个 [gedit][2] 文本编辑器的小麻烦,如果你在深色模式下使用它,你也许也会遇到。
+
+默认情况下 gedit 高亮当前光标所在的行。这是一个非常有用的功能,但是如果你在 Linux 系统中开启了深色模式,那么你将会感到痛苦。为什么?因为被高亮的文本将不再变得可读。你自己看吧:
+
+![Text on the highlighted line is hardly visible][3]
+
+如果你选择文本,它将变得可读,但这并不是一个让人感到有多么愉快的阅读或者编辑体验。(LCTT 校注:在新的 Ubuntu 22.04 中,这一情况已经有所改善,“高亮当前行”已被取消勾选)
+
+![Selecting the text makes it better but that’s not a convenient thing to do for all lines][4]
+
+好消息是你不需要再忍受它。我将演示几个步骤让你能够同时享受 gedit 以及系统的深色模式。
+
+### 让 gedit 在深色模式下阅读体验友好
+
+你基本上有两个选择:
+
+ 1. 禁用高亮当前行,但也同时意味着你必须清楚地知道你在哪一行。
+ 2. 改变默认的颜色设置,但编辑器的颜色会变得稍微有些不同,而且如果你更改系统主题,它不会自动切换到浅色模式。
+
+在 gedit 或者 GNOME 的开发者解决这个问题之前,这是你必须要做的应变和妥协。
+
+#### 选项1: 禁止高亮当前行
+
+当你打开 gedit 后,点击汉堡菜单然后选择“首选项”。
+
+![Go to Preferences][5]
+
+在查看选项卡,你应该看到在 “高亮” 区域的下方的 “高亮当前行” 选项。取消勾选这个选项,马上就可以看到效果。
+
+![Disable highlighting current line][6]
+
+“高亮当前行”是一个有用的功能,如果你想继续使用它,请选择第二个选项。
+
+#### 选项2: 更改编辑器的颜色主题
+
+在“首选项”窗口,找到 “字体与颜色” 标签页,然后将颜色主题更改为 “Oblivion”、“Solarized Dark”,或者 “Cobalt”。
+
+![Change the color scheme][7]
+
+正如我前面所提到的,缺点就是当你把系统主题切换为浅色模式时,编辑器将不会自动切换到浅色模式。
+
+### 开发者应该修复的一个 bug
+
+这里 [有几个 Linux 可用的文本编辑器][8] ,但是为了快速阅读或编辑文本文件,我更推荐使用 gedit。尽管如此,小烦恼仍旧是小烦恼。开发者应该在将来的版本中为这个很好的文本编辑器修复这个问题,让我们不再求助于这些应对办法。
+
+你呢?你在你的系统上使用深色模式还是浅色模式?你注意到 gedit 的这个问题了吗?你有使用什么方法去解决它吗?欢迎分享你的经验。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/gedit-dark-mode-problem/
+
+作者:[Abhishek Prakash][a]
+选题:[lujun9972][b]
+译者:[void-mori](https://github.com/void-mori)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/abhishek/
+[b]: https://github.com/lujun9972
+[1]: https://itsfoss.com/dark-mode-ubuntu/
+[2]: https://wiki.gnome.org/Apps/Gedit
+[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/gedit-dark-mode-problem.png?resize=779%2C367&ssl=1
+[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/gedit-dark-mode-issue.png?resize=779%2C367&ssl=1
+[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/gedit-preference.jpg?resize=777%2C527&ssl=1
+[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/disable-highlight-line-gedit.jpg?resize=781%2C530&ssl=1
+[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/change-color-scheme-gedit.jpg?resize=785%2C539&ssl=1
+[8]: https://itsfoss.com/best-modern-open-source-code-editors-for-linux/
diff --git a/published/20210511 What is fog computing.md b/published/20210511 What is fog computing.md
new file mode 100644
index 0000000000..7984cc82d7
--- /dev/null
+++ b/published/20210511 What is fog computing.md
@@ -0,0 +1,67 @@
+[#]: subject: (What is fog computing?)
+[#]: via: (https://opensource.com/article/21/5/fog-computing)
+[#]: author: (Seth Kenlon https://opensource.com/users/seth)
+[#]: collector: (lujun9972)
+[#]: translator: (hanszhao80)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-14782-1.html)
+
+什么是雾计算?
+======
+
+> 了解由我们生活中的所有连接设备组成的网络。
+
+
+
+在早期,计算机既笨重又昂贵,计算机用户很少,他们必须在计算机上的预留时间内亲自来处理他们的打孔卡。被称为 [大型机][2] 的系统进行了许多创新,并在终端机(没有自己的 CPU 的桌面计算机)上实现了分时任务。
+
+时至今日,强大的计算设备能做到 [价格低至 35 美元,且大小不超过一张信用卡][3]。这甚至还没有涵盖现代生活中负责收集和处理数据的所有小设备。从高层次的角度来看这些计算机的集合,你可以想象得到,所有这些设备多得像云中的水滴一样。
+
+碰巧“云计算”一词已经被占用,因此需要为由物联网(IoT)和其他具有战略意义的服务器组成的网络提供一个独特的名称。此外,如果已经有一个代表数据中心节点的云,那么在云之外与我们交融的这些节点肯定有其独特之处。
+
+### 欢迎来到雾计算
+
+云通过互联网提供计算服务。构成云的数据中心很大,但与潜在客户的数量相比相对较少。这表明当数据在云及其众多用户之间来回传送时存在潜在的瓶颈。
+
+相比之下,雾计算可以在数量上超过其潜在客户,而不会出现瓶颈,因为设备执行大部分数据的收集或计算。它是云的外部“边缘”,是云落地的部分。
+
+### 雾和边缘计算
+
+雾计算和 [边缘计算][4] 本质上是同义词。两者都与云和物联网密切相关,并做出相同的架构假设:
+
+- 你离 CPU 越近,数据传输就越快。
+- 像 [Linux][5] 一样,小型专用计算机,可以“做一件事并把它做好”,这是一个强大的优势(当然,我们的设备实际上不仅仅做一件事,但从高层次上看,你购买的用于监测健康的智能手表本质上是在做“一”件事)。
+- 离线是不可避免的,但好的设备可以在此期间同样有效地运行,然后在重新连接时同步。
+- 本地设备能比大型数据中心更简单、更便宜。
+
+### 边缘网络
+
+将雾计算视为与云完全分离的实体很诱人,但它们毕竟是组成一个整体的两个部分。云需要数字企业的基础设施,包括公共云提供商、电信公司,甚至是运行自己服务的专业公司。本地化服务也很重要,可以在云核心与其数以百万计的客户之间提供中转站。
+
+雾计算位于云的边缘,无论客户身在何处,都与他们紧密联系在一起。有时这是一个消费环境,例如你自己的家或汽车,而另一些时候这是一种商业利益,例如零售店中的价格监控设备或工厂车间的重要的安全传感器。
+
+### 雾计算就在你身边
+
+雾计算由我们生活中的所有连接设备组成:无人机、电话、手表、健身监视器、安全监视器、家庭自动化、便携式游戏设备、园艺自动化、天气传感器、空气质量监视器等等。理想情况下,它提供的数据有助于建立一个更好、更明智的未来。有许多伟大的开源项目正朝着改善健康的方向而努力 —— 甚至只是让生活变得更有趣一点儿 —— 这一切都得益于雾和云计算。无论如何,_我们的_ 工作是确保它 [保持开放][7]。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/5/fog-computing
+
+作者:[Seth Kenlon][a]
+选题:[lujun9972][b]
+译者:[hanszhao80](https://github.com/hanszhao80)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/seth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/computer_laptop_code_programming_mountain_view.jpg?itok=yx5buqkr (Man at laptop on a mountain)
+[2]: https://opensource.com/article/19/9/linux-mainframes-part-1
+[3]: https://opensource.com/resources/raspberry-pi
+[4]: https://www.redhat.com/en/topics/edge-computing/what-is-edge-computing
+[5]: https://opensource.com/resources/linux
+[6]: https://www.redhat.com/architect/edge-computing-essentials
+[7]: https://opensource.com/article/20/10/keep-cloud-open
diff --git a/published/20210511 What is the OSI model.md b/published/20210511 What is the OSI model.md
new file mode 100644
index 0000000000..01b9089954
--- /dev/null
+++ b/published/20210511 What is the OSI model.md
@@ -0,0 +1,93 @@
+[#]: subject: (What is the OSI model?)
+[#]: via: (https://jvns.ca/blog/2021/05/11/what-s-the-osi-model-/)
+[#]: author: (Julia Evans https://jvns.ca/)
+[#]: collector: (lujun9972)
+[#]: translator: (hanszhao80)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-14786-1.html)
+
+OSI 模型是什么?
+======
+
+
+
+(LCTT 校注:作者原文已经大篇幅进行了修订更新,本文据之前的版本翻译。)
+
+今天我在推特上发布了一些关于 OSI 模型如何与 TCP/IP 工作原理的实际表现不相符的观点,这让我思考——OSI 模型到底是什么?通过阅读推特上的一些回复发现,似乎至少存在三种不同的思考方式:
+
+1. TCP/IP 工作原理的字面描述
+2. 一个可以用来描述和比较很多不同的网络协议的抽象模型
+3. 对 1980 年代的一些计算机网络协议的字面描述,这些协议如今大多已不再使用
+
+在这篇文章中,我不打算试图争辩以上哪一个才是“真正”的 OSI 模型——似乎不同的人以所有这些方式思考它。这不重要。
+
+### OSI 模型有七层
+
+在我们讨论 OSI 模型的含义之前,让我们大致地讨论一下它是什么。它是一个抽象模型,用于描述网络如何在七个编号的层上工作:
+
+- 第一层:物理层
+- 第二层:数据链路层
+- 第三层:网络层
+- 第四层:传输层
+- 第五层:会话层
+- 第六层:表示层
+- 第七层:应用层
+
+我不会再费时地去解释每一层的含义,网上有上千种解释可供查询。
+
+### OSI 模型:TCP/IP 工作原理的字面描述
+
+首先,我想谈谈人们在实践中使用 OSI 模型的一种常见方式:作为对 TCP/IP 工作原理的字面描述。OSI 模型的某些层非常容易映射到 TCP/IP:
+
+- 第二层对应以太网
+- 第三层对应 IP
+- 第四层对应 TCP 或 UDP(或 ICMP 等)
+- 第七层对应 TCP 或 UDP 包内的任何内容(例如 DNS 查询)
+
+这种映射对第二、三、四层很有意义——TCP 数据包有三个标头对应于这三个层(以太网标头、IP 标头和 TCP 标头)。
+
+用数字来描述 TCP 数据包中的不同标头非常有用——如果你说“第二层”,很显然它位于第三层“下方”,因为二比三小。
+
+“OSI 模型作为字面描述”的古怪之处在于,第五层和第六层并不真正对应于 TCP/IP 中的任何内容——我听说过很多关于第五层或第六层可能是什么的不同解释(你可以说第五层是 TLS 或其他东西!)但它们没有像第二、三、四层那样“每一层在 TCP 数据包中都有相应的标头”这样的明确对应关系。
+
+此外,TCP/IP 的某些部分即使在第二层到第四层也不能很好地适应 OSI 模型——例如,哪一层是 ARP 数据包?ARP 数据包发送一些带有以太网标头的数据,这是否意味着它们是第三层?或是第二层?列出不同 OSI 层的维基百科文章将其归类为“第 2.5 层”,这并不令人满意。
+
+因为 OSI 模型有时用于教授 TCP/IP,若搞不清楚它的哪些部分可以映射到 TCP/IP,而哪些部分不能,则会令人困惑。这才是真的问题。
+
+### OSI 模型:用于比较网络协议的一个抽象
+
+我听说过的另一种关于 OSI 的思考方式是,它是一种抽象,可以用来在许多不同的网络协议之间进行类比。例如,如果你想了解蓝牙协议的工作原理,也许你可以使用 OSI 模型来帮助你——这是我在 [这个网页][1] 上找到的一张图表,显示了蓝牙协议如何适配 OSI 模型。
+
+![][2]
+
+另一个例子是,[这篇维基百科文章][3] 有一个 OSI 层列表,详细划分了哪些特定的网络协议对应于这些 OSI 层。
+
+### OSI 模型:一些过时协议的字面描述
+
+维基百科上的一些非常简短的研究表明,除了对这七层的抽象描述之外,OSI 模型还包含了 [一组实现这些层的特定协议][4]。显然,这发生在 70 年代和 80 年代的 [协议战争][5] 时期,OSI 模型失败了,TCP/IP 则取得了胜利。
+
+这就解释了为什么 OSI 模型无法与 TCP/IP 很好地对应,因为如果当时“获胜”的是 OSI 协议,那么 OSI 模型 _将_ 完全对应于互联网网络的实际工作方式。
+
+### 结语
+
+我写这篇文章的初衷是,当我最初学习 OSI 模型时,我发现它非常令人困惑(所有这些层是什么?它们是真实存在的吗?这是网络的实际工作原理吗?发生了什么?)我希望有人告诉我这个只使用 TCP/IP 网络协议的人,只需了解 OSI 模型第二、三、四和七层与 TCP/IP 的关系,然后忽略它的所有其他内容即可。所以我希望这篇文章对某些人能有所帮助!
+
+--------------------------------------------------------------------------------
+
+via: https://jvns.ca/blog/2021/05/11/what-s-the-osi-model-/
+
+作者:[Julia Evans][a]
+选题:[lujun9972][b]
+译者:[hanszhao80](https://github.com/hanszhao80)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://jvns.ca/
+[b]: https://github.com/lujun9972
+[1]: https://flylib.com/books/en/4.215.1.116/1/
+[2]: https://jvns.ca/images/bluetooth.gif
+[3]: https://en.wikipedia.org/wiki/List_of_network_protocols_(OSI_model)
+[4]: https://en.wikipedia.org/wiki/OSI_protocols
+[5]: https://en.wikipedia.org/wiki/Protocol_Wars
diff --git a/published/20210602 Establish an SSH connection between Windows and Linux.md b/published/20210602 Establish an SSH connection between Windows and Linux.md
new file mode 100644
index 0000000000..edc6789ac8
--- /dev/null
+++ b/published/20210602 Establish an SSH connection between Windows and Linux.md
@@ -0,0 +1,207 @@
+[#]: subject: (Establish an SSH connection between Windows and Linux)
+[#]: via: (https://opensource.com/article/21/6/ssh-windows)
+[#]: author: (Stephan Avenwedde https://opensource.com/users/hansic99)
+[#]: collector: (lujun9972)
+[#]: translator: (yjacks)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-14855-1.html)
+
+如何从 Windows 上用 SSH 连接到 Linux
+======
+
+> 使用开源的 PuTTY 工具,从 Windows 建立到 Linux 的 SSH 连接。
+
+
+
+在 Linux 世界中,安全外壳(SSH)协议是最为常用的、通过命令行控制远程计算机的方式。SSH 是真正的 Linux 原创,但是它在 Windows 世界中也越来越流行。甚至有了一份官方的 [Windows 的 SSH 文档][2],那篇文档阐述了使用 [OpenSSH][3] 控制 Windows 的方法。
+
+这篇文章展示了如何使用了流行的开源工具 [PuTTY][4],建立一个从 Windows 到 Fedora 33 Linux 系统的 SSH 连接。
+
+### 使用 SSH 的方法
+
+SSH 使用客户端-服务器模式,即 SSH 客户端会创建到 SSH 服务端的连接。SSH 服务器通常会作为守护进程运行,所以它常被称为 SSHD。你很难找到一个不自带 SSH 守护进程的 Linux 发行版。在 Fedora 33 中,已安装了 SSH 守护进程,但是并未激活。
+
+你可以使用 SSH 控制几乎所有的 Linux 机器,无论它是作为虚拟机还是作为网络上的物理设备运行。一个常见的用例是无头配置的嵌入式设备,如树莓派。SSH 也可以用做一个其它网络服务的隧道。因为 SSH 连接是加密的,所以你可以使用 SSH 作为一个任何默认不提供加密的协议的传输层。
+
+在这篇文章中,我将解释使用 SSH 的四个方式:1、如何在 Linux 端配置 SSH 守护进程;2、如何设置远程控制台连接;3、如何通过网络复制文件,4. 如何将 SSH 作为某些协议的隧道。
+
+### 1、配置 SSHD
+
+将 Linux 系统(文中是 Fedora 33)作为 SSH 服务器,允许 PuTTY SSH 客户端进行连接。首先,检查守护进程的 SSH 配置。配置文件放在 `/etc/ssh/sshd_config`,它包含了许多选项,通过取消掉相关行的注释就可以激活:
+
+```
+# $OpenBSD: sshd_config,v 1.100 2016/08/15 12:32:04 naddy Exp $
+
+# This is the sshd server system-wide configuration file. See
+# sshd_config(5) for more information.
+
+# This sshd was compiled with PATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin
+
+# The strategy used for options in the default sshd_config shipped with
+# OpenSSH is to specify options with their default value where
+# possible, but leave them commented. Uncommented options override the
+# default value.
+
+Include /etc/ssh/sshd_config.d/*.conf
+
+#Port 22
+#AddressFamily any
+#ListenAddress 0.0.0.0
+#ListenAddress ::
+```
+
+没有取消任何注释的默认配置在这个示例中应该是可以工作的。要检查 SSH 守护进程是否已经运行,输入 `systemctl status sshd`:
+
+```
+$ systemctl status sshd
+● sshd.service - OpenSSH server daemon
+ Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
+ Active: active (running) since Fri 2018-06-22 11:12:05 UTC; 2 years 11 months ago
+ Docs: man:sshd(8)
+ man:sshd_config(5)
+ Main PID: 577 (sshd)
+ Tasks: 1 (limit: 26213)
+ CGroup: /system.slice/sshd.service
+ └─577 /usr/sbin/sshd -D -oCiphers=[aes256-gcm@openssh.com][5],chacha20-[...]
+```
+
+如果它处于未激活状态,使用 `systemctl start sshd` 命令启动它。
+
+### 2、设置远程控制台
+
+在 Windows 下 [下载 PuTTY 安装程序][6],然后安装并打开它。你应看到一个像这样的窗口:
+
+![PuTTY configuration screen][7]
+
+在“主机名(或 IP 地址)”输入框,键入你的 Linux 系统的连接信息。本文设置了一个 Fedora 33 虚拟机,它使用桥接网络适配器,使我可以由 IP 地址 `192.168.1.60` 连接这个系统。点击“打开”,应会如图示的打开一个窗口:
+
+![PutTTY security alert][9]
+
+这是 SSH 的安全措施之一,是为了防止[中间人攻击][10]。消息中的指纹应该匹配 Linux 系统中放在 `/etc/ssh/ssh_host_ed25519_key.pub` 的密钥。PuTTY 将这个密钥以 [MD5 哈希值][11] 的方式打印出来。要检查它的真实性,切换到 Linux 系统并打开一个控制台,然后输入:
+
+```
+ssh-keygen -l -E md5 -f /etc/ssh/ssh_host_ed25519_key.pub
+```
+
+输出应该和 PuTTY 展示的指纹一致:
+
+```
+$ ssh-keygen -l -E md5 -f /etc/ssh/ssh_host_ed25519_key.pub
+256 MD5:E4:5F:01:05:D0:F7:DC:A6:32 no comment (ED25519)
+```
+
+点击“是”以确认 PuTTY 的安全提示。主机系统的指纹现在存储在 PuTTY 的信任列表中,其位于 Windows 的注册表中的:
+
+```
+HKEY_CURRENT_USER\SOFTWARE\SimonTatham\PuTTY\SshHostKeys
+```
+
+输入正确的登录凭证,然后你应该进入控制台了,位置在你的用户主目录。
+
+![Logged in to SSH][12]
+
+### 3、通过网络复制文件
+
+除了远程控制台,你同样可以使用 PuTTY 通过 SSH 来传输文件。PuTTY 的安装目录在 `C:\Program Files (x86)\PuTTY`,在该目录下寻找 `ppscp.exe`。你既可以使用它从 Linux 系统复制文件,也可以复制文件到 Linux 系统。
+
+使用 `Windows + R` 然后输入 `cmd` 来打开命令提示符,从你的 Linux 用户主目录复制 `MYFile.txt` 到你的 Windows 主目录,输入:
+
+```
+C:\"Program Files (x86)"\PuTTY\pscp.exe stephan@192.168.1.60:/home/stephan/MyFile.txt .
+```
+
+要从 Windows 主目录复制文件到 Linux 用户主目录,输入:
+
+```
+C:\"Program Files (x86)"\PuTTY\pscp.exe MyFile.txt stephan@192.168.1.60:/home/stephan/
+```
+
+就像你也许已经发现的那样,复制的命令通常构造为:
+
+```
+pscp.exe
+```
+
+### 4、隧道化一个协议
+
+假设你拥有一个 Linux 机器,为某些特别的应用运行一个基于 HTTP 的服务。你想从你的 Windows 机器通过互联网访问这个 HTTP 服务。而且,你不能将相关的 TCP 端口暴露在公网,因为:
+
+ 1. 这个服务通过 HTTP 而非 HTTPS 运行
+ 2. 根本没有用户管理和登录系统
+
+乍一看,建立这种架构不产生可怕的漏洞似乎是不可能的。但是 SSH 可简单的为这种情况建立一个安全的解决方案。
+
+我将用我的软件项目 [Pythonic][13] 来演示这个过程。在容器中运行。Pythonic 作为容器运行,开放两个 TCP 端口:TCP 端口 7000(主要编辑器)和 TCP 端口 8000([code-server][14] 代码编辑器)。
+
+要在一个 Linux 机器上安装 Pythonic ,运行:
+
+```
+podman pull pythonicautomation/pythonic
+podman run -d -p 7000:7000 -p 8000:8000 pythonic
+```
+
+转向你的 Windows 机器,打开 PuTTy,转到 “连接 -> SSH -> 隧道”。加入你要转发的两个 TCP 端口:
+
+ * 源:`7000` / 目标:`localhost:7000`
+ * 源:`8000` / 目标:`localhost:8000`
+
+![Port forwarding in PuTTY][15]
+
+然后返回 “会话” 部分,并像之前那样建立一个 SSH 链接。打开网页浏览器,然后转到 `http://localhost:7000`;你应该看见像这样的窗口:
+
+![Pythonic][16]
+
+你成功的设置了端口转发!
+
+**警告**: 如果你选择在公网上暴露 TCP 端口 22 ,不要使用易于猜测的登录凭证。你将接受来自全世界的登录请求,它们使用常见的、标准的登录凭证以尝试登录你的 Linux 机器。相反,只允许已知的用户登录。这种登录限制可以通过 [公钥加密][17] 来实现,它使用一个密钥对,其中公钥存储在 SSH 主机上,而私钥保留在客户端。
+
+### 调试
+
+如果你难以连接你的 Linux 机器,你可以跟踪你的 SSH 守护进程的处理过程:
+
+```
+journalctl -f -u sshd
+```
+
+这是一个普通的登录进程,但是其日志级别为 DEBUG,它看起来是这样的 :
+
+![LogLevel DEBUG output][18]
+
+### 了解更多
+
+这篇文章几乎没有涉及到使用 SSH 的方法。如果你正在寻找一个特定用例的信息,你也许可以在互联网中找到无数的教程。我在工作中使用 PuTTY ,因为它易于设置,在两个操作系统间又具有良好的可操作性,使得它成为连接解决方案里的瑞士军刀。
+
+(文内图片来自:Stephan Avenwedde,[CC BY-SA 4.0][8])
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/6/ssh-windows
+
+作者:[Stephan Avenwedde][a]
+选题:[lujun9972][b]
+译者:[yjacks](https://github.com/yjacks)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [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/cloud-windows-building-containers.png?itok=0XvZLZ8k (clouds in windows)
+[2]: https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_overview
+[3]: https://www.openssh.com/
+[4]: https://www.putty.org/
+[5]: mailto:aes256-gcm@openssh.com
+[6]: https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
+[7]: https://opensource.com/sites/default/files/uploads/putty_connection_settings.png (PuTTY configuration screen)
+[8]: https://creativecommons.org/licenses/by-sa/4.0/
+[9]: https://opensource.com/sites/default/files/uploads/putty_host_key.png (PutTTY security alert)
+[10]: https://en.wikipedia.org/wiki/Man-in-the-middle_attack
+[11]: https://en.wikipedia.org/wiki/MD5
+[12]: https://opensource.com/sites/default/files/uploads/ssh_successfull_login.png (Logged in to SSH)
+[13]: https://github.com/hANSIc99/Pythonic
+[14]: https://github.com/cdr/code-server
+[15]: https://opensource.com/sites/default/files/uploads/ssh_port_forwarding.png (Port forwarding in PuTTY)
+[16]: https://opensource.com/sites/default/files/uploads/pythonic_screen.png (Pythonic)
+[17]: https://opensource.com/article/21/4/encryption-decryption-openssl
+[18]: https://opensource.com/sites/default/files/uploads/sshd_debug_log.png (LogLevel DEBUG output)
diff --git a/published/20210611 How to use the FreeDOS text editor.md b/published/20210611 How to use the FreeDOS text editor.md
new file mode 100644
index 0000000000..43f6816f64
--- /dev/null
+++ b/published/20210611 How to use the FreeDOS text editor.md
@@ -0,0 +1,80 @@
+[#]: subject: (How to use the FreeDOS text editor)
+[#]: via: (https://opensource.com/article/21/6/freedos-text-editor)
+[#]: author: (Jim Hall https://opensource.com/users/jim-hall)
+[#]: collector: (lujun9972)
+[#]: translator: (yjacks)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-14847-1.html)
+
+如何使用 FreeDOS Edit
+======
+
+> FreeDOS 提供了一个叫做 FreeDOS Edit 的用户友好的文本编辑器。
+
+
+
+在任何操作系统中,编辑文件都是一项常有的任务。当你想去做一个某事的笔记、写封信给朋友或升级一个系统配置 —— 你需要一个文本编辑器。FreeDOS 提供了一个用户友好的文本编辑器(也许没啥想象力)叫做 “FreeDOS Edit”。
+
+### 编辑文件
+
+最简单的启用 FreeDOS Edit 的方式就就是输入 `EDIT`。它提供一个空的编辑器窗口。图案背景显示为一个空的“桌面”——提醒你没有编辑任何文件。
+
+![FreeDOS Edit:未加载任何文件][2]
+
+就像多数 DOS 应用程序一样,你可以按下你键盘上的 `Alt` 键来访问 Edit 的菜单。这就激活了这个菜单。在你按下 `Alt` 后,Edit 将切换到“菜单”访问方式,并高亮 “文件” 菜单。如果你想要访问菜单栏上的一个不同的菜单,可以使用左右方向键。按向下的方向键并按下回车键来“进入”菜单。
+
+![高亮菜单][3]
+
+你注意到所有菜单标题的第一个字母是不同的颜色么?这种高亮字母显示了一种快捷方式。例如,“文件”菜单的“F”高亮为红色。所以你可以按下 `Alt+F`(`Alt` 和 `F` 同时按下),Edit 会显示“文件”菜单。
+
+![文件菜单][4]
+
+你可以使用“文件”菜单来开始一个新的(空)文件,或打开一个存在的文件。让我们开始一个新文件,使用方向键移动到“新建“然后按下回车键。你也可以用 `Ctrl+N` (`Ctrl` 和 `N` 同时按下)打开一个新文件。
+
+![编辑一个新的文件][5]
+
+此后,编辑文件应该非常简单。大多数熟悉的快捷键都可以在 FreeDOS Edit 中使用:`Ctrl+C` 复制文本,`Ctrl+X` 剪贴文本,和 `Ctrl+V` 将复制的或剪贴的文本粘贴到新的地方。如果你需要在一个长文档中寻找一个特殊文本,按下 `Ctrl+F`。保存你的工作成果,请使用 `Ctrl+S` 以将变更提交到硬盘。
+
+### 在 Edit 中编程
+
+如果你是个程序员,你也许会发现扩展的 ASCII 表是一个有用的工具。DOS 系统支持“拓展的” ASCII字符集,通常被称之为“代码页 437”。0 到 127 的标准字符包括字母 A 到 Z(大写和小写)、数字和特殊字符,如标点符号。但是,从 128 到 255 的 DOS 拓展字符包括其它语言字符和“画线”元素。DOS 程序员有时需要使用这些拓展 ASCII 字符,所以 FreeDOS Edit 可以很容易地查看所有 ASCII 码和它们的相关字符的表格。
+
+要查看这个 ASCII 表,请使用“工具”菜单,选择“ASCII 表”菜单项,这将显示一个包含该表格的窗口。
+
+![在工具菜单找到 ASCII 表][6]
+
+沿着左边,这张表显示十六进制值“00”到“F0”,顶部展示了单一值“0”到“F”。这些为每个字符的十六进制代码提供了一个快速参考。例如,第一行(00)和第一列(0)中的项目具有十六进制值 00 + 0,即0x00(“NULL”值)。而第五行(40)和第二列(1)中的字符,其数值为 40 + 1,即 0x41(字母 “A”)。
+
+![ASCII 表提供一个便于参考的扩展字符表][7]
+
+当你在表格内移动光标高亮不同的字符时,你会看到表格底部的值发生变化,展示了字符的十进制、十六进制和八进制编码。例如,移动光标以高亮在 C0 行和第 5 列的“行交叉”字符,显示这个扩展字符的代码为 197(十进制)、0xc5(十六进制)和 305(八进制)。在一个程序中,你可以通过输入十六进制值 0xc5 或八进制“转义代码” \305 来引用这个扩展字符。
+
+![“行交叉”字符是 197(十进制)、0xc5(十六进制)和 305(八进制)][8]
+
+请随意浏览 Edit 中的菜单,以发现其他不错的功能。例如,“选项”菜单允许你更改 Edit 的行为和外观。如果你喜欢使用更密集的显示,可以使用“显示”菜单(在“选项”下)将 Edit
+ 设置为 25、43 或 50 行。你还可以强制 Edit 以单色(黑底白字)或反转模式(白底黑字)显示。
+
+(文内图片来自 Jim Hall,CC-BY SA 4.0)
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/6/freedos-text-editor
+
+作者:[Jim Hall][a]
+选题:[lujun9972][b]
+译者:[yjacks](https://github.com/yjacks)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [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/sites/default/files/uploads/edit.png (FreeDOS Edit without any files loaded)
+[3]: https://opensource.com/sites/default/files/uploads/edit-menu.png (Highlighting the menu)
+[4]: https://opensource.com/sites/default/files/uploads/edit-file.png (The File menu)
+[5]: https://opensource.com/sites/default/files/uploads/edit-new.png (Editing a new file)
+[6]: https://opensource.com/sites/default/files/uploads/utilities-ascii.png (Find the ASCII Table in the Utilities menu)
+[7]: https://opensource.com/sites/default/files/uploads/ascii-table-0x00.png (The ASCII Table provides a handy reference for extended characters)
+[8]: https://opensource.com/sites/default/files/uploads/ascii-0xc5.png
diff --git a/published/20210627 How to Convert File Formats With Pandoc in Linux -Quick Guide.md b/published/20210627 How to Convert File Formats With Pandoc in Linux -Quick Guide.md
new file mode 100644
index 0000000000..6125218224
--- /dev/null
+++ b/published/20210627 How to Convert File Formats With Pandoc in Linux -Quick Guide.md
@@ -0,0 +1,137 @@
+[#]: subject: (How to Convert File Formats With Pandoc in Linux [Quick Guide])
+[#]: via: (https://itsfoss.com/pandoc-convert-file/)
+[#]: author: (Bill Dyer https://itsfoss.com/author/bill/)
+[#]: collector: (lujun9972)
+[#]: translator: (lkxed)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-14785-1.html)
+
+如何在 Linux 中使用 Pandoc 转换文件格式
+======
+
+在之前的一篇文章中,我介绍了 [使用 pandoc 将少量 Markdown 文件批量转换为 HTML 的过程][1]。在那篇文章中,我创建了多个 HTML 文件,但 Pandoc 可以做的更多。它被称为文档转换的“瑞士军刀” —— 这是有充分理由的。很少有它做不到的事情。
+
+[Pandoc][2] 可以将 .docx、.odt、.html、.epub、LaTeX、DocBook 等格式互相转换,或者转换为其他格式,例如 JATS、TEI Simple、AsciiDoc 等。
+
+是的,这意味着 Pandoc 可以将 .docx 文件转换为 .pdf 和 .html 文件,但你可能会想:“Word 也可以将文件导出为 .pdf 和 .html。为什么我需要 Pandoc 呢?”
+
+嗯,本来呢,你这个说法也没错,但考虑到 Pandoc 可以转换这么多格式,它很可能成为你所有转换任务的首选工具。例如,我们中的许多人都知道 [Markdown 编辑器][3] 可以将其 Markdown 文件导出为 .html。而使用 Pandoc 文件也可以转换为许多其他格式。
+
+我很少将 Markdown 导出为 HTML。我通常让 Pandoc 来做这件事。
+
+### 使用 Pandoc 转换文件格式
+
+![][4]
+
+本文中,我会将 Markdown 文件转换成几种不同的格式。我几乎所有的写作都使用 Markdown 语法,但我经常需要转换为另一种格式:学校作业通常需要的 .docx 格式;我创建的网页通常需要的 .html 格式;工作需要的 .epub 格式;传单和讲义需要的 .pdf 格式;甚至包括一个大学数字人文项目偶尔需要的 TEI Simple 格式。Pandoc 可以轻松处理所有这些格式,甚至更多。
+
+首先,你需要 [安装 pandoc][5]。此外,要创建 .pdf 文件,还需要 LaTeX。我最喜欢的套件是 [TeX Live][6]。
+
+**注意**:如果你想在安装前试用 pandoc,这里有一个在线试用页面:。
+
+#### 安装 pandoc 和 texlive
+
+Ubuntu 和其他 Debian 发行版的用户可以在终端中输入以下命令:
+
+```
+sudo apt-get update
+sudo apt-get install pandoc texlive
+```
+
+请注意第二行,你将一次性安装 `pandoc` 和 `texlive`。[apt-get 命令][7] 支持你这样做。不过,我建议你先去喝杯咖啡,因为这可能需要几分钟的时间。
+
+#### 开始转换
+
+安装完成 `pandoc` 和 `texlive` 后,你就可以尝试用它们来完成一些工作了!
+
+该项目的示例文档将是一篇文章,该文章于 1894 年 12 月首次发表在《北美评论》上,标题为“如何击退火车劫匪”。我将使用的 Markdown 文件是前一段时间创建的,该文章的一个恢复项目的一部分(LCTT 译注:这是篇一百多年前发表的文章,这是一个数字化“恢复”项目)。
+
+我把这篇文章保存为 `how_to_repel_train_robbers.md`,它位于我的 `Documents` 目录下,名为 `samples` 的子目录中。它在 Ghostwriter 中看起来是这样的:
+
+![在 Ghostwriter 中查看原始的 Markdown 文件][8]
+
+我想创建此文件的 .docx、.pdf 和 .html 版本。
+
+#### 第一次转换
+
+首先,我将制作一个 .pdf 副本,因为我在安装 LaTeX 包时遇到了些麻烦。
+
+在 `~/Documents/samples/` 目录中,我输入以下,以创建一个 .pdf 文件:
+
+```
+pandoc -o htrtr.pdf how_to_repel_train_robbers.md
+```
+
+上述命令将基于 `how_to_repel_train_robbers.md` 文件,创建一个名为 `htrtr.pdf` 的文件。我使用 `htrtr` 作为名称的原因是:嗯,它比 `how_to_repel_train_robbers` 短。`htrtr` 其实是长标题中的单词首字母排列。
+
+这是 .pdf 文件制作完成后的一个截图:
+
+![在 Ocular 中查看的转换后的 PDF 文件][9]
+
+#### 第二次转换
+
+接下来,我想创建一个 .docx 文件。该命令与我用来创建 .pdf 的命令几乎相同,它是:
+
+```
+pandoc -o htrtr.docx how_to_repel_train_robbers.md
+```
+
+很快,一个 .docx 文件就创建好了。这是它在 Libre Writer 中的样子:
+
+![在 Libre Writer 中查看转换后的 DOCX 文件][10]
+
+#### 第三次转换
+
+我可能会想在网上发布这个,所以再多一个支持网页的格式也不错。我将使用以下命令创建一个 .html 文件:
+
+```
+pandoc -o htrtr.html how_to_repel_train_robbers.md
+```
+
+同样,创建它的命令与前两次转换非常相似。这是该 .html 文件在浏览器中的样子:
+
+![在 Firefox 中查看的转换后的 HTML 文件][11]
+
+#### 注意到什么了吗?
+
+让我们再看看之前的命令。它们是:
+
+```
+pandoc -o htrtr.pdf how_to_repel_train_robbers.md
+pandoc -o htrtr.docx how_to_repel_train_robbers.md
+pandoc -o htrtr.html how_to_repel_train_robbers.md
+```
+
+这三个命令唯一不同的是 `htrtr` 后的扩展名。这提示你 pandoc 会依赖于你提供的输出文件扩展名(来决定目标转换格式)。
+
+### 总结
+
+Pandoc 可以做的远不止这里完成的三个小转换。如果你选择使用一个首选格式编写文件,但时不时又需要将文件转换为另一种格式,pandoc 很大概率都能为你完成。
+
+现在,既然你已经学会了,你会用它做什么呢?你会把它自动化吗?如果你有一个网站,想供读者下载文章怎么办?你可以修改这些小命令,把它们编写成一个脚本,你的读者可以决定他们想要哪种格式。你可以提供 .docx、.pdf、.odt、.epub 或更多格式。你的读者只需要选择一种格式,然后对应的转换脚本就会执行,最后,你的读者下载他们想要的文件。这是完全可以做到的。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/pandoc-convert-file/
+
+作者:[Bill Dyer][a]
+选题:[lujun9972][b]
+译者:[lkxed](https://github.com/lkxed)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/bill/
+[b]: https://github.com/lujun9972
+[1]: https://itsfoss.com/convert-markdown-files/
+[2]: https://pandoc.org/
+[3]: https://itsfoss.com/best-markdown-editors-linux/
+[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/06/pandoc-quick-guide.png?resize=800%2C450&ssl=1
+[5]: https://pandoc.org/installing.html
+[6]: https://www.tug.org/texlive/
+[7]: https://itsfoss.com/apt-get-linux-guide/
+[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/06/convert_with_pandoc_ghostwriter.png?resize=800%2C516&ssl=1
+[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/06/convert_with_pandoc_ocular.png?resize=800%2C509&ssl=1
+[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/06/convert_with_pandoc_libre_writer.png?resize=800%2C545&ssl=1
+[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/06/convert_with_pandoc_firefox.png?resize=800%2C511&ssl=1
diff --git a/published/20211017 How I use open source to play RPGs.md b/published/20211017 How I use open source to play RPGs.md
new file mode 100644
index 0000000000..b8ec151f5e
--- /dev/null
+++ b/published/20211017 How I use open source to play RPGs.md
@@ -0,0 +1,107 @@
+[#]: subject: "How I use open source to play RPGs"
+[#]: via: "https://opensource.com/article/21/10/open-source-rpgs"
+[#]: author: "Seth Kenlon https://opensource.com/users/seth"
+[#]: collector: "lujun9972"
+[#]: translator: "perfiffer"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14859-1.html"
+
+我如何使用开源玩 RPG 游戏
+======
+
+> 为角色扮演游戏的所有元素找到一个开源工具。
+
+
+
+我玩过很多桌面角色扮演游戏(RPG),无论是从频率还是种类来说。一般来说,我更喜欢和朋友一起玩 RPG,但在过去的 2 年里,我一直在玩网络游戏。(LCTT 校注:这里的 RPG 游戏指的是那种“传统”的面对面的桌面游戏,而非很多人最初接触的 RPG 电子游戏。)
+
+起初,我不确定如何在线长期的进行游戏。我知道有很多的工具可以实现,但直到我发现在线桌面游戏的开源世界之前,这些工具没有一个引起我的兴趣。通过一小部分开源应用程序,我已经能够在开源平台上进行我的所有游戏。
+
+这也是一年中的好时机,因为最近是 [免费 RPG 日][2](LCTT 校注:今年的这个节日在 7 月 23 日举办)。在免费 RPG 日,桌面角色扮演游戏行业的发行商们会免费发放游戏,鼓励玩家尝试新游戏和新冒险。尽管它在 2020 年被取消了,但今年它又作为现场活动回归,并通过 [Dungeon Crawl Classics][3] 和 [Paizo][4] 的免费 RPG 示例下载提供了一些虚拟支持。
+
+如果这个活动提供的虚拟产品还不够,我还整理了一份 [你可能尚未尝试过的 5 个开源桌面 RPG 游戏列表][5]。
+
+当你准备好开始玩游戏时,请尝试其中一些开源工具,看看它们能在多大程度上增强你的游戏体验。
+
+### 聊天
+
+在线 RPG 游戏最基本的(从技术上讲,也是唯一的)要求是交流。这是游戏的媒介:玩家需要一种说话的途径。
+
+有几个不错的选择。我发现 [Mumble][6] 是对带宽需求最低的工具。这是一个纯语音聊天应用程序,可以使用非常高效的 Opus 编解码器让每个人一次交谈数小时而不会中断。
+
+![Mumble client][7]
+
+它在世界各地都运行有公共实例,所以下载 Mumble 客户端后,你可以加入其中任何一个开放的实例,并使用它来在线运行游戏。有一个“按下通话”设置,你可以用此来消除背景噪音,当你的其他家庭成员在进行其它工作而不想被你的桌面会话打扰时,这个功能将会非常实用。
+
+还有一个文本聊天客户端。我的游戏组通常使用它来发布与游戏相关的链接,但你也可以将其用于其它无关内容的交谈,而让口头游戏保持在主题上。
+
+如果你的玩家更喜欢看到面部表情,或者只是习惯于视频聊天网页应用。那么 [Jitsi][8] 是面对面围坐在桌子旁聚会的绝佳替代品。Jitsi 和你曾经使用过的其它视频聊天软件几乎一样,甚至更简单。你可以设置一个“房间”,邀请朋友,将陌生人拒之门外,并玩上几个小时。静音和关闭摄像都很直观,界面很吸引人,并且还定期开发和推出了新功能。
+
+![Jitsi][9]
+
+Mumble 和 Jitsi 都有适用于台式机和移动设备的客户端,因此任何人都可以在任何设备上使用。
+
+### 角色表
+
+我发布了我的 [数字角色表][10] 解决方案,但任何 RPG 玩家都知道管理角色不仅仅是统计数据。
+
+在延续多个会话的在线游戏中,我发现每次游戏之间有很长的停止时间。我突然想到,虽然我发现要求我的玩家在现场纸笔游戏中计算损耗是不合理的,但当一切都是数字化时,要求他们跟踪损耗很容易。
+
+网上有很多可用的电子表格,但开源的选择是 [Ethercalc][11]。由于其实例遍布世界各地,因此很容易找到免费的 Ethercalc 主机。或者,你可以使用 Podman 或者 Docker 轻松安装和运行你自己的实例。
+
+![Ethercalc spreadsheet of inventory][12]
+
+Etherclac 提供了一些基本要素:一个共享的账本,这样玩家就可以跟踪他们的团队所携带的物品(以及在任何给定的时间持有该物品的人)、每件物品的重量和价值。当队伍在游戏过程中收集到战利品时,就会输入该物品,所以他们知道什么自己何时会因为负担过重而无法拿起新物品。
+
+在不同的游戏会话之间,可以引用和整理这份共享的电子表格,以便玩家(PC)知道哪些物品可以卖掉,哪些物品可以放入储物袋,哪些物品可以在下一次会话发现更好的战利品时安全的丢弃。
+
+### 地图
+
+Mythic Table 是一款开源的桌面游戏共享地图系统。这意味着你可以加载图片作为游戏地图,并在地图上移动数字标记以表示玩家角色所在的位置。
+
+自从 [上次我介绍了关于 Mythic Table][13] 以来,它已经在 Kickstarter 上成功地进行了一次众筹,以确保它的持续发展。它还增加了一些新功能,其中最引人注目的是“战争迷雾”功能,它允许地下城主掩盖地图并仅显示玩家探索过的部分。
+
+![A dungeon map rendered by Mythic Table and user interface choices for chat, maps, and characters][14]
+
+在过去的几个月里,我一直在 Mythic Table 上运行两款游戏,这是一款优秀且直观的地图系统。它还提供了一个数字骰子筒,所以如果你的玩家没有骰子,或者你更喜欢在公开场合掷骰子,你就可以用它作为共享的骰子池。
+
+你可以在 [mythictable.com][15] 上试用 Mythic Table,或者访问他们在 [Github][16] 上的代码库。
+
+### 开源的开放游戏
+
+我使用的开源工具是通用的,因此它们适用于你想玩的任何游戏系统。因为它们都是开源的,所以无论你的玩家使用什么操作系统,他们都可以在线使用,并且它们都可以自托管。
+
+如果你既是程序员又是游戏玩家,请访问他们的 Git 代码仓库,看看是否有任何你可以贡献的东西。如果你是游戏玩家或者游戏管理员,在下次坐在数字版的游戏桌前请尝试使用一下这些工具。你可能会惊讶于你只需要很少的在线账户就可以使用一些可用于游戏的最佳应用程序。
+
+*(文内图片来自:Seth Kenlon,CC-BY-SA 4.0)*
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/10/open-source-rpgs
+
+作者:[Seth Kenlon][a]
+选题:[lujun9972][b]
+译者:[perfiffer](https://github.com/perfiffer)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/seth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/header_dice.png?itok=dOMrHopO (Dice as a random number generator)
+[2]: https://www.freerpgday.com/
+[3]: https://goodman-games.com/blog/2021/10/06/pdf-previews-of-our-free-rpg-day-releases/
+[4]: https://paizo.com/community/blog/v5748dyo6shte
+[5]: https://opensource.com/article/21/10/rpg-tabletop-games
+[6]: http://mumble.info/
+[7]: https://opensource.com/sites/default/files/mumble-client.png (Mumble client)
+[8]: https://jitsi.org/
+[9]: https://opensource.com/sites/default/files/jitsi-client.jpg (Jitsi)
+[10]: https://opensource.com/article/21/10/3-ways-manage-your-character-sheets-open-source
+[11]: http://ethercalc.net/
+[12]: https://opensource.com/sites/default/files/uploads/ethercalc.jpeg (Ethercalc)
+[13]: https://opensource.com/article/20/11/open-source-battle-maps
+[14]: https://opensource.com/sites/default/files/uploads/mythic.jpeg (Mythic Table)
+[15]: http://mythictable.com/
+[16]: https://gitlab.com/mythicteam/mythictable
diff --git a/published/20211104 Beginner-s Guide to Installing Arch Linux on VirtualBox.md b/published/20211104 Beginner-s Guide to Installing Arch Linux on VirtualBox.md
new file mode 100644
index 0000000000..28d6c3f008
--- /dev/null
+++ b/published/20211104 Beginner-s Guide to Installing Arch Linux on VirtualBox.md
@@ -0,0 +1,270 @@
+[#]: subject: "Beginner’s Guide to Installing Arch Linux on VirtualBox"
+[#]: via: "https://itsfoss.com/install-arch-linux-virtualbox/"
+[#]: author: "Ankush Das https://itsfoss.com/author/ankush/"
+[#]: collector: "lujun9972"
+[#]: translator: "hanszhao80"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14834-1.html"
+
+在 VirtualBox 安装 Arch Linux 的新手操作指南
+======
+
+
+
+[Arch Linux 在桌面 Linux 世界中非常流行][1]。受欢迎的原因之一是 [安装 Arch Linux][2] 本身就是一项复杂的任务。
+
+我没有夸大其词。安装 [Ubuntu 或 Debian][3] 比 Arch Linux 容易得多,因为官方没给后者提供图形界面的安装程序。
+
+这时虚拟机就派上用场了。
+
+你可以先在 VirtualBox 中尝试安装 Arch Linux,看看它是否是你想在实际硬件上运行的系统。通过这种方式,你可以在不弄乱当前操作系统的情况下体验 Arch Linux。
+
+在本文,我将一步一步指导你完成一个实用的 Arch Linux 虚拟机的安装过程。
+
+### 在 VirtualBox 上安装 Arch Linux
+
+毫无疑问,你需要先 [在 Linux 上安装 VirtualBox][4](或在 Windows 上)。在 Windows 上,只需访问 Oracle 的网站并下载 VirtualBox。
+
+> **[下载 VirtualBox][5]**
+
+如果你使用的是 Windows 10 或更高版本,请确保你的系统已启用虚拟化。
+
+完成后,你需要到 [Arch Linux 官方网站][6] 下载 ISO 文件。你应该找到 [使用 torrent 下载][7] 或直接下载文件的选项。
+
+![][8]
+
+你可以保留 ISO 文件以备不时之需,安装成功后也可以将其删除以 [释放系统上的空间][9]。
+
+现在,让我们开始在 VirtualBox 上安装 Arch Linux 吧。
+
+#### 第一部分 创建虚拟机
+
+**第一步**:首先,你需要在 VirtualBox 中设置一下。启动 VirtualBox 并单击 “新建” 来创建一个虚拟机。
+
+![][10]
+
+注意,你可以使用 “向导模式” 继续创建虚拟机,但使用 “专家模式” 可以一目了然地获得更多选项。
+
+![][11]
+
+因此,我推荐使用专家模式来创建虚拟机。
+
+不用担心,专家模式同样简单,只是多了一些额外的可选项,无需担心其他任何事情。
+
+**第二步**:输入你的虚拟机名称。当你在 “名称” 字段中输入 “Arch Linux” 时,它会分别自动检测 “类型” 和 “版本”。
+
+![][12]
+
+你应该增加内存大小以舒适地使用虚拟机。如果只是用于小型测试,你可以继续使用默认设置。
+
+我在这个例子中分配了 **4 GB 左右的内存**。
+
+另外,请确保在 “硬盘”选项下选择 “现在创建虚拟硬盘”。它应该是默认选项。
+
+现在,继续设置虚拟硬盘大小。
+
+**第三步**:你可以选择虚拟硬盘的存放位置,并根据你的需求调整大小。最小分配大小(8 GB)对于安装系统应该不是问题,但安全起见,你可能得分配至少 10 到 15 GB。
+
+![][13]
+
+接下来,你需要将硬盘硬盘文件类型选择为 “VDI(VirtualBox Disk Image)” ,将存储选择为 “动态分配”,如上图所示。
+
+VDI 是虚拟硬盘最常见的硬盘类型。
+
+当你为硬盘存储选择 “动态分配” 选项时,这意味着存储空间将根据使用情况进行使用。换言之,当创建虚拟机后,并不会立即将这 15 GB 的空间从你的磁盘中锁定。
+
+现在,你所要做的就是点击 “创建” 来添加虚拟机。
+
+#### 第二部分 添加 ISO 文件以开始安装 Arch Linux
+
+![][14]
+
+当虚拟机在左侧列表中出现后,你可以查看其配置并在 “存储” 选项下选择 ISO 文件作为磁盘驱动。
+
+你也可以单独前往虚拟机设置以探索更多内容并选择 ISO 文件。
+
+![][15]
+
+为此,你需要导航至虚拟机设置的 “存储” 标签页。
+
+![][16]
+
+在这里,你必须单击 “控制器” 下的 “没有盘片”,然后继续选择 Arch Linux ISO 文件作为磁盘文件(如上图所示)。
+
+![][17]
+
+完成选择后,点击 “OK” 以保存设置的变更。
+
+将 ISO 设置为要引导的磁盘时,虚拟机设置应如下所示:
+
+![][18]
+
+现在,点击 “启动” 启动虚拟机并开始安装。
+
+#### 第三部分 使用引导式安装程序安装 Arch Linux
+
+使用 [介绍一个引导式安装程序][19] 的方法使安装 Arch Linux 变得更容易,也就是说,它为你提供了设置成熟的 Arch Linux 系统所需的所有选项。
+
+因此,在引导式安装程序的帮助下,你不必单独安装桌面环境和其他基本软件包。你所要做的就是按照屏幕上的说明选择适合你的选项。
+
+在本文中,我们将重点介绍引导式安装程序。如果你想自己做,你应该遵循我们的 [Arch 安装指南][2]。
+
+继续安装流程,当你启动虚拟机时,将看到以下屏幕:
+
+![][20]
+
+第一个选项是理想的处理方式。如果你有特定的要求,可以选择其他选项来启动 Arch Linux。
+
+现在,你应该正在查看一个终端窗口。以下是如何开始:
+
+**第一步**:输入 `archinstall` 以使用引导式安装程序启动安装。
+
+![][21]
+
+**第二步**:根据你的要求选择键盘布局,美式布局应该是最常见的选择。简单地输入一个数字即可进行选择,如下图所示(例如,26):
+
+![][22]
+
+**第三步**:接下来,你需要选择一个区域来下载包。
+
+![][23]
+
+选择首选地区而不是 “全球”。这至关重要,因为如果你选择 **全球** 作为你的地区,它会下载许多不必要的包。
+
+**第四步**:选择区域后,它会要求你选择驱动器进行安装。在这个例子中,我们已经创建了一个大约 15 GB 的虚拟驱动器,显示为 `/dev/sda`。
+
+类似的,根据大小检查你创建的驱动器,然后选择该磁盘继续。在这里,我输入 `1` 作为输入;你的可能会有所不同。
+
+![][24]
+
+**第五步**:接下来,你将被询问以下内容:
+
+ - 选择文件系统类型
+ - 加密密码(可选的)
+ - 主机名
+ - 创建 root 密码(可选的)
+ - 创建超级用户
+ - 选择一个预编程的配置文件
+
+![][25]
+
+在我的测试中,我选择了 btrfs 作为文件系统,没有设置任何磁盘加密密码。
+
+主机名可随心所欲的设置,但我建议保持简短。
+
+你可以选择创建一个 root 密码,即使不这么做也应该没什么问题。不过,你需要创建一个具有 sudo 权限的超级用户。
+
+我使用 `admin`/`pass` 作为用户名和密码。不过,如果你不想让其他人访问你计算机上的虚拟机,则不应使用易于猜测的密码。
+
+然后,你将看到一个选择配置文件的选项。在这种情况下,我们需要一个成熟的 Arch Linux 桌面。因此,我们通过输入 `0` 来选择 “桌面”。
+
+**第六步**:接下来,你将被要求选择桌面环境。我决定使用 KDE。你可以选择任何你喜欢的。
+
+![][26]
+
+**第七步**:最后,你将被要求选择显卡驱动程序。由于我们是在 VirtualBox 上安装的 Arch Linux,你可以选择选项 4:VMware/VirtualBox,如下图所示:
+
+![][27]
+
+你可能还会被要求输入“是(`y`)或否(`n`)”选择 pipewire 而不是 PulseAudio 作为音频服务。选任何一个都应该都可以。
+
+**第八步**:接下来是重要的一步。在这里,如果你需要内核的 LTS 版本,你可以选择使用 “linux-lts”,或者继续使用默认值。
+
+![][28]
+
+安装程序会提示你输入想安装的软件包。在这里,我们没有任何特殊要求,因此我们将其留空并按回车键跳过。
+
+**第九步**:你将被要求选择所需的网络适配器以启用互联网访问。你必须选择以下选项:
+
+“使用网络管理器来控制和管理你的互联网连接”
+
+![][29]
+
+**第十步**:下一步需要定义时区。选择适用于你的时区,或继续使用默认选项。
+
+**第十一步**:完成后,它将显示你选择的大部分选项以供确认。按回车键继续。
+
+![][30]
+
+**第十二步**:安装完成需要花费几分钟时间,这取决于你的互联网连接速度。
+
+安装完成后,它会要求你 “chroot 进入新创建的安装以进行安装后配置”,但我们不需要。因此输入 `N` 以完成安装。
+
+**第十三步**:最后,你应该会再次看到终端窗口。输入:
+
+```
+shutdown now
+```
+
+这将安全地退出安装并关闭虚拟机。
+
+一切就绪!在启动安装了 Arch 的虚拟机之前,你还需要做一件事 —— **移除选择作为光驱的 ISO 磁盘**。与添加启动 ISO 的方式类似,你可以前往虚拟机设置并将其删除,如下所示:
+
+![][31]
+
+到此为止你已在 VirtualBox 上安装了 Arch Linux。
+
+你所要做的就是启动虚拟机,在我的例子中它是这样的:
+
+![virtualbox arch][32]
+
+尽管浏览这些选项需要一些时间,但 Arch Linux 上新的引导式安装程序可以节省大量时间使必填项配置正确。
+
+![][33]
+
+同样的步骤也适用于在你的计算机上安装 Arch Linux。你需要用 Arch Linux ISO 文件 [使用 Etcher 制作单独的可启动 USB 盘][34]。
+
+### 总结
+
+[Arch Linux 成为一种流行的选择][1] 有多种原因。但是,如果这是你第一次安装,或者你想对其进行测试,那么虚拟机是在不打乱主机的情况下体验它的最佳方式。
+
+我希望这可以帮助你在 VirtualBox 上安装 Arch Linux。在下面的评论中让我知道你的想法。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/install-arch-linux-virtualbox/
+
+作者:[Ankush Das][a]
+选题:[lujun9972][b]
+译者:[hanszhao80](https://github.com/hanszhao80)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/ankush/
+[b]: https://github.com/lujun9972
+[1]: https://itsfoss.com/why-arch-linux/
+[2]: https://itsfoss.com/install-arch-linux/
+[3]: https://itsfoss.com/debian-vs-ubuntu/
+[4]: https://itsfoss.com/install-virtualbox-ubuntu/
+[5]: https://www.virtualbox.org/wiki/Downloads
+[6]: https://archlinux.org/download/
+[7]: https://itsfoss.com/best-torrent-ubuntu/
+[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/archlinux-downloads.png?resize=800%2C419&ssl=1
+[9]: https://itsfoss.com/free-up-space-ubuntu-linux/
+[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/virtualbox-new.png?resize=800%2C562&ssl=1
+[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/virtualbox-expert-mode.png?resize=707%2C438&ssl=1
+[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/virtualbox-create.png?resize=800%2C536&ssl=1
+[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/virtualbox-disk.png?resize=800%2C528&ssl=1
+[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/10/choose-disk-virtualbox-arch.png?resize=800%2C440&ssl=1
+[15]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/virtualbox-settings-option.png?resize=800%2C551&ssl=1
+[16]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/10/virtualbox-choose-iso.png?resize=800%2C314&ssl=1
+[17]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/10/virtualbox-arch-iso-select.png?resize=800%2C348&ssl=1
+[18]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/virtualbox-set-start.png?resize=800%2C548&ssl=1
+[19]: https://news.itsfoss.com/arch-linux-easy-install/
+[20]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/virtualbox-archlinux-boot.png?resize=800%2C593&ssl=1
+[21]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/10/vb-archinstall-guided.png?resize=800%2C400&ssl=1
+[22]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/vb-archinstall-kb-layout.png?resize=800%2C694&ssl=1
+[23]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/archinstall-region.png?resize=800%2C664&ssl=1
+[24]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/archinstall-selectdisk.png?resize=800%2C199&ssl=1
+[25]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/archinstall-desktop-configure.png?resize=800%2C497&ssl=1
+[26]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/archinstall-virtualbox-desktop-environment.png?resize=800%2C415&ssl=1
+[27]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/virtualbox-environment.png?resize=419%2C173&ssl=1
+[28]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/archinstall-linux-kernel.png?resize=800%2C692&ssl=1
+[29]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/10/virtualbox-arch-network-manager.png?resize=800%2C151&ssl=1
+[30]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/10/archinstall-confirmation.png?resize=800%2C697&ssl=1
+[31]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/10/iso-remove-archinstall.png?resize=800%2C286&ssl=1
+[32]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/10/virtualbox-arch.png?resize=800%2C635&ssl=1
+[33]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/kde-arch-virtualbox.png?resize=800%2C453&ssl=1
+[34]: https://itsfoss.com/install-etcher-linux/
diff --git a/published/20211203 Should Businesses Opt for Serverless Computing-.md b/published/20211203 Should Businesses Opt for Serverless Computing-.md
new file mode 100644
index 0000000000..6fa2d4a1e2
--- /dev/null
+++ b/published/20211203 Should Businesses Opt for Serverless Computing-.md
@@ -0,0 +1,93 @@
+[#]: subject: "Should Businesses Opt for Serverless Computing?"
+[#]: via: "https://www.opensourceforu.com/2021/12/should-businesses-opt-for-serverless-computing/"
+[#]: author: "Krishna Mohan Koyya https://www.opensourceforu.com/author/krishna-mohan-koyya/"
+[#]: collector: "lkxed"
+[#]: translator: "lkxed"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14781-1.html"
+
+企业应该选择无服务器计算吗?
+======
+
+> 无服务器计算将服务器从规划中移除,使企业能够专注于应用功能。那么,企业是不是都应该选择无服务器计算呢?让我们来探究一下吧!
+
+
+
+直至不久之前,几乎每个产品经理都会将他/她的工程资源,分成两个独立的团队 —— 开发团队和运维团队。开发团队通常参与编码、测试和构建应用功能,而运维团队负责应用程序的交付、部署和运行维护。
+
+当开发团队构建电商应用时,运维团队会搭建好服务器来托管该应用。搭建服务器涉及到许多方面,其中包括:
+
+* 选择合适的硬件和操作系统
+* 应用所需的补丁集
+* 搭建所需服务器环境,如 JDK、Python、Tomcat、NodeJS 等
+* 部署、配置和提供实际的应用
+* 打开并固定合适的端口
+* 搭建所需的数据库引擎
+
+……这个名单还在继续。
+
+除此之外,管理人员还对容量规划感到头疼。毕竟,任何重要应用都应始终保持 100% 可用、可靠且可扩展。这需要对硬件进行最佳投资。众所周知,在一些关键时期,硬件短缺会导致业务损失,而硬件冗余又会损害利润。因此,无论应用是针对本地数据中心,还是针对云基础架构,容量规划都是至关重要的。到目前为止,很明显,企业不仅在功能构建上投入了大量的精力,还在功能交付上也花费了大量的时间。
+
+无服务器计算旨在提供一种无缝的方式来交付功能,而无需担心服务器的设置和维护。换句话说,无服务器计算平台提供了一个“即用型”环境,企业可以尽快将应用程序构建和部署为一些较小的功能。这就是为什么这种方法被称为“功能即服务”(FaaS)。
+
+请记住,无服务器计算中仍然存在服务器,但它由 AWS、微软和谷歌等 FaaS 供应商负责。
+
+例如,AWS 以 “Lambda 函数”的形式提供了一个无服务器计算环境。开发人员可以选择将应用程序构建为一组 Lambda 函数,这些函数可以用 NodeJS、Java、Python 和其他一些语言编写。AWS 提供了一个现成的环境来部署这些函数。它还提供了即用型数据库服务器、文件服务器、应用程序网关和身份验证服务器等。
+
+同样,微软 Azure 也提供了一个环境,它可以用 C# 等语言构建和部署 Azure 函数。
+
+### 为什么选择无服务器?
+
+有两个主要因素推动了无服务器计算的普及。
+
+#### 1、即用型环境
+
+显然,这是无服务器计算的最大卖点。企业无需提前采购/预订硬件或实例,也无需操心许可证,以及设置和配置服务器。他们不需要为扩大和缩小规模而烦恼。所有这些都由 FaaS 供应商负责。
+
+#### 2、最优成本
+
+由于 FaaS 供应商总是根据环境的利用率向客户收费(按使用付费模式),因此企业无需担心前期成本和资源浪费。例如,AWS 根据 Lambda 函数接收的请求数量、在数据表上运行的查询数量等指标来向客户端收费。
+
+### 无服务器计算的挑战
+
+与任何其他方法一样,无服务器计算也不是每个人都可以盲目遵循的完美方法。它本身也有一系列限制。以下是其中的几个。
+
+#### 1、供应商锁定
+
+当使用无服务器计算时,第一个也是最重要的问题就是,Lambda 或 Azure 等函数将使用供应商提供的 API 来编写。例如,使用 AWS Lambda API 编写的函数无法部署到 Google Cloud 中,反之亦然。因此,无服务器计算迫使企业在许多年内,只能使用同一家供应商。并且,应用的成功或失败不仅取决于它的功能,还取决于供应商在性能等方面的能力。
+
+#### 2、编程语言
+
+没有哪家无服务器计算平台支持所有的编程语言。此外,对于它支持的编程语言,它也可能不支持其所有版本。这样一来,应用开发团队只能选择供应商提供的语言。就团队的能力而言,这可能是非常关键的。
+
+#### 3、最优成本,真的吗?
+
+其实也不一定,这一切都取决于资源的使用情况。如果你的应用正在承受巨大的负载,例如每秒数百万个请求,那么你所支付的费用可能会过高。在这样的规模下,在本地或云端拥有自己的服务器可能会更便宜。这并不意味着具有 Web 规模的应用不适合用无服务器计算。归根结底,它还是取决于你的平台的构建方式,以及你与供应商签署的协议。
+
+#### 4、生态系统
+
+没有哪个应用是为了一个孤立的环境而编写的。它总是需要其他组件,如数据存储、数据库、安全引擎、网关、消息服务器、队列、缓存等。每个平台都提供自己的一组此类工具。例如,AWS 提供了 Dynamo DB 作为其 NoSQL 解决方案之一。显然,其他供应商也提供了自己的 NoSQL 解决方案。因此,团队又会被迫地基于所选平台来构建应用程序。尽管大多数商业 FaaS 供应商都为特定需求提供了多个组件,但并非每个组件都可能是同类型中最佳的。
+
+### 为什么不考虑容器呢?
+
+在过去十年中,我们中的许多人都迁移到了容器化部署模型,因为它们为昂贵的物理机或虚拟机提供了一种轻量级的替代方案。有了 Kubernetes 等编排工具后,我们乐于部署容器化应用,同时也满足了 Web 规模的要求。容器提供了与底层环境一定程度的隔离,这使得部署相对容易。但是,我们仍然需要在硬件(本地或云)、许可证、网络、配置等方面进行投资,这需要具有前瞻性的规划、合适的技术能力和仔细的监控。无服务器计算,尽管它也有自己的优点和缺点,但它让我们把这些责任也摆脱了。
+
+### 展望未来
+
+我们正处于持续开发、持续集成和持续部署的时代。每个企业都面临着竞争。产品上市时间(TTM)在吸引客户、留住客户这两个方面,发挥着重要作用。在这种背景下,企业喜欢花更多时间来尽可能快地推出功能,而不是在部署和维护的细节上苦苦挣扎。无服务器计算有可能满足这些需求。大玩家们正在投入巨额资金,以使 FaaS 尽可能地无缝且经济。无服务器计算的未来看起来是一片光明。
+
+--------------------------------------------------------------------------------
+
+via: https://www.opensourceforu.com/2021/12/should-businesses-opt-for-serverless-computing/
+
+作者:[Krishna Mohan Koyya][a]
+选题:[lkxed][b]
+译者:[lkxed](https://github.com/lkxed)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.opensourceforu.com/author/krishna-mohan-koyya/
+[b]: https://github.com/lkxed
+[1]: https://www.opensourceforu.com/wp-content/uploads/2021/10/Severless-Cloud-Computing-Featured-image-OSFY-Oct-2021.jpg
diff --git a/sources/tech/20220106 Send desktop notifications and reminders from Linux terminal.md b/published/20220106 Send desktop notifications and reminders from Linux terminal.md
similarity index 50%
rename from sources/tech/20220106 Send desktop notifications and reminders from Linux terminal.md
rename to published/20220106 Send desktop notifications and reminders from Linux terminal.md
index 73b3b708cc..35ed30f1e0 100644
--- a/sources/tech/20220106 Send desktop notifications and reminders from Linux terminal.md
+++ b/published/20220106 Send desktop notifications and reminders from Linux terminal.md
@@ -2,136 +2,107 @@
[#]: via: "https://opensource.com/article/22/1/linux-desktop-notifications"
[#]: author: "Tomasz Waraksa https://opensource.com/users/tomasz"
[#]: collector: "lujun9972"
-[#]: translator: " "
-[#]: reviewer: " "
-[#]: publisher: " "
-[#]: url: " "
+[#]: translator: "mcfd"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14826-1.html"
-Send desktop notifications and reminders from Linux terminal
+如何从 Linux 终端发送桌面通知与提醒
======
-This Linux tutorial demonstrates how to use script commands to send
-yourself desktop notifications and reminders.
-![Person using a laptop][1]
-Sometimes it's useful to get visual feedback from a script. For example, when a script or cron job completes, a long-running build fails, or there is an urgent problem during script execution. Desktop applications can do this with popup notifications, but it can be done from a script too! You can use script commands to send yourself desktop notifications and reminders.
+> 这篇教程演示如何使用脚本命令来发送自己的桌面通知与提醒。
+
+
+
+有时候,来自脚本的视觉回馈是很有用的。例如,当一个脚本或计划任务完成时,一个长期运行的构建任务失败时,或者当脚本执行中出现了紧急问题时。桌面应用程序可以通过弹出通知来做到这一点,但脚本也可以做到这一点!你可以使用脚本命令来给自己发送桌面通知与提醒。
![Example notification][2]
-(Tomasz Waraksa, CC BY-SA 4.0)
+下面的代码是在 Linux 上编写和测试的。它也可以在 macOS 上运行,只需花点功夫。请参见最后一节 [提示与技巧][3]。
-The below code has been written and tested on Linux. It can also be done on macOS with a bit of effort. See the last section for some [hints and tips][3].
+### 从 Linux 终端发送通知
-### Sending notifications from the Linux terminal
-
-To send notifications from the Linux terminal, use the [`notify-send`][4] command. Run `which ``notify-send` to see if it's present on your system. If not, install it with your package manager of choice.
-
-On Fedora, type:
+要从 Linux 终端发送通知,请使用 [notify-send][4] 命令。运行 `which notify-send` 命令来查看它是否在于你的系统中。如果没有,请使用包管理器来安装它。
+在 Fedora 上,输入:
```
-`$ sudo dnf install notify-send`
+$ sudo dnf install notify-send
```
-On Debian-based distributions, type:
-
+在基于 Debian 的发行版上,输入:
```
-`$ sudo apt install notify-send`
+$ sudo apt install notify-send
```
-A few examples of simple notifications:
-
+几个简单的通知示例:
```
-
-
$ notify-send "Dinner ready!"
$ notify-send "Tip of the Day" "How about a nap?"
-
```
-You can customize the notification with options such as urgency level, custom icon, etc. Find out more with `man notify-send`. You can use a small set of HTML tags in the notification body to give your messages a nice touch. On top of that, URLs are rendered as clickable. For example:
-
+你可以用紧急程度、自定义图标等选项来自定义通知。过 `man notify-send` 了解更多。你也可以在通知正文中使用一小组 HTML 标记,以使消息有一个棒的视觉感受。最重要的是,URL 被呈现为可点击的。例如:
```
-
-
$ notify-send -u critical \
- "Build failed!" \
- "There were <b>123</b> errors. Click here to see the results: "
-
+ "Build failed!" \
+ "There were 123 errors. Click here to see the results: http://buildserver/latest"
```
![Build fail notification][5]
-(Tomasz Waraksa, CC BY-SA 4.0)
+发送的通知会被桌面环境接收,并像其他通知一样显示。它们将具有相同的外观、交互和行为。
-Sent notifications are picked up by the desktop environment and displayed just like any other notification. They will have the same consistent look, feel, and behavior.
-
-### Combine notify-send with at
-
-Cron is commonly used to schedule commands at regular intervals. The `at` command schedules the single execution of a command at a specified time. If you run it like this, it starts in interactive mode, where you can enter commands to execute at a given time:
+### 将 notify-send 与 at 结合使用
+计划任务通常被用来定期安排命令。`at` 命令安排在一个指定的时间执行一条命令。如果你像这样运行它,它会以交互模式启动,你可以在其中输入要在指定时间执行的命令:
```
-`$ at 12:00`
+$ at 12:00
```
-This isn't useful for scripts. Luckily, `at` accepts parameters from standard input so that we can use it this way:
-
+这对脚本来说并不有用。幸运的是 `at` 接受来自标准输入的参数,所以我们可以这样使用它:
```
-
-
$ echo "npm run build" | at now + 1 minute
$ echo "backup-db" | at 13:00
-
```
-There are many ways of specifying time. From absolute time, such as `10:00` through relative time, such as `now + 2 hours`, to special times such as `noon` or `midnight`. We can combine it with `notify-send` to show ourselves reminders at some time in the future. For example:
-
+有许多指定时间的方法。 从绝对时间,如 `10:00`,到相对时间,如 `now + 2 hours` ,再特殊时间,如`noon` 或 `midnight`。我们可以把它和 `notify-send` 结合起来,在未来的某个时间向自己发送提醒。例如:
```
-`$ echo "notify-send 'Stop it and go home now?' 'Enough work for today.' -u critical" | at now`
+$ echo "notify-send 'Stop it and go home now?' 'Enough work for today.' -u critical" | at now
```
![Stop for the day notification][6]
-(Tomasz Waraksa, CC BY-SA 4.0)
-
-### The remind command
-
-Now, build a custom Bash command for sending yourself reminders. How about something as simple and human-friendly as:
+### 提醒的命令
+现在,建立一个自定义的 Bash 命令来给自己发送提醒信息。像这样简单且人性化的命令:
```
-
-
$ remind "I'm still here" now
$ remind "Time to wake up!" in 5 minutes
$ remind "Dinner" in 1 hour
$ remind "Take a break" at noon
$ remind "It's Friday pints time!" at 17:00
-
```
-This is better than Alexa! How to get this goodness?
+这比 Alexa 更好!该怎样做?
-See the code below. It defines a shell function called **remind**, which supports the above syntax. The actual work is done in the last two lines. The rest is responsible for help, parameter validation, etc., which roughly matches the proportion of useful code vs. necessary white-noise in any large application.
-
-Save the code somewhere, for example, in the `~/bin/remind` file, and source the function in your `.bashrc` profile so that it's loaded when you log in:
+请看下面的代码。它定义了一个名为 `remind` 的函数,它支持上述语法。实际工作是在最后两行完成的。其余的部分负责显示帮助信息、参数校验等,这与任何大型应用程序中有用的代码与必要的白噪声的比例大致相同。
+把代码保存在某个地方,例如,在 `~/bin/remind` 文件中,并在你的 `.bashrc` 配置文件写入该函数,以便在你登录时加载它:
```
-`$ source ~/bin/remind`
+$ source ~/bin/remind
```
-Reload the terminal, then type remind to see the syntax. Enjoy!
-
+重新打开终端,然后输入 `remind` 来查看语法。尽情享受吧!
```
-
-
#!/usr/bin/env bash
function remind () {
local COUNT="$#"
@@ -195,13 +166,15 @@ function remind () {
```
-### Easy notifications
+### 简单的提醒
-With these few simple open source commands, you can integrate your own scripts, applications, and tasks with your desktop. Try it out!
+通过这几个简单的开源命令,你可以将你自己的脚本、应用程序和任务与你的桌面结合起来。试一试吧!
* * *
-_This article has been adapted with the author's permission from the original article, found [here][7]._
+(文内图片来自 Tomasz Waraksa, CC BY-SA 4.0)
+
+本文经作者许可改编自 [原文][7]。
--------------------------------------------------------------------------------
@@ -209,8 +182,8 @@ via: https://opensource.com/article/22/1/linux-desktop-notifications
作者:[Tomasz Waraksa][a]
选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
+译者:[mcfd](https://github.com/mcfd)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/published/20220115 Why use a Raspberry Pi to power your business.md b/published/20220115 Why use a Raspberry Pi to power your business.md
new file mode 100644
index 0000000000..e14dbdcdfb
--- /dev/null
+++ b/published/20220115 Why use a Raspberry Pi to power your business.md
@@ -0,0 +1,80 @@
+[#]: subject: "Why use a Raspberry Pi to power your business"
+[#]: via: "https://opensource.com/article/22/1/raspberry-pi-business"
+[#]: author: "Giuseppe Cassibba https://opensource.com/users/peppe8o"
+[#]: collector: "lujun9972"
+[#]: translator: "void-mori"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14829-1.html"
+
+为何要使用树莓派为你的业务提供动力
+======
+
+> 为何小小的单板机是智能工作以及小型办公室的未来。
+
+
+
+随着疫情的大流行,我们的工作方式也正在发生着改变。工作的分散化正在成为所有公司需要面临的一项重要挑战。
+
+### 智能办公室
+
+即使工厂认为智能办公仅仅是通过虚拟私有网络来对员工的笔记本电脑进行远程控制,再稍微增加一点进化也可以让一些基本的办公服务离人们更近一点,这些都能够极大降低数据中心的负载,并且提高人们的工作体验。这个方案还有一个额外的影响就是从信息和通信技术(ICT)上来说消除了许多单点故障。
+
+与其在公司外部有成百上千的工作场地,不如在世界范围内有着成百上千的小型办公室/分支,这就是所谓的“智能办公室”。
+
+这种表述可能会让许多 ICT 专家感到恐慌,因为这种文化使得每个办公室都与一台大机器(即服务器)联系在一起,即使分散计算资源的优势非常明显。
+
+### 一个不同的角度
+
+如果你能用一块 50 美元的小开发板提供一个大服务器的服务会怎么样?如果这个小板子只需要一张 SD 卡和一个普通的 USB 电源支持,那又会怎么样呢?这就是 [树莓派][2] 是最灵活的解决方案的原因所在。
+
+树莓派开发板是尺寸非常小的运行 Linux 的计算机。它有一个由树莓派基金会提供和维护的操作系统:树莓派操作系统。它基于 Debian,并与这个最知名的 Linux 发行版共享许多软件包。此外,许多树莓派的开发板能够完美运行最知名的 Ubuntu 服务器,它涵盖了 ARM 处理器支持,提供了对低功耗处理器的支持。
+
+但树莓派开发板对小公司来说也是一个很好的机会,以能够承担得起的代价获得大量的(开源)服务。但这种情况下,你必须考虑数据丢失的风险,因为你把所有的服务运行在一个小的、消费级的硬件上。不过设置正确的备份/恢复程序能够降低这些风险。
+
+### 你能从树莓派开发板上提供什么服务?
+
+大多数服务通常由更昂贵的服务器提供。这里的“大多数”取决于一些限制:
+
+ * **ARM 处理器:** 一些软件包只支持 x86/x64 处理器。这是最难克服的挑战之一。但另一方面,ARM 处理器的市场份额不断增长,使得程序员为他们的软件开发了兼容 ARM 处理器的版本。
+ * **内存容量:** 这是一个仅限于在复杂应用以复杂的方式进行复杂的计算的情况下讨论的问题。很多时候,这只不过是关于重新审查代码、拆分步骤,并保持简单高效的问题。此外,如果一个服务虽然只服务少数几个用户,但需要大量的内存/CPU,这大概也意味着此服务没有正常工作。这可能是你消除浪费资源的旧问题的一个机会。最后,最新的树莓派开发板把内存容量升级到了 8GB,这是一个很大的提升。
+ * **对服务器没有经验的用户:** 这是另一个问题,你可以在基础镜像所在的树莓派的 micro-SD 卡中存储系统和运行数据。
+
+也就是说,你能够用树莓派做很多有趣的事情。在 [我的博客][4] 里,我通过运行各种服务进行了测试 —— 从基本的 LAMP 服务器到复杂的 CRM。从简单到复杂系统,全部都是开源的,例如:
+
+ * 代理服务器(也能够添加广告拦截服务)
+ * 电子邮件服务器
+ * 打印服务器
+ * [酒店管理][5]
+ * 联系关系管理(CRM)
+ * [私人社交网络][6]
+ * 私人论坛
+ * 私有 Git 门户网站
+ * 网络监控服务器
+ * [许多其他有用的服务][7]
+
+对树莓派来说,另一个有趣的用法是在你的远程办公室获得提供高级服务的 Wi-Fi 热点,并且可以从它的以太网端口进行控制。
+
+最后,[树莓派也能够运行容器][8],这是一个额外的工具,从这个不可思议的开发板中获得一个可用的服务世界。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/22/1/raspberry-pi-business
+
+作者:[Giuseppe Cassibba][a]
+选题:[lujun9972][b]
+译者:[void-mori](https://github.com/void-mori)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/peppe8o
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/BIZ_WorkInPublic_4618517_1110_CS_A.png?itok=RwVrWArk "A chair in a field."
+[2]: https://opensource.com/resources/raspberry-pi
+[3]: https://enterprisersproject.com/article/2020/11/raspberry-pi-7-enterprise-it-uses
+[4]: https://peppe8o.com
+[5]: https://opensource.com/article/20/4/qloapps-raspberry-pi
+[6]: https://opensource.com/article/20/3/raspberry-pi-open-source-social
+[7]: https://peppe8o.com/category/raspberrypi/
+[8]: https://opensource.com/article/20/8/kubernetes-raspberry-pi
diff --git a/published/20220214 A guide to Kubernetes architecture.md b/published/20220214 A guide to Kubernetes architecture.md
new file mode 100644
index 0000000000..ca87e0e93c
--- /dev/null
+++ b/published/20220214 A guide to Kubernetes architecture.md
@@ -0,0 +1,165 @@
+[#]: subject: "A guide to Kubernetes architecture"
+[#]: via: "https://opensource.com/article/22/2/kubernetes-architecture"
+[#]: author: "Nived Velayudhan https://opensource.com/users/nivedv"
+[#]: collector: "lujun9972"
+[#]: translator: "MjSeven"
+[#]: reviewer: "turbokernel"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14789-1.html"
+
+Kubernetes 架构指南
+======
+
+> 了解 Kubernetes 架构中不同组件是如何组合在一起的,这样你就可以更好地排查问题、维护一个健康的集群,以及优化工作流。
+
+
+
+使用 Kubernetes 来编排容器,这种描述说起来简单,但理解它的实际含义以及如何实现它完全是另外一回事。如果你正在运行或管理 Kubernetes 集群,那么你就会知道 Kubernetes 由一台称为 “控制平面” 的机器和许多其他 工作节点 机器组成。每种类型都有一个复杂但稳定的堆栈,这使编排成为可能,熟悉每个组件有助于理解它是如何工作的。
+
+![Kubernetes 架构图][2]
+
+*(Nived Velayudhan, [CC BY-SA 4.0][3])*
+
+### 控制平面组件
+
+Kubernetes 安装在一个称为“控制平面”的机器上,它会运行 Kubernetes 守护进程,并在启动容器和容器组时与之通信。下面介绍控制平面的各个组件。
+
+#### etcd
+
+etcd 是一种快速、分布式一致性键值存储器,用作 Kubernetes 对象数据的持久存储,如容器组、副本控制器、密钥和服务。etcd 是 Kubernetes 存储集群状态和元数据的唯一地方。唯一与 etcd 直连的组件是 Kubernetes API 服务器。其他所有组件都通过 API 服务器间接的从 etcd 读写数据。
+
+etcd 还实现了一个监控功能,它提供了一个基于事件的接口,用于异步监控键的更改。一旦你更改了一个键,它的监控者就会收到通知。API 服务器组件严重依赖于此来获得通知,并将 etcd 变更至期望状态。
+
+_为什么 etcd 实例的数量应该是奇数?_
+
+你通常会运行三个、五个或七个 etcd 实例实现高可用(HA)环境,但这是为什么呢?因为 etcd 是分布式数据存储,可以水平扩展它,但你需要确保每个实例中的数据是一致的。因此,需要为系统当前状态达成共识,etcd 为此使用 [RAFT 共识算法][4]。
+
+RAFT 算法需要经过选举(或仲裁)集群才能进入下一个状态。如果你只有两个 etcd 实例并且他们其中一个失败的话,那么 etcd 集群无法转换到新的状态,因为不存在过半这个概念。如果你有三个 etcd 实例,一个实例可能会失败,但仍有 2 个实例可用于进行选举。
+
+#### API 服务器
+
+API 服务器是 Kubernetes 中唯一直接与 etcd 交互的组件。Kubernetes 中的其他所有组件都必须通过 API 服务器来处理集群状态,包括客户端(kubectl)。API 服务器具有以下功能:
+
+ * 提供在 etcd 中存储对象的一致方式。
+ * 执行验证对象,防止客户端存储配置不正确的对象(如果它们直接写入 etcd 数据存储,可能会发生这种情况)。
+ * 提供 RESTful API 来创建、更新、修改或删除资源。
+ * 提供 [乐观并发锁][5],在发生更新时,其他客户端永远不会有机会重写对象。
+ * 对客户端发送的请求进行身份验证和授权。它使用插件提取客户端的用户名、ID、所属组,并确定通过身份验证的用户是否可以对请求的资源执行请求的操作。
+ * 如果请求试图创建、修改或删除资源,则负责 [权限控制][6]。例如,AlwaysPullImages、DefaultStorageClass 和 ResourceQuota。
+ * 实现了一种监控机制(类似于 etcd),用户客户端监控更改。这允许调度器和控制器管理器等组件以松耦合的方式与 API 服务器交互。
+
+#### 控制器管理器
+
+在 Kubernetes 中,控制器持续监控集群状态,然后根据需要进行或请求更改。每个控制器都尝试将当前集群状态变更至期望状态。控制器至少跟踪一种 Kubernetes 资源类型,这些对象均有一个字段来表示期望的状态。
+
+控制器示例:
+
+ * 副本管理器(管理副本控制器资源的控制器)
+ * 副本集、守护进程集 和任务控制器
+ * 部署控制器
+ * 有状态负载控制器
+ * 节点控制器
+ * 服务控制器
+ * 接入点控制器
+ * 命名空间控制器
+ * 持久卷控制器
+
+控制器通过监控机制来获得变更通知。它们监视 API 服务器对资源的变更,对每次更改执行操作,无论是新建对象还是更新或删除现有对象。大多数时候,这些操作包括创建其他资源或更新监控的资源本身。不过,由于使用监控并不能保证控制器不会错过任何事件,它们还会定期执行一系列操作,确保没有错过任何事件。
+
+控制器管理器还执行生命周期功能。例如命名空间创建和生命周期、事件垃圾收集、已终止容器组垃圾收集、[级联删除垃圾收集][7] 和节点垃圾收集。有关更多信息,参考 [云控制器管理器][8]。
+
+#### 调度器
+
+调度器是一个将容器组分配给节点的控制平面进程。它会监视新创建没有分配节点的容器组。调度器会给每个发现的容器组分配运行它的最佳节点。
+
+满足容器组调度要求的节点称为可调度节点。如果没有合适的节点,那么容器组会一直处于未调度状态,直到调度器可以安置它。一旦找到可调度节点,它就会运行一组函数来对节点进行评分,并选择得分最高的节点,然后它会告诉 API 服务器所选节点的信息。这个过程称为绑定。
+
+节点的选择分为两步:
+
+ 1. 过滤所有节点的列表,获得可以调度容器组的节点列表(例如,PodFitsResources 过滤器检查候选节点是否有足够的可用资源来满足容器组的特定资源请求)。
+ 2. 对第一步得到的节点列表进行评分和排序,选择最佳节点。如果得分最高的有多个节点,循环过程可确保容器组会均匀地部署在所有节点上。
+
+调度决策要考虑的因素包括:
+
+ * 容器组是否请求硬件/软件资源?节点是否报告内存或磁盘压力情况?
+ * 节点是否有与容器组规范中的节点选择器匹配的标签?
+ * 如果容器组请求绑定到特定地主机端口,该端口是否可用?
+ * 容器组是否容忍节点的污点?
+ * 容器组是否指定节点亲和性或反亲和性规则?
+
+调度器不会指示所选节点运行容器组。调度器所做的就是通过 API 服务器更新容器组定义。然后 API 服务器通过监控机制通知 kubelet 容器组已被调度,然后目标节点上的 kubelet 服务看到容器组被调度到它的节点,它创建并运行容器组。
+
+### 工作节点组件
+
+工作节点运行 kubelet 代理,这允许控制平面接纳它们来处理负载。与控制平面类似,工作节点使用几个不同的组件来实现这一点。 以下部分描述了工作节点组件。
+
+#### Kubelet
+
+Kubelet 是一个运行在集群中每个节点上的代理,负责在工作节点上运行的所有事情。它确保容器在吊舱中运行。
+
+kubelet服务的主要功能有:
+
+ * 通过在 API 服务器中创建节点资源来注册它正在运行的节点。
+ * 持续监控 API 服务器上调度到节点的容器组。
+ * 使用配置的容器运行时启动容器组的容器。
+ * 持续监控正在运行的容器,并将其状态、事件和资源消耗报告给 API 服务器。
+ * 运行容器存活探测,在探测失败时重启容器,当 API 服务器中删除容器组时终止(通知服务器容器组终止的消息)。
+
+#### 服务代理
+
+服务代理(kube-proxy)在每个节点上运行,确保一个容器组可以与另一个容器组通讯,一个节点可以与另一个节点对话,一个容器可以与另一个容器对话。它负责监视 API 服务器对服务和容器组定义的更改,以保持整个网络配置是最新的。当一项服务得到多个容器组的支持时,代理会在这些容器组之间执行负载平衡。
+
+kube-proxy 之所以叫代理,是因为它最初实际上是一个代理服务器,用于接受连接并将它们代理到容器组。当前的实现是使用 iptables 规则将数据包重定向到随机选择的后端容器组,而无需通过实际的代理服务器。
+
+关于它工作原理的高级视图:
+
+ * 当你创建一个服务时,会立即分配一个虚拟 IP 地址。
+ * API 服务器会通知在工作节点上运行的 kube-proxy 代理有一个新服务。
+ * 每个 kube-proxy 通过设置 iptables 规则使服务可寻址,确保截获每个服务 IP/端口对,并将目的地址修改为支持服务的一个容器组。
+ * 监控 API 服务器对服务或其端点对象的更改。
+
+#### 容器运行时
+
+容器运行时有两类:
+
+ * **较低级别的容器运行时:** 它们主要关注运行中的容器并为容器设置命名空间和控制组。
+ * **更高级别的容器运行时(容器引擎):** 它们专注于格式、解包、管理、共享镜像以及为开发人员提供 API。
+
+容器运行时负责:
+
+ * 如果容器镜像本地不存在,则从镜像仓库中提取。
+ * 将镜像解压到写时复制文件系统,所有容器层叠加创建一个合并的文件系统。
+ * 准备一个容器挂载点。
+ * 设置容器镜像的元数据,如覆盖命令、用户输入的入口命令,并设置 SECCOMP 规则,确保容器按预期运行。
+ * 通知内核将进程、网络和文件系统等隔离分配给容器。
+ * 通知内核分配一些资源限制,如 CPU 或内存限制。
+ * 将系统调用(syscall)传递给内核启动容器。
+ * 确保 SElinux/AppArmor 设置正确。
+
+### 协同
+
+系统级组件协同工作,确保 Kubernetes 集群的每个部分都能实现其目和执行其功能。当你深入编辑 [YAML 文件][10] 时,有时很难理解请求是如何在集群中通信的。现在你已经了解了各个部分是如何组合在一起的,你可以更好地理解 Kubernetes 内部发生了什么,这有助于诊断问题、维护健康的集群并优化你的工作流。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/22/2/kubernetes-architecture
+
+作者:[Nived Velayudhan][a]
+选题:[lujun9972][b]
+译者:[MjSeven](https://github.com/MjSeven)
+校对:[turbokernel](https://github.com/turbokernel)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/nivedv
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/containers_modules_networking_hardware_parts.png?itok=rPpVj92- (Parts, modules, containers for software)
+[2]: https://opensource.com/sites/default/files/uploads/kubernetes-architecture-diagram.png (Kubernetes architecture diagram)
+[3]: https://creativecommons.org/licenses/by-sa/4.0/
+[4]: https://www.geeksforgeeks.org/raft-consensus-algorithm/
+[5]: https://stackoverflow.com/questions/52910322/kubernetes-resource-versioning#:~:text=Optimistic%20concurrency%20control%20\(sometimes%20referred,updated%2C%20the%20version%20number%20increases.
+[6]: https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/
+[7]: https://kubernetes.io/docs/concepts/architecture/garbage-collection/
+[8]: https://kubernetes.io/docs/concepts/architecture/cloud-controller/
+[9]: https://www.redhat.com/architect/how-kubernetes-creates-runs-containers
+[10]: https://www.redhat.com/sysadmin/yaml-beginners
diff --git a/published/20180523 Creating random, secure passwords in Go.md b/published/202205/20180523 Creating random, secure passwords in Go.md
similarity index 100%
rename from published/20180523 Creating random, secure passwords in Go.md
rename to published/202205/20180523 Creating random, secure passwords in Go.md
diff --git a/published/20180529 Build a concurrent TCP server in Go.md b/published/202205/20180529 Build a concurrent TCP server in Go.md
similarity index 100%
rename from published/20180529 Build a concurrent TCP server in Go.md
rename to published/202205/20180529 Build a concurrent TCP server in Go.md
diff --git a/translated/tech/20180625 3 ways to copy files in Go.md b/published/202205/20180625 3 ways to copy files in Go.md
similarity index 93%
rename from translated/tech/20180625 3 ways to copy files in Go.md
rename to published/202205/20180625 3 ways to copy files in Go.md
index b362d05e2f..7a6d0a1647 100644
--- a/translated/tech/20180625 3 ways to copy files in Go.md
+++ b/published/202205/20180625 3 ways to copy files in Go.md
@@ -3,17 +3,16 @@
[#]: author: "Mihalis Tsoukalos https://opensource.com/users/mtsouk"
[#]: collector: "lkxed"
[#]: translator: "lkxed"
-[#]: reviewer: " "
-[#]: publisher: " "
-[#]: url: " "
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14658-1.html"
在 Go 中复制文件的三种方法
======
-本文是 Go 系列的第三篇文章,我将介绍三种最流行的复制文件的方法。
-![][1]
+
-图源:Opensource.com
+> 本文是 Go 系列的第三篇文章,我将介绍三种最流行的复制文件的方法。
本文将介绍展示如何使用 [Go 编程语言][3] 来复制文件。在 Go 中复制文件的方法有很多,我只介绍三种最常见的:使用 Go 库中的 `io.Copy()` 函数调用、一次读取输入文件并将其写入另一个文件,以及使用缓冲区一块块地复制文件。
@@ -85,7 +84,7 @@ if err != nil {
}
```
-上述代码包括了两个 if 代码块(嗯,用 Go 写程序就是这样的),程序的实际功能其实体现在 `ioutil.ReadFile()` 和 `ioutil.WriteFile()` 这两行代码中。
+上述代码包括了两个 `if` 代码块(嗯,用 Go 写程序就是这样的),程序的实际功能其实体现在 `ioutil.ReadFile()` 和 `ioutil.WriteFile()` 这两行代码中。
运行 `cp2.go`,你会得到下面的输出:
@@ -204,7 +203,7 @@ via: https://opensource.com/article/18/6/copying-files-go
作者:[Mihalis Tsoukalos][a]
选题:[lkxed][b]
译者:[lkxed](https://github.com/lkxed)
-校对:[校对者ID](https://github.com/校对者ID)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/published/20190404 Why you should choose mindfulness over multitasking.md b/published/202205/20190404 Why you should choose mindfulness over multitasking.md
similarity index 100%
rename from published/20190404 Why you should choose mindfulness over multitasking.md
rename to published/202205/20190404 Why you should choose mindfulness over multitasking.md
diff --git a/published/20200303 Watching activity on Linux with watch and tail commands.md b/published/202205/20200303 Watching activity on Linux with watch and tail commands.md
similarity index 100%
rename from published/20200303 Watching activity on Linux with watch and tail commands.md
rename to published/202205/20200303 Watching activity on Linux with watch and tail commands.md
diff --git a/published/20200807 A Beginner-s Guide to Open Source.md b/published/202205/20200807 A Beginner-s Guide to Open Source.md
similarity index 100%
rename from published/20200807 A Beginner-s Guide to Open Source.md
rename to published/202205/20200807 A Beginner-s Guide to Open Source.md
diff --git a/published/20210102 Explore the night sky with this open source astronomy app.md b/published/202205/20210102 Explore the night sky with this open source astronomy app.md
similarity index 100%
rename from published/20210102 Explore the night sky with this open source astronomy app.md
rename to published/202205/20210102 Explore the night sky with this open source astronomy app.md
diff --git a/published/20210111 9 Decentralized, P2P and Open Source Alternatives to Mainstream Social Media Platforms Like Twitter, Facebook, YouTube and Reddit.md b/published/202205/20210111 9 Decentralized, P2P and Open Source Alternatives to Mainstream Social Media Platforms Like Twitter, Facebook, YouTube and Reddit.md
similarity index 100%
rename from published/20210111 9 Decentralized, P2P and Open Source Alternatives to Mainstream Social Media Platforms Like Twitter, Facebook, YouTube and Reddit.md
rename to published/202205/20210111 9 Decentralized, P2P and Open Source Alternatives to Mainstream Social Media Platforms Like Twitter, Facebook, YouTube and Reddit.md
diff --git a/published/20210112 8 tips for the Linux command line.md b/published/202205/20210112 8 tips for the Linux command line.md
similarity index 100%
rename from published/20210112 8 tips for the Linux command line.md
rename to published/202205/20210112 8 tips for the Linux command line.md
diff --git a/published/20210122 Convert your filesystem to Btrfs.md b/published/202205/20210122 Convert your filesystem to Btrfs.md
similarity index 100%
rename from published/20210122 Convert your filesystem to Btrfs.md
rename to published/202205/20210122 Convert your filesystem to Btrfs.md
diff --git a/published/20210211 31 open source text editors you need to try.md b/published/202205/20210211 31 open source text editors you need to try.md
similarity index 100%
rename from published/20210211 31 open source text editors you need to try.md
rename to published/202205/20210211 31 open source text editors you need to try.md
diff --git a/published/20210305 Build a printer UI for Raspberry Pi with XML and Java.md b/published/202205/20210305 Build a printer UI for Raspberry Pi with XML and Java.md
similarity index 100%
rename from published/20210305 Build a printer UI for Raspberry Pi with XML and Java.md
rename to published/202205/20210305 Build a printer UI for Raspberry Pi with XML and Java.md
diff --git a/published/20210310 Troubleshoot WiFi problems with Go and a Raspberry Pi.md b/published/202205/20210310 Troubleshoot WiFi problems with Go and a Raspberry Pi.md
similarity index 100%
rename from published/20210310 Troubleshoot WiFi problems with Go and a Raspberry Pi.md
rename to published/202205/20210310 Troubleshoot WiFi problems with Go and a Raspberry Pi.md
diff --git a/published/20210323 WebAssembly Security, Now and in the Future.md b/published/202205/20210323 WebAssembly Security, Now and in the Future.md
similarity index 100%
rename from published/20210323 WebAssembly Security, Now and in the Future.md
rename to published/202205/20210323 WebAssembly Security, Now and in the Future.md
diff --git a/published/20210428 Share files between Linux and Windows computers.md b/published/202205/20210428 Share files between Linux and Windows computers.md
similarity index 100%
rename from published/20210428 Share files between Linux and Windows computers.md
rename to published/202205/20210428 Share files between Linux and Windows computers.md
diff --git a/published/20210615 Listen to music on FreeDOS.md b/published/202205/20210615 Listen to music on FreeDOS.md
similarity index 100%
rename from published/20210615 Listen to music on FreeDOS.md
rename to published/202205/20210615 Listen to music on FreeDOS.md
diff --git a/published/20210617 Linux package management with dnf.md b/published/202205/20210617 Linux package management with dnf.md
similarity index 100%
rename from published/20210617 Linux package management with dnf.md
rename to published/202205/20210617 Linux package management with dnf.md
diff --git a/published/20210624 Linux package management with apt.md b/published/202205/20210624 Linux package management with apt.md
similarity index 100%
rename from published/20210624 Linux package management with apt.md
rename to published/202205/20210624 Linux package management with apt.md
diff --git a/published/20210710 A new open source operating system for embedded systems.md b/published/202205/20210710 A new open source operating system for embedded systems.md
similarity index 100%
rename from published/20210710 A new open source operating system for embedded systems.md
rename to published/202205/20210710 A new open source operating system for embedded systems.md
diff --git a/published/20211213 How I use open source to design my own card games.md b/published/202205/20211213 How I use open source to design my own card games.md
similarity index 100%
rename from published/20211213 How I use open source to design my own card games.md
rename to published/202205/20211213 How I use open source to design my own card games.md
diff --git a/published/20220113 Learn Rust in 2022.md b/published/202205/20220113 Learn Rust in 2022.md
similarity index 100%
rename from published/20220113 Learn Rust in 2022.md
rename to published/202205/20220113 Learn Rust in 2022.md
diff --git a/published/20220212 5 levels of transparency for open source communities.md b/published/202205/20220212 5 levels of transparency for open source communities.md
similarity index 100%
rename from published/20220212 5 levels of transparency for open source communities.md
rename to published/202205/20220212 5 levels of transparency for open source communities.md
diff --git a/published/20220219 Crop and resize photos on Linux with Gwenview.md b/published/202205/20220219 Crop and resize photos on Linux with Gwenview.md
similarity index 100%
rename from published/20220219 Crop and resize photos on Linux with Gwenview.md
rename to published/202205/20220219 Crop and resize photos on Linux with Gwenview.md
diff --git a/published/20220221 3 steps to start running containers today.md b/published/202205/20220221 3 steps to start running containers today.md
similarity index 100%
rename from published/20220221 3 steps to start running containers today.md
rename to published/202205/20220221 3 steps to start running containers today.md
diff --git a/published/20220327 Top 10 Linux Distributions for Programmers in 2022 -Featured.md b/published/202205/20220327 Top 10 Linux Distributions for Programmers in 2022 -Featured.md
similarity index 100%
rename from published/20220327 Top 10 Linux Distributions for Programmers in 2022 -Featured.md
rename to published/202205/20220327 Top 10 Linux Distributions for Programmers in 2022 -Featured.md
diff --git a/published/20220414 A guide to JVM parameters for Java developers.md b/published/202205/20220414 A guide to JVM parameters for Java developers.md
similarity index 100%
rename from published/20220414 A guide to JVM parameters for Java developers.md
rename to published/202205/20220414 A guide to JVM parameters for Java developers.md
diff --git a/published/20220419 Difference Between Ubuntu 22.04 and Ubuntu 20.04 LTS.md b/published/202205/20220419 Difference Between Ubuntu 22.04 and Ubuntu 20.04 LTS.md
similarity index 100%
rename from published/20220419 Difference Between Ubuntu 22.04 and Ubuntu 20.04 LTS.md
rename to published/202205/20220419 Difference Between Ubuntu 22.04 and Ubuntu 20.04 LTS.md
diff --git a/published/20220422 Documentation Isn’t Just Another Aspect of Open Source Development.md b/published/202205/20220422 Documentation Isn’t Just Another Aspect of Open Source Development.md
similarity index 100%
rename from published/20220422 Documentation Isn’t Just Another Aspect of Open Source Development.md
rename to published/202205/20220422 Documentation Isn’t Just Another Aspect of Open Source Development.md
diff --git a/published/20220423 5 Less Popular Features that Make Ubuntu 22.04 LTS an Epic Release.md b/published/202205/20220423 5 Less Popular Features that Make Ubuntu 22.04 LTS an Epic Release.md
similarity index 100%
rename from published/20220423 5 Less Popular Features that Make Ubuntu 22.04 LTS an Epic Release.md
rename to published/202205/20220423 5 Less Popular Features that Make Ubuntu 22.04 LTS an Epic Release.md
diff --git a/published/20220425 Exciting New Features Revealed for KDE Plasma 5.25- Take a Look Here.md b/published/202205/20220425 Exciting New Features Revealed for KDE Plasma 5.25- Take a Look Here.md
similarity index 100%
rename from published/20220425 Exciting New Features Revealed for KDE Plasma 5.25- Take a Look Here.md
rename to published/202205/20220425 Exciting New Features Revealed for KDE Plasma 5.25- Take a Look Here.md
diff --git a/published/20220425 Linux Mint Upgrade Tool - Here-s How it Works.md b/published/202205/20220425 Linux Mint Upgrade Tool - Here-s How it Works.md
similarity index 100%
rename from published/20220425 Linux Mint Upgrade Tool - Here-s How it Works.md
rename to published/202205/20220425 Linux Mint Upgrade Tool - Here-s How it Works.md
diff --git a/published/20220426 How to Upgrade to Pop OS 22.04 LTS from 21.10 -Step by Step.md b/published/202205/20220426 How to Upgrade to Pop OS 22.04 LTS from 21.10 -Step by Step.md
similarity index 100%
rename from published/20220426 How to Upgrade to Pop OS 22.04 LTS from 21.10 -Step by Step.md
rename to published/202205/20220426 How to Upgrade to Pop OS 22.04 LTS from 21.10 -Step by Step.md
diff --git a/published/20220427 10 Reasons to Run Linux in Virtual Machines.md b/published/202205/20220427 10 Reasons to Run Linux in Virtual Machines.md
similarity index 100%
rename from published/20220427 10 Reasons to Run Linux in Virtual Machines.md
rename to published/202205/20220427 10 Reasons to Run Linux in Virtual Machines.md
diff --git a/published/20220427 Bloomberg Open Sources Memray, A Python Memory Profiler.md b/published/202205/20220427 Bloomberg Open Sources Memray, A Python Memory Profiler.md
similarity index 100%
rename from published/20220427 Bloomberg Open Sources Memray, A Python Memory Profiler.md
rename to published/202205/20220427 Bloomberg Open Sources Memray, A Python Memory Profiler.md
diff --git a/published/20220427 Hands on With GNOME-s New Text Editor for Linux Users.md b/published/202205/20220427 Hands on With GNOME-s New Text Editor for Linux Users.md
similarity index 100%
rename from published/20220427 Hands on With GNOME-s New Text Editor for Linux Users.md
rename to published/202205/20220427 Hands on With GNOME-s New Text Editor for Linux Users.md
diff --git a/published/20220427 How I grew my product management career with open source.md b/published/202205/20220427 How I grew my product management career with open source.md
similarity index 100%
rename from published/20220427 How I grew my product management career with open source.md
rename to published/202205/20220427 How I grew my product management career with open source.md
diff --git a/published/20220427 Shortwave 3.0 is Here With UI Upgrades, Private Stations, and More Improvements.md b/published/202205/20220427 Shortwave 3.0 is Here With UI Upgrades, Private Stations, and More Improvements.md
similarity index 100%
rename from published/20220427 Shortwave 3.0 is Here With UI Upgrades, Private Stations, and More Improvements.md
rename to published/202205/20220427 Shortwave 3.0 is Here With UI Upgrades, Private Stations, and More Improvements.md
diff --git a/published/20220428 Archinstall-s New Menu System Makes it Even Easier to Install Arch Linux.md b/published/202205/20220428 Archinstall-s New Menu System Makes it Even Easier to Install Arch Linux.md
similarity index 100%
rename from published/20220428 Archinstall-s New Menu System Makes it Even Easier to Install Arch Linux.md
rename to published/202205/20220428 Archinstall-s New Menu System Makes it Even Easier to Install Arch Linux.md
diff --git a/published/20220428 Elon Musk’s Plan To Open Source The Twitter Algorithm Has Flaws.md b/published/202205/20220428 Elon Musk’s Plan To Open Source The Twitter Algorithm Has Flaws.md
similarity index 100%
rename from published/20220428 Elon Musk’s Plan To Open Source The Twitter Algorithm Has Flaws.md
rename to published/202205/20220428 Elon Musk’s Plan To Open Source The Twitter Algorithm Has Flaws.md
diff --git a/published/20220428 How to Remove Snap Packages in Ubuntu Linux.md b/published/202205/20220428 How to Remove Snap Packages in Ubuntu Linux.md
similarity index 100%
rename from published/20220428 How to Remove Snap Packages in Ubuntu Linux.md
rename to published/202205/20220428 How to Remove Snap Packages in Ubuntu Linux.md
diff --git a/published/20220428 Why use Apache Druid for your open source analytics database.md b/published/202205/20220428 Why use Apache Druid for your open source analytics database.md
similarity index 100%
rename from published/20220428 Why use Apache Druid for your open source analytics database.md
rename to published/202205/20220428 Why use Apache Druid for your open source analytics database.md
diff --git a/published/20220429 Detect a Phishing URL Using Machine Learning in Python.md b/published/202205/20220429 Detect a Phishing URL Using Machine Learning in Python.md
similarity index 100%
rename from published/20220429 Detect a Phishing URL Using Machine Learning in Python.md
rename to published/202205/20220429 Detect a Phishing URL Using Machine Learning in Python.md
diff --git a/published/20220430 Hands On With GNOME’s New Terminal for Linux Users.md b/published/202205/20220430 Hands On With GNOME’s New Terminal for Linux Users.md
similarity index 100%
rename from published/20220430 Hands On With GNOME’s New Terminal for Linux Users.md
rename to published/202205/20220430 Hands On With GNOME’s New Terminal for Linux Users.md
diff --git a/published/20220430 How to Install h.264 decoder on Ubuntu Linux.md b/published/202205/20220430 How to Install h.264 decoder on Ubuntu Linux.md
similarity index 100%
rename from published/20220430 How to Install h.264 decoder on Ubuntu Linux.md
rename to published/202205/20220430 How to Install h.264 decoder on Ubuntu Linux.md
diff --git a/published/20220430 Rust-based Redox OS 0.7.0 Arrives with Enhanced Hardware Support.md b/published/202205/20220430 Rust-based Redox OS 0.7.0 Arrives with Enhanced Hardware Support.md
similarity index 100%
rename from published/20220430 Rust-based Redox OS 0.7.0 Arrives with Enhanced Hardware Support.md
rename to published/202205/20220430 Rust-based Redox OS 0.7.0 Arrives with Enhanced Hardware Support.md
diff --git a/published/20220501 How to Install Classic GNOME Flashback in Ubuntu 22.04 LTS.md b/published/202205/20220501 How to Install Classic GNOME Flashback in Ubuntu 22.04 LTS.md
similarity index 100%
rename from published/20220501 How to Install Classic GNOME Flashback in Ubuntu 22.04 LTS.md
rename to published/202205/20220501 How to Install Classic GNOME Flashback in Ubuntu 22.04 LTS.md
diff --git a/published/20220502 How to make community recognition more inclusive.md b/published/202205/20220502 How to make community recognition more inclusive.md
similarity index 100%
rename from published/20220502 How to make community recognition more inclusive.md
rename to published/202205/20220502 How to make community recognition more inclusive.md
diff --git a/published/20220502 Microsoft Joins The Open 3D Foundation For Open Source 3D Development.md b/published/202205/20220502 Microsoft Joins The Open 3D Foundation For Open Source 3D Development.md
similarity index 100%
rename from published/20220502 Microsoft Joins The Open 3D Foundation For Open Source 3D Development.md
rename to published/202205/20220502 Microsoft Joins The Open 3D Foundation For Open Source 3D Development.md
diff --git a/published/20220502 Tools You Can Use for the Security Audit of IoT Devices.md b/published/202205/20220502 Tools You Can Use for the Security Audit of IoT Devices.md
similarity index 100%
rename from published/20220502 Tools You Can Use for the Security Audit of IoT Devices.md
rename to published/202205/20220502 Tools You Can Use for the Security Audit of IoT Devices.md
diff --git a/published/20220502 Ubuntu’s Unity Desktop Still Lives- Version 7.6 is Available for Testing After 6 Years.md b/published/202205/20220502 Ubuntu’s Unity Desktop Still Lives- Version 7.6 is Available for Testing After 6 Years.md
similarity index 100%
rename from published/20220502 Ubuntu’s Unity Desktop Still Lives- Version 7.6 is Available for Testing After 6 Years.md
rename to published/202205/20220502 Ubuntu’s Unity Desktop Still Lives- Version 7.6 is Available for Testing After 6 Years.md
diff --git a/published/20220503 Nvidia Begins To Set The Foundation For Future Open And Parallel Coding.md b/published/202205/20220503 Nvidia Begins To Set The Foundation For Future Open And Parallel Coding.md
similarity index 100%
rename from published/20220503 Nvidia Begins To Set The Foundation For Future Open And Parallel Coding.md
rename to published/202205/20220503 Nvidia Begins To Set The Foundation For Future Open And Parallel Coding.md
diff --git a/published/20220503 Package Analysis Examines Packages In Open Source Repositories In Real Time.md b/published/202205/20220503 Package Analysis Examines Packages In Open Source Repositories In Real Time.md
similarity index 100%
rename from published/20220503 Package Analysis Examines Packages In Open Source Repositories In Real Time.md
rename to published/202205/20220503 Package Analysis Examines Packages In Open Source Repositories In Real Time.md
diff --git a/published/20220504 ESI Group Collaborates With ENSAM, Open Sources Its “Inspector” Software.md b/published/202205/20220504 ESI Group Collaborates With ENSAM, Open Sources Its “Inspector” Software.md
similarity index 100%
rename from published/20220504 ESI Group Collaborates With ENSAM, Open Sources Its “Inspector” Software.md
rename to published/202205/20220504 ESI Group Collaborates With ENSAM, Open Sources Its “Inspector” Software.md
diff --git a/published/20220504 Firefox 100 Marks 17 Years of Development with Interesting Upgrades.md b/published/202205/20220504 Firefox 100 Marks 17 Years of Development with Interesting Upgrades.md
similarity index 100%
rename from published/20220504 Firefox 100 Marks 17 Years of Development with Interesting Upgrades.md
rename to published/202205/20220504 Firefox 100 Marks 17 Years of Development with Interesting Upgrades.md
diff --git a/published/20220504 How I manage my own virtual network with ZeroTier.md b/published/202205/20220504 How I manage my own virtual network with ZeroTier.md
similarity index 100%
rename from published/20220504 How I manage my own virtual network with ZeroTier.md
rename to published/202205/20220504 How I manage my own virtual network with ZeroTier.md
diff --git a/published/20220504 Microsoft’s 3D Movie Maker, First Released In 1995, Is Now Open Source.md b/published/202205/20220504 Microsoft’s 3D Movie Maker, First Released In 1995, Is Now Open Source.md
similarity index 100%
rename from published/20220504 Microsoft’s 3D Movie Maker, First Released In 1995, Is Now Open Source.md
rename to published/202205/20220504 Microsoft’s 3D Movie Maker, First Released In 1995, Is Now Open Source.md
diff --git a/published/20220504 elementary OS 7 Code Name Revealed. Here are the Details.md b/published/202205/20220504 elementary OS 7 Code Name Revealed. Here are the Details.md
similarity index 100%
rename from published/20220504 elementary OS 7 Code Name Revealed. Here are the Details.md
rename to published/202205/20220504 elementary OS 7 Code Name Revealed. Here are the Details.md
diff --git a/published/20220505 Experiment with containers and pods on your own computer.md b/published/202205/20220505 Experiment with containers and pods on your own computer.md
similarity index 100%
rename from published/20220505 Experiment with containers and pods on your own computer.md
rename to published/202205/20220505 Experiment with containers and pods on your own computer.md
diff --git a/published/20220505 Open Source Developer Creates First-of-its-Kind Fund To Support Maintainers.md b/published/202205/20220505 Open Source Developer Creates First-of-its-Kind Fund To Support Maintainers.md
similarity index 100%
rename from published/20220505 Open Source Developer Creates First-of-its-Kind Fund To Support Maintainers.md
rename to published/202205/20220505 Open Source Developer Creates First-of-its-Kind Fund To Support Maintainers.md
diff --git a/published/20220505 Tails 5.0 Release is Based on Debian 11 With a New -Kleopatra- Tool.md b/published/202205/20220505 Tails 5.0 Release is Based on Debian 11 With a New -Kleopatra- Tool.md
similarity index 100%
rename from published/20220505 Tails 5.0 Release is Based on Debian 11 With a New -Kleopatra- Tool.md
rename to published/202205/20220505 Tails 5.0 Release is Based on Debian 11 With a New -Kleopatra- Tool.md
diff --git a/published/20220505 Xebian – A Blend of Debian and Goodness of Xfce [Review].md b/published/202205/20220505 Xebian – A Blend of Debian and Goodness of Xfce [Review].md
similarity index 100%
rename from published/20220505 Xebian – A Blend of Debian and Goodness of Xfce [Review].md
rename to published/202205/20220505 Xebian – A Blend of Debian and Goodness of Xfce [Review].md
diff --git a/published/20220506 Announcing Fedora Linux 36.md b/published/202205/20220506 Announcing Fedora Linux 36.md
similarity index 100%
rename from published/20220506 Announcing Fedora Linux 36.md
rename to published/202205/20220506 Announcing Fedora Linux 36.md
diff --git a/published/20220506 My favorite open source tool for using crontab.md b/published/202205/20220506 My favorite open source tool for using crontab.md
similarity index 100%
rename from published/20220506 My favorite open source tool for using crontab.md
rename to published/202205/20220506 My favorite open source tool for using crontab.md
diff --git a/published/20220506 Ubuntu MATE’s Lead Creates a Nifty Tool to Help Install 3rd Party Deb Packages.md b/published/202205/20220506 Ubuntu MATE’s Lead Creates a Nifty Tool to Help Install 3rd Party Deb Packages.md
similarity index 100%
rename from published/20220506 Ubuntu MATE’s Lead Creates a Nifty Tool to Help Install 3rd Party Deb Packages.md
rename to published/202205/20220506 Ubuntu MATE’s Lead Creates a Nifty Tool to Help Install 3rd Party Deb Packages.md
diff --git a/published/20220508 How open source leads the way for sustainable technology.md b/published/202205/20220508 How open source leads the way for sustainable technology.md
similarity index 100%
rename from published/20220508 How open source leads the way for sustainable technology.md
rename to published/202205/20220508 How open source leads the way for sustainable technology.md
diff --git a/published/20220509 PyCaret- Machine Learning Model Development Made Easy.md b/published/202205/20220509 PyCaret- Machine Learning Model Development Made Easy.md
similarity index 100%
rename from published/20220509 PyCaret- Machine Learning Model Development Made Easy.md
rename to published/202205/20220509 PyCaret- Machine Learning Model Development Made Easy.md
diff --git a/published/20220510 Can’t Run AppImage on Ubuntu 22.04- Here’s How to Fix it.md b/published/202205/20220510 Can’t Run AppImage on Ubuntu 22.04- Here’s How to Fix it.md
similarity index 100%
rename from published/20220510 Can’t Run AppImage on Ubuntu 22.04- Here’s How to Fix it.md
rename to published/202205/20220510 Can’t Run AppImage on Ubuntu 22.04- Here’s How to Fix it.md
diff --git a/published/20220510 HydraPaper- A Wallpaper Manager for Linux with Multi-Monitor Support.md b/published/202205/20220510 HydraPaper- A Wallpaper Manager for Linux with Multi-Monitor Support.md
similarity index 100%
rename from published/20220510 HydraPaper- A Wallpaper Manager for Linux with Multi-Monitor Support.md
rename to published/202205/20220510 HydraPaper- A Wallpaper Manager for Linux with Multi-Monitor Support.md
diff --git a/published/20220511 Good News! Docker Desktop is Now Here for Linux Users.md b/published/202205/20220511 Good News! Docker Desktop is Now Here for Linux Users.md
similarity index 100%
rename from published/20220511 Good News! Docker Desktop is Now Here for Linux Users.md
rename to published/202205/20220511 Good News! Docker Desktop is Now Here for Linux Users.md
diff --git a/published/20220511 How to Install Fedora 36 Workstation Step by Step.md b/published/202205/20220511 How to Install Fedora 36 Workstation Step by Step.md
similarity index 100%
rename from published/20220511 How to Install Fedora 36 Workstation Step by Step.md
rename to published/202205/20220511 How to Install Fedora 36 Workstation Step by Step.md
diff --git a/published/20220511 Red Hat Enterprise Linux 9 Announced as the Next-Gen Backbone of Enterprise IT.md b/published/202205/20220511 Red Hat Enterprise Linux 9 Announced as the Next-Gen Backbone of Enterprise IT.md
similarity index 100%
rename from published/20220511 Red Hat Enterprise Linux 9 Announced as the Next-Gen Backbone of Enterprise IT.md
rename to published/202205/20220511 Red Hat Enterprise Linux 9 Announced as the Next-Gen Backbone of Enterprise IT.md
diff --git a/published/20220512 5 reasons to use sudo on Linux.md b/published/202205/20220512 5 reasons to use sudo on Linux.md
similarity index 100%
rename from published/20220512 5 reasons to use sudo on Linux.md
rename to published/202205/20220512 5 reasons to use sudo on Linux.md
diff --git a/published/20220512 NVIDIA Takes a Big Step to Improve its GPU Experience on Linux.md b/published/202205/20220512 NVIDIA Takes a Big Step to Improve its GPU Experience on Linux.md
similarity index 100%
rename from published/20220512 NVIDIA Takes a Big Step to Improve its GPU Experience on Linux.md
rename to published/202205/20220512 NVIDIA Takes a Big Step to Improve its GPU Experience on Linux.md
diff --git a/published/20220514 How To Enable Minimize And Maximize Buttons In Fedora 36 Workstation.md b/published/202205/20220514 How To Enable Minimize And Maximize Buttons In Fedora 36 Workstation.md
similarity index 100%
rename from published/20220514 How To Enable Minimize And Maximize Buttons In Fedora 36 Workstation.md
rename to published/202205/20220514 How To Enable Minimize And Maximize Buttons In Fedora 36 Workstation.md
diff --git a/published/20220514 How To Install Multimedia Codecs In Fedora Linux.md b/published/202205/20220514 How To Install Multimedia Codecs In Fedora Linux.md
similarity index 100%
rename from published/20220514 How To Install Multimedia Codecs In Fedora Linux.md
rename to published/202205/20220514 How To Install Multimedia Codecs In Fedora Linux.md
diff --git a/published/20220516 Fudgie- The Awesome Budgie Desktop is Coming to Fedora Linux Soon.md b/published/202205/20220516 Fudgie- The Awesome Budgie Desktop is Coming to Fedora Linux Soon.md
similarity index 100%
rename from published/20220516 Fudgie- The Awesome Budgie Desktop is Coming to Fedora Linux Soon.md
rename to published/202205/20220516 Fudgie- The Awesome Budgie Desktop is Coming to Fedora Linux Soon.md
diff --git a/published/20220516 How To Reset Root Password In Fedora 36.md b/published/202205/20220516 How To Reset Root Password In Fedora 36.md
similarity index 100%
rename from published/20220516 How To Reset Root Password In Fedora 36.md
rename to published/202205/20220516 How To Reset Root Password In Fedora 36.md
diff --git a/published/20220516 Microsoft has another Linux distribution and it is based on Debian.md b/published/202205/20220516 Microsoft has another Linux distribution and it is based on Debian.md
similarity index 100%
rename from published/20220516 Microsoft has another Linux distribution and it is based on Debian.md
rename to published/202205/20220516 Microsoft has another Linux distribution and it is based on Debian.md
diff --git a/published/20220516 Structured Data Processing with Spark SQL.md b/published/202205/20220516 Structured Data Processing with Spark SQL.md
similarity index 100%
rename from published/20220516 Structured Data Processing with Spark SQL.md
rename to published/202205/20220516 Structured Data Processing with Spark SQL.md
diff --git a/published/20220517 Adobe Illustrator Alternative Inkscape Releases Version 1.2.md b/published/202205/20220517 Adobe Illustrator Alternative Inkscape Releases Version 1.2.md
similarity index 100%
rename from published/20220517 Adobe Illustrator Alternative Inkscape Releases Version 1.2.md
rename to published/202205/20220517 Adobe Illustrator Alternative Inkscape Releases Version 1.2.md
diff --git a/published/20220517 Kali Linux 2022.2 Release Adds an Amusing New Feature for the Hackers to Scare People.md b/published/202205/20220517 Kali Linux 2022.2 Release Adds an Amusing New Feature for the Hackers to Scare People.md
similarity index 100%
rename from published/20220517 Kali Linux 2022.2 Release Adds an Amusing New Feature for the Hackers to Scare People.md
rename to published/202205/20220517 Kali Linux 2022.2 Release Adds an Amusing New Feature for the Hackers to Scare People.md
diff --git a/translated/tech/20220518 Five common mistakes when using automation.md b/published/202205/20220518 Five common mistakes when using automation.md
similarity index 91%
rename from translated/tech/20220518 Five common mistakes when using automation.md
rename to published/202205/20220518 Five common mistakes when using automation.md
index cf8b52b775..c41b5d825b 100644
--- a/translated/tech/20220518 Five common mistakes when using automation.md
+++ b/published/202205/20220518 Five common mistakes when using automation.md
@@ -3,16 +3,14 @@
[#]: author: "Gary Scarborough https://fedoramagazine.org/author/gscarbor/"
[#]: collector: "lujun9972"
[#]: translator: "geekpi"
-[#]: reviewer: " "
-[#]: publisher: " "
-[#]: url: " "
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14657-1.html"
使用自动化时的五个常见错误
======
-![][1]
-
-背景图片来自 [“Modern Times”(1936)][2],[United Artists][3],公共领域,通过 Wikimedia Commons
+
随着自动化扩展到涵盖 IT 的更多方面,越来越多的管理员正在学习自动化技能并应用它们来减轻他们的工作量。自动化可以减轻重复性任务的负担,并为基础设施增加一定程度的一致性。但是,当 IT 工作人员部署自动化时,会出现可能对大大小小的基础设施造成严重破坏的常见错误。在自动化部署中通常会出现五个常见错误。
@@ -20,7 +18,7 @@
初学者常犯的错误是自动化脚本没有经过全面测试。由于拼写错误或逻辑错误,简单的 shell 脚本可能会对服务器产生不利影响。将该错误乘以基础架构中的服务器数量,你可能会遇到一大堆问题需要清理。在大规模部署之前始终测试你的自动化脚本。
-### 意外的服务器负载
+### 意外负载
经常发生的第二个错误是没有预测脚本可能对其他资源施加的系统负载。当目标是十几个服务器时,运行从仓库下载文件或安装包的脚本可能没问题。脚本通常在成百上千台服务器上运行。这种负载可以使支持服务停止或完全崩溃。不要忘记考虑端点影响或设置合理的并发率。
@@ -30,11 +28,11 @@
### 缺乏文档
-管理员的一项固定职责应该是记录他们的工作。由于合同到期、升职或定期员工流动,公司可能会在 IT 部门频繁招聘新员工。公司内的工作组相互隔离也很常见。由于这些原因,重要的是记录哪些自动化已经到位。与用户运行脚本不同,自动化可能会在创建它的人离开组之后继续很长时间。管理员可能会发现自己在其基础设施中面临着来自自动化未经检查的奇怪行为。
+管理员的一项固定职责应该是记录他们的工作。由于合同到期、升职或定期员工流动,公司可能会在 IT 部门频繁招聘新员工。公司内的工作组相互隔离也很常见。由于这些原因,重要的是记录哪些自动化已经到位。与用户运行脚本不同,自动化可能会在创建它的人离开组之后继续很长时间。管理员可能会发现自己在其基础设施中面临着来自未经检查的自动化的奇怪行为。
### 缺乏经验
-列表中的最后一个错误是管理员对他们正在自动化的系统不够了解。管理员经常被雇用到他们没有接受过足够培训且没有人可以学习的职位上工作。自 COVID 以来,当公司努力填补空缺时,这一点尤其重要。然后管理员被迫处理他们没有设置并且可能不完全理解的基础设施。这可能会导致非常低效的脚本浪费资源或配置错误的服务器。
+列表中的最后一个错误是管理员对他们正在自动化的系统不够了解。管理员经常被雇用到他们没有接受过足够培训且没有人可以求教的职位上工作。自 COVID 以来,当公司努力填补空缺时,这一点尤其重要。然后管理员被迫处理他们没有设置并且可能不完全理解的基础设施。这可能会导致非常低效的脚本浪费资源或配置错误的服务器。
### 结论
@@ -47,7 +45,7 @@ via: https://fedoramagazine.org/five-common-mistakes-when-using-automation/
作者:[Gary Scarborough][a]
选题:[lujun9972][b]
译者:[geekpi](https://github.com/geekpi)
-校对:[校对者ID](https://github.com/校对者ID)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/published/20220518 Google To Start Distributing A Collection Of Open Source Software libraries.md b/published/202205/20220518 Google To Start Distributing A Collection Of Open Source Software libraries.md
similarity index 100%
rename from published/20220518 Google To Start Distributing A Collection Of Open Source Software libraries.md
rename to published/202205/20220518 Google To Start Distributing A Collection Of Open Source Software libraries.md
diff --git a/published/20220518 How To Reset Sudo Password In Ubuntu 22.04 - 20.04 LTS.md b/published/202205/20220518 How To Reset Sudo Password In Ubuntu 22.04 - 20.04 LTS.md
similarity index 100%
rename from published/20220518 How To Reset Sudo Password In Ubuntu 22.04 - 20.04 LTS.md
rename to published/202205/20220518 How To Reset Sudo Password In Ubuntu 22.04 - 20.04 LTS.md
diff --git a/published/20220518 ONLYOFFICE 7.1 Release Adds ARM Compatibility, a New PDF Viewer, and More Features.md b/published/202205/20220518 ONLYOFFICE 7.1 Release Adds ARM Compatibility, a New PDF Viewer, and More Features.md
similarity index 100%
rename from published/20220518 ONLYOFFICE 7.1 Release Adds ARM Compatibility, a New PDF Viewer, and More Features.md
rename to published/202205/20220518 ONLYOFFICE 7.1 Release Adds ARM Compatibility, a New PDF Viewer, and More Features.md
diff --git a/published/20220519 How To Enable Activate Linux Watermark Notification In Linux Desktop.md b/published/202205/20220519 How To Enable Activate Linux Watermark Notification In Linux Desktop.md
similarity index 100%
rename from published/20220519 How To Enable Activate Linux Watermark Notification In Linux Desktop.md
rename to published/202205/20220519 How To Enable Activate Linux Watermark Notification In Linux Desktop.md
diff --git a/published/20220520 A programmer-s guide to GNU C Compiler.md b/published/202205/20220520 A programmer-s guide to GNU C Compiler.md
similarity index 100%
rename from published/20220520 A programmer-s guide to GNU C Compiler.md
rename to published/202205/20220520 A programmer-s guide to GNU C Compiler.md
diff --git a/published/20220520 Customize GNOME 42 with A Polished Look.md b/published/202205/20220520 Customize GNOME 42 with A Polished Look.md
similarity index 100%
rename from published/20220520 Customize GNOME 42 with A Polished Look.md
rename to published/202205/20220520 Customize GNOME 42 with A Polished Look.md
diff --git a/published/20220520 How to rename a branch, delete a branch, and find the author of a branch in Git.md b/published/202205/20220520 How to rename a branch, delete a branch, and find the author of a branch in Git.md
similarity index 100%
rename from published/20220520 How to rename a branch, delete a branch, and find the author of a branch in Git.md
rename to published/202205/20220520 How to rename a branch, delete a branch, and find the author of a branch in Git.md
diff --git a/published/20220521 FSF Does Not Accept Debian as a Free Distribution. Here-s Why!.md b/published/202205/20220521 FSF Does Not Accept Debian as a Free Distribution. Here-s Why!.md
similarity index 100%
rename from published/20220521 FSF Does Not Accept Debian as a Free Distribution. Here-s Why!.md
rename to published/202205/20220521 FSF Does Not Accept Debian as a Free Distribution. Here-s Why!.md
diff --git a/published/20220523 DAML- The Programming Language for Smart Contracts in a Blockchain.md b/published/202205/20220523 DAML- The Programming Language for Smart Contracts in a Blockchain.md
similarity index 100%
rename from published/20220523 DAML- The Programming Language for Smart Contracts in a Blockchain.md
rename to published/202205/20220523 DAML- The Programming Language for Smart Contracts in a Blockchain.md
diff --git a/published/20220523 Linux Kernel 5.18 Released with Graphics Driver Changes and New Hardware Support.md b/published/202205/20220523 Linux Kernel 5.18 Released with Graphics Driver Changes and New Hardware Support.md
similarity index 100%
rename from published/20220523 Linux Kernel 5.18 Released with Graphics Driver Changes and New Hardware Support.md
rename to published/202205/20220523 Linux Kernel 5.18 Released with Graphics Driver Changes and New Hardware Support.md
diff --git a/published/20220523 System76 Collaborates with HP for a Powerful Linux Laptop for Developers.md b/published/202205/20220523 System76 Collaborates with HP for a Powerful Linux Laptop for Developers.md
similarity index 100%
rename from published/20220523 System76 Collaborates with HP for a Powerful Linux Laptop for Developers.md
rename to published/202205/20220523 System76 Collaborates with HP for a Powerful Linux Laptop for Developers.md
diff --git a/published/20220525 ProtonMail is Now Just -Proton- Offering a Privacy Ecosystem.md b/published/202205/20220525 ProtonMail is Now Just -Proton- Offering a Privacy Ecosystem.md
similarity index 100%
rename from published/20220525 ProtonMail is Now Just -Proton- Offering a Privacy Ecosystem.md
rename to published/202205/20220525 ProtonMail is Now Just -Proton- Offering a Privacy Ecosystem.md
diff --git a/published/20220526 DeepMind-s Open Source MuJoCo Is Available On GitHub.md b/published/202205/20220526 DeepMind-s Open Source MuJoCo Is Available On GitHub.md
similarity index 100%
rename from published/20220526 DeepMind-s Open Source MuJoCo Is Available On GitHub.md
rename to published/202205/20220526 DeepMind-s Open Source MuJoCo Is Available On GitHub.md
diff --git a/translated/news/20220526 Plex Desktop Player is Now Available for Linux.md b/published/202205/20220526 Plex Desktop Player is Now Available for Linux.md
similarity index 77%
rename from translated/news/20220526 Plex Desktop Player is Now Available for Linux.md
rename to published/202205/20220526 Plex Desktop Player is Now Available for Linux.md
index 3abeea5a3b..af12ffedbf 100644
--- a/translated/news/20220526 Plex Desktop Player is Now Available for Linux.md
+++ b/published/202205/20220526 Plex Desktop Player is Now Available for Linux.md
@@ -3,13 +3,14 @@
[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/"
[#]: collector: "lkxed"
[#]: translator: "lkxed"
-[#]: reviewer: " "
-[#]: publisher: " "
-[#]: url: " "
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14656-1.html"
Plex 桌面播放器现已支持 Linux
======
-Plex.tv 终于在 Linux 上增加了它的桌面版本和全新的 HTPC 应用。不过,它目前只提供了 snap 包。
+
+> Plex.tv 终于增加了 Linux 桌面版本和全新的 HTPC 应用。不过,它目前只提供了 Snap 包。
![plex][1]
@@ -29,21 +30,23 @@ Plex 是一个流行的流媒体播放器,同时,它能够用作一个媒体
这样一来,借助 Flatpak 和 Snap 软件包,Plex 就可以成为在 Linux 上流式传输和组织个人媒体收藏的绝佳选择。
+除了桌面应用程序,如果你利用你的 Linux 机器连接到一个大屏幕来观看所有的内容,还有一个 Plex HTPC(有计划发布 Flatpak 软件包)。
+
![][6]
-如果你感兴趣的话,HTPC 是 PMP TV(全称为 Plex Media Player TV)模式的继承者。
+顺便说一句,HTPC 是 PMP TV(全称为 Plex Media Player TV)模式的继承者。
-官网上发布了这款产品,以及它的 Linux 桌面应用程序 。
+他们在官网上与它的 Linux 桌面应用程序一同发布了这款产品。
-使用 HTPC,这个桌面应用就可以和电视共享,并支持音频直通、刷新率切换、控制器支持和可配置输入映射等高级功能。
+使用 HTPC,这个桌面应用就可以和电视共享,并支持音频直通、刷新率切换、控制器和可配置输入映射等高级功能。
![][7]
因此,如果你有一个大屏幕,并且想要连接你的系统(不管是什么桌面平台)的话,你现在可以使用 HTPC 应用程序来完成。
-[Plex 桌面版][8]
+> **[Plex 桌面版][8]**
-[Plex HTPC][9]
+> **[Plex HTPC][9]**
在 Linux 系统或联网电视上流式传输内容时,你通常会使用什么呢?你觉得 Plex 能满足你的需求吗?即然它支持 Linux 了,你会想要用它来替代当前使用的软件吗?
@@ -56,7 +59,7 @@ via: https://news.itsfoss.com/plex-desktop-linux/
作者:[Ankush Das][a]
选题:[lkxed][b]
译者:[lkxed](https://github.com/lkxed)
-校对:[校对者ID](https://github.com/校对者ID)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/published/20220527 AlmaLinux Continues the Legacy of CentOS with the Release of Version 9.md b/published/202205/20220527 AlmaLinux Continues the Legacy of CentOS with the Release of Version 9.md
similarity index 100%
rename from published/20220527 AlmaLinux Continues the Legacy of CentOS with the Release of Version 9.md
rename to published/202205/20220527 AlmaLinux Continues the Legacy of CentOS with the Release of Version 9.md
diff --git a/published/20220527 Tails Linux Users Warned Against Using the Tor Browser- Here-s why!.md b/published/202205/20220527 Tails Linux Users Warned Against Using the Tor Browser- Here-s why!.md
similarity index 93%
rename from published/20220527 Tails Linux Users Warned Against Using the Tor Browser- Here-s why!.md
rename to published/202205/20220527 Tails Linux Users Warned Against Using the Tor Browser- Here-s why!.md
index 4e3c9f8c5e..f30dae7372 100644
--- a/published/20220527 Tails Linux Users Warned Against Using the Tor Browser- Here-s why!.md
+++ b/published/202205/20220527 Tails Linux Users Warned Against Using the Tor Browser- Here-s why!.md
@@ -22,6 +22,10 @@ Tor 浏览器是 Tails 事实上的(默认)网页浏览器,它有助于在
最近,有人发现了两个令人讨厌的漏洞,它们允许有害网站能够从其他网站窃取用户的信息。
+这些都是在 Firefox 使用的 JavaScript 引擎中发现的。
+
+但是,Tor 与此有什么关系?对于那些不知道的人来说,Tor 实际上是 Firefox 的一个复刻,因此包含许多类似的功能,如 JavaScript 引擎。
+
具体来说,在 [Mozilla 发布的公告][2] 中,这些漏洞已被确定为 CVE-2022-1802 和 CVE-2022-1529。
Tails 公告中也对此进行了说明:
diff --git a/published/20220519 Top 10 Essential Ubuntu Apps For Everyone in 2022.md b/published/20220519 Top 10 Essential Ubuntu Apps For Everyone in 2022.md
new file mode 100644
index 0000000000..4b04331930
--- /dev/null
+++ b/published/20220519 Top 10 Essential Ubuntu Apps For Everyone in 2022.md
@@ -0,0 +1,195 @@
+[#]: subject: "Top 10 Essential Ubuntu Apps For Everyone in 2022"
+[#]: via: "https://www.debugpoint.com/2022/05/essential-ubuntu-apps-2022-part-1/"
+[#]: author: "Arindam https://www.debugpoint.com/author/admin1/"
+[#]: collector: "lkxed"
+[#]: translator: "Donkey-Hao"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14794-1.html"
+
+10 大必备 Ubuntu 应用:基本篇
+======
+
+
+
+> 本文列出了 2022 年可以用于不同情况的 10 个 Ubuntu 基本应用。
+
+不管你是偶尔使用的用户、学生、老师,还是科学家、开发人员和创意工作者,在工作上你需要各种各样的应用程序。Linux 生态系统有数以千计的应用程序,它们分散在各个角落,几乎可以满足各种需求。而包括 Ubuntu 在内的大多数主流 Linux 发行版,默认都只提供了基本的应用程序。
+
+在这个五篇系列文章的第一篇中,我们列出了一些每个人都用的上的专门应用。
+
+### 1、GNOME 优化工具
+
+如果你在使用 Ubuntu GNOME 版,GNOME 优化工具是你必备的实用工具。使用这个工具来定制你的桌面,你可以改变字体、缩放比例、主题、光标和许多其他选项。默认的设置窗口现在没有列出所有这些选项。
+
+此外,你也能用该应用改变窗口装饰、标题栏、标题栏按钮以及开机启动项。
+
+你可以使用应用商店搜索 “Tweaks” 来安装它,或者通过下列终端的命令来安装:
+
+```
+sudo apt install gnome-tweaks
+```
+
+![GNOME Tweaks Tool][2]
+
+### 2、Steam
+
+由于 Valve 公司和相关社区的贡献,在 Linux 上玩游戏不再困难。[Steam][3] 是 Valve 公司开发的电子游戏服务的前端平台,你可以通过 Steam 在 Ubuntu 上获取最新的游戏版本。此外,Steam 客户端提供反外挂监测、自动更新,和支持带有流媒体功能的社交对话。
+
+如果你是一个 Linux 游戏玩家,Steam 是常用的客户端,你可以用下面的命令来安装。此外,你可以在应用商店中搜索 “Steam Installer” 并使用 [Flatpak][4] 或 [Snap][5] 进行安装。
+
+```
+sudo apt install steam
+```
+
+![Steam Client][6]
+
+### 3、Peek
+
+在我看来,[Peek][7] 是一款被低估的应用。它是一个 GIF 动画录像机,对各种工作场景都非常有用。这是一款非常强大的应用程序,它适合在 Ubuntu 或任何 Linux 发行版中使用。此外,Peek 带有诸如录制区域选择、倒计时、GIF/MP4/WebM 支持等选项。它的后端使用的是 ffmpeg 。
+
+在应用商店中搜索 “peek” 或者在命令行输入以下命令来安装这款优秀的应用。
+
+```
+sudo apt install peek
+```
+
+![Peek][8]
+
+### 4、新立得
+
+[新立得][9] 是一款杰出的软件包管理器,可以帮助你以传统方式添加和移除软件包。有经验的 Linux 用户知道它的特性以及灵活性。你可以在各种库中搜索软件包、验证依赖性并进行安装。
+
+如果你经常安装和卸载软件包,这是一个完美的应用程序。你可以通过以下命令或在应用商店中搜索 “synaptic” 来安装它。
+
+```
+sudo apt install synaptic
+```
+
+![Synaptic Package Manager][10]
+
+### 5、GDebi
+
+正如上面提到的新立得,你也可以试试 [GDebi][11] 软件包安装程序,它带有几种功能。GDebi 软件包安装程序是用于安装外部 deb 文件的命令行实用程序。此外,GDebi 安装 .deb 包速度更快、效率更高,可以快速解决依赖关系并为你下载它们。
+
+它是 Ubuntu 上安装 .deb 包最好的终端程序之一,你可以用以下命令安装它。安装后,你可以运行 `gdebi <你的 .deb 软件包路径>` 来安装任何软件包。
+
+```
+sudo apt install gdebi
+```
+
+### 6、Geary
+
+不管从事什么工作,你需要一个 Ubuntu 桌面的本地 [邮箱客户端][12]。电子邮件对很多人来说仍然是有意义和有价值的。尽管 Ubuntu 默认带有最好的 Thunderbird 电子邮件客户端,但你也可以试试其它的电子邮件客户端应用,或许可以给你带来更好体验。
+
+[Geary][13] 拥有友好而简洁的用户界面,能够让你更简单的设置多个邮件账号。此外, Geary 也带来了会话功能、更快的搜索、撰写富文本电子邮件以及其他功能,这使它成为 Linux 桌面的“首选”电子邮件客户端。
+
+你可以使用如下命令或者在应用商店中搜索 “Geary” 来安装 Geary 。也可以通过 [Flatpak][14] 获得。
+
+```
+sudo apt install geary
+```
+
+![Geary][15]
+
+### 7. 谷歌 Chrome 浏览器
+
+虽然很多人担心隐私以及跟踪,但谷歌 Chrome 仍然是浏览器市场的领头者。Ubuntu 默认提供了 Firefox 浏览器,但随着近期火狐的 Snap 事件,你可能想换到其它浏览器。
+
+如果你与谷歌生态系统密切相关,并希望在流媒体和浏览方面获得更好的网络体验,你可能会考虑使用谷歌 Chrome。但是,如果你担心隐私和跟踪,你可以选择其他一些浏览器,例如 Brave 或 Vivaldi。
+
+你可以从下面链接中下载 .deb 包来安装谷歌 Chrome 安装器。安装后,你可以打开应用商店来安装它。
+
+> **[下载谷歌 Chrome][16]**
+
+### 8、Kdenlive
+
+[Kdenlive][17] 是 Linux 上最好的自由开源的视频编辑器之一。 Kdenlive 设计良好的用户界面易于使用,并且带来了各种功能。使用 Kdenlive,你可以简单的导入视频片段,更改画布分辨率,并在编辑后导出为多种格式。时间线和工具让只需你单击一个按钮即可剪切和添加标题、转场和效果。此外,如果你是视频编辑新手,学习起来也非常容易。
+
+Kdenlive 是一个非常活跃的项目,每个主要版本都会带有更多先进的功能。这是 2022 年必不可少的 Ubuntu 应用程序之一,如果你想与其它 [免费视频编辑器][18] 进行比较,你可以看看此列表。
+
+使用以下命令安装 Kdenlive 很简单。除此,你可以用 [Flatpak][19] 或 [Snap][20] 版本来安装。
+
+```
+sudo apt install kdenlive
+```
+
+![Kdenlive Video Editor][21]
+
+### 9. Spectacle
+
+你可能尝试过很多截屏应用。但在我看来,[Spectacle][22] 或许是最好的、也是被低估了的一款应用。Spectacle 是一款 KDE 应用程序,速度超快,非常适合需要截屏并使用的任何工作需求。你可以在自定义的延时后截取整个桌面、部分桌面或窗口。如果需要,窗口截屏还可以选择截取窗口装饰和光标。Spectacle 还为你提供了一个内置的注释功能,可以涂鸦、书写和标记你的图像。
+
+此外,你还可以直接从其主窗口在 GIMP 或任何图像编辑器中打开图像,并将其导出。此外,自动保存、将截屏复制到剪贴板以及共享到社交媒体是 Spectacle 的一些独特功能。
+
+在我看来,它是一个带有内置屏幕录像机的完整截图工具。
+
+你可以用以下命令或者从 [Snap][23] 中安装 Spectacle。
+
+```
+sudo apt install kde-spectacle
+```
+
+![Spectacle Screenshot tool][24]
+
+### 10. VLC 媒体播放器
+
+Ubuntu Linux 的 GNOME 版默认带有可以播放视频文件的 GNOME 视频应用程序。但由于缺乏解码功能,GNOME 视频无法播放多种视频格式。这就是为什么你应该考虑一下 [VLC 媒体播放器][25] —— 它是 Linux 桌面上的“首选”媒体播放器。
+
+VLC 确实可以播放任何格式。它甚至可以帮助你播放数据不完整的损坏视频文件。它是强大的媒体播放器之一,你可以使用下面的命令来安装。
+
+此外,如果你偏向于另一种安装方式,你可以通过 [Flatpak][26] 或者 [Snap][27] 安装。
+
+```
+sudo apt install vlc
+```
+
+![VLC Media Player][28]
+
+### 结语
+
+2022 年必备的 Ubuntu 应用程序系列的第 1 部分到此结束。通过以上信息,我希望你可以选择一些应用供你的日常使用。在下面的评论框中告诉我你更喜欢此列表中的哪些应用程序。
+
+最后,请继续关注本 Ubuntu 应用程序系列的第 2 部分。
+
+--------------------------------------------------------------------------------
+
+via: https://www.debugpoint.com/2022/05/essential-ubuntu-apps-2022-part-1/
+
+作者:[Arindam][a]
+选题:[lkxed][b]
+译者:[Donkey](https://github.com/Donkey-Hao)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.debugpoint.com/author/admin1/
+[b]: https://github.com/lkxed
+[1]: https://gitlab.gnome.org/GNOME/gnome-tweaks
+[2]: https://www.debugpoint.com/wp-content/uploads/2022/05/GNOME-Tweaks-Tool.jpg
+[3]: https://store.steampowered.com/
+[4]: https://flathub.org/apps/details/com.valvesoftware.Steam
+[5]: https://snapcraft.io/steam
+[6]: https://www.debugpoint.com/wp-content/uploads/2022/05/Steam-Client.jpg
+[7]: https://github.com/phw/peek
+[8]: https://www.debugpoint.com/wp-content/uploads/2022/05/Peek-in-action2.jpg
+[9]: https://www.nongnu.org/synaptic/
+[10]: https://www.debugpoint.com/wp-content/uploads/2022/05/Synaptic-Package-Manager.jpg
+[11]: https://launchpad.net/gdebi
+[12]: https://www.debugpoint.com/2019/06/best-email-client-linux-windows/
+[13]: https://wiki.gnome.org/Apps/Geary
+[14]: https://flathub.org/apps/details/org.gnome.Geary
+[15]: https://www.debugpoint.com/wp-content/uploads/2019/06/Geary.png
+[16]: https://www.google.com/chrome
+[17]: https://kdenlive.org/
+[18]: https://www.debugpoint.com/2019/09/best-free-video-editors-linux-ubuntu/
+[19]: https://flathub.org/apps/details/org.kde.kdenlive
+[20]: https://snapcraft.io/kdenlive
+[21]: https://www.debugpoint.com/wp-content/uploads/2021/01/Kdenlive-Video-Editor.jpg
+[22]: https://apps.kde.org/spectacle/
+[23]: https://snapcraft.io/spectacle
+[24]: https://www.debugpoint.com/wp-content/uploads/2022/05/Spectacle-Screenshot-tool.jpg
+[25]: https://www.videolan.org/vlc
+[26]: https://flathub.org/apps/details/org.videolan.VLC
+[27]: https://snapcraft.io/vlc
+[28]: https://www.debugpoint.com/wp-content/uploads/2022/05/VLC-Media-Player.jpg
diff --git a/published/20220527 Plotting Data in R- Graphs.md b/published/20220527 Plotting Data in R- Graphs.md
new file mode 100644
index 0000000000..f2877704fc
--- /dev/null
+++ b/published/20220527 Plotting Data in R- Graphs.md
@@ -0,0 +1,322 @@
+[#]: subject: "Plotting Data in R: Graphs"
+[#]: via: "https://www.opensourceforu.com/2022/05/plotting-data-in-r-graphs/"
+[#]: author: "Shakthi Kannan https://www.opensourceforu.com/author/shakthi-kannan/"
+[#]: collector: "lkxed"
+[#]: translator: "tanloong"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14830-1.html"
+
+R 语言绘制数据:图表篇
+======
+
+R 语言有非常多的绘图和数据可视化的包,比如 `graphics`、`lattice`、`ggplot2` 等。这是 R 语言系列的第 9 篇文章,我们会介绍 R 中用来绘图的各种函数。
+
+
+
+本文使用的 R 是 4.1.2 版本,运行环境为 Parabola GNU/Linux-libre (x86-64)。
+
+```
+$ R --version
+
+R version 4.1.2 (2021-11-01) -- "Bird Hippie"
+Copyright (C) 2021 The R Foundation for Statistical Computing
+Platform: x86_64-pc-linux-gnu (64-bit)
+```
+
+R 是自由软件,没有任何担保责任。只要遵守 GNU 通用公共许可证的版本 2 或者版本 3,你就可以对它进行(修改和)再分发。详情见 [https://www.gnu.org/licenses/](https://www.gnu.org/licenses/)。
+
+### 折线图
+
+我们以印度全境消费者物价指数(CPI -- 乡村/城市)数据集为研究对象,它可以从 [https://data.gov.in/catalog/all-india-consumer-price-index-ruralurban-0](https://data.gov.in/catalog/all-india-consumer-price-index-ruralurban-0) 下载。选择“截止到 2021 年 11 月” 的版本,用 `read.csv` 函数读取下载好的文件,如下所示:
+
+```
+> cpi <- read.csv(file="CPI.csv", sep=",")
+
+> head(cpi)
+Sector Year Name Andhra.Pradesh Arunachal.Pradesh Assam Bihar
+1 Rural 2011 January 104 NA 104 NA
+2 Urban 2011 January 103 NA 103 NA
+3 Rural+Urban 2011 January 103 NA 104 NA
+4 Rural 2011 February 107 NA 105 NA
+5 Urban 2011 February 106 NA 106 NA
+6 Rural+Urban 2011 February 105 NA 105 NA
+Chattisgarh Delhi Goa Gujarat Haryana Himachal.Pradesh Jharkhand Karnataka
+1 105 NA 103 104 104 104 105 104
+2 104 NA 103 104 104 103 104 104
+3 104 NA 103 104 104 103 105 104
+4 107 NA 105 106 106 105 107 106
+5 106 NA 105 107 107 105 107 108
+6 105 NA 104 105 106 104 106 106
+...
+```
+
+以 Punjab 州为例,对每年各月份的 CPI 值求和,然后用 `plot` 函数画一张折线图:
+
+```
+> punjab <- aggregate(x=cpi$Punjab, by=list(cpi$Year), FUN=sum)
+
+> head(punjab)
+Group.1 x
+1 2011 3881.76
+2 2012 4183.30
+3 2013 4368.40
+4 2014 4455.50
+5 2015 4584.30
+6 2016 4715.80
+
+> plot(punjab$Group.1, punjab$x, type="l", main="Punjab Consumer Price Index upto November 2021", xlab="Year", ylab="Consumer Price Index")
+```
+
+`plot` 函数可以传入如下参数:
+
+| 参数 | 描述 |
+| :- | :- |
+| `x` | 向量类型,用于绘制 x 轴的数据 |
+| `y` | 向量或列表类型,用于绘制 y 轴的数据 |
+| `type` | 设置绘图类型:`p` 画点;`l` 画线;`o` 同时画点和线,且相互重叠;`s` 画阶梯线;`h` 画铅垂线 |
+| `xlim` | x 轴范围 |
+| `ylim` | y 轴范围 |
+| `main` | 标题 |
+| `sub` | 副标题 |
+| `xlab` | x 轴标题 |
+| `ylab` | y 轴标题 |
+| `axes` | 逻辑型,是否绘制坐标轴 |
+
+结果如图 1。
+
+![Figure 1: Line chart][2]
+
+### 自相关图
+
+自相关图能在时序分析中展示一个变量是否具有自相关性,可以用 R 中的 `acf` 函数绘制。`acf` 函数可以设置三种自相关类型:`correlation`、`covariance` 或 `partial`。图 2 是 Punjab 州 CPI 值的自相关图,x 表示 CPI。
+
+```
+acf(punjab$x,main='x')
+```
+
+![Figure 2: ACF chart][3]
+
+`acf` 函数可以传入以下参数:
+
+| 参数 | 描述 |
+| :- | :- |
+| `x` | 一个单变量或多变量的时序对象,或者一个数值向量或数值矩阵 |
+| `lag.max` | 最大滞后阶数 |
+| `type` | 字符型,设置所计算的自相关类型:`correlation`、`covariance` 或 `partial` |
+| `plot` | 逻辑性,若 `TRUE` 则绘制图像,若 `FALSE` 则打印传入数据的描述信息 |
+| `i` | 一组要保留的时差滞后 |
+| `j` | 一组要保留的名称或数字 |
+
+### 柱状图
+
+R 中画柱状图的函数是 `barplot`。下面的代码用来画 Punjab 州 CPI 的柱状图,如图3:
+
+```
+> barplot(punjab$x, main="Punjab Consumer Price Index", sub="Upto November 2021", xlab="Year", ylab="Consumer Price Index", col="navy")
+```
+
+![Figure 3: Line chart of Punjab's CPI][4]
+
+`barplot` 函数的使用方法非常灵活,可以传入以下参数:
+
+| 参数 | 描述 |
+| :- | :- |
+| `height` | 数值向量或数值矩阵,包含用于绘图的数据 |
+| `width` | 数值向量,用于设置柱宽 |
+| `space` | 柱间距 |
+| `beside` | 逻辑型,若 `FALSE` 则绘制堆积柱状图,若 `TRUE` 则绘制并列柱状图 |
+| `density` | 数值型,设置阴影线的填充密度(条数/英寸),默认为 `NULL`,即不填充阴影线|
+| `angle` | 数值型,填充线条的角度,默认为 45 |
+| `border` | 柱形边缘的颜色 |
+| `main` | 标题 |
+| `sub` | 副标题 |
+| `xlab` | x 轴标题 |
+| `ylab` | y 轴标题 |
+| `xlim` | x 轴范围 |
+| `ylim` | y 轴范围 |
+| `axes` | 逻辑型,是否绘制坐标轴 |
+
+用 `help` 命令可以查看 `barplot` 函数的详细信息:
+
+```
+> help(barplot)
+
+barplot package:graphics R Documentation
+
+Bar Plots
+
+Description:
+
+ Creates a bar plot with vertical or horizontal bars.
+
+Usage:
+
+ barplot(height, ...)
+
+ ## Default S3 method:
+ barplot(height, width = 1, space = NULL,
+ names.arg = NULL, legend.text = NULL, beside = FALSE,
+ horiz = FALSE, density = NULL, angle = 45,
+ col = NULL, border = par("fg"),
+ main = NULL, sub = NULL, xlab = NULL, ylab = NULL,
+ xlim = NULL, ylim = NULL, xpd = TRUE, log = "",
+ axes = TRUE, axisnames = TRUE,
+ cex.axis = par("cex.axis"), cex.names = par("cex.axis"),
+ inside = TRUE, plot = TRUE, axis.lty = 0, offset = 0,
+ add = FALSE, ann = !add && par("ann"), args.legend = NULL, ...)
+
+ ## S3 method for class 'formula'
+ barplot(formula, data, subset, na.action,
+ horiz = FALSE, xlab = NULL, ylab = NULL, ...)
+```
+
+### 饼图
+
+绘制饼图时要多加注意,因为饼图不一定能展示出各扇形间的区别。(LCTT 译注:根据统计学家和一些心理学家的调查结果,这种以比例展示数据的统计图形 [实际上是很糟糕的可视化方式][10],因此,R 关于饼图的帮助文件中清楚地说明了并不推荐使用饼图,而是使用条形图或点图作为替代。) 用 `subset` 函数获得 Gujarat 州在 2021 年 1 月 Rural、Urban、Rurual+Urban 的 CPI 值:
+
+```
+> jan2021 <- subset(cpi, Name=="January" & Year=="2021")
+
+> jan2021$Gujarat
+[1] 153.9 151.2 149.1
+
+> names <- c('Rural', 'Urban', 'Rural+Urban')
+```
+
+使用 `pie` 函数为 Gujarat 州的 CPI 值生成饼图,如下所示:
+
+```
+> pie(jan2021$Gujarat, names, main="Gujarat CPI Rural and Urban Pie Chart")
+```
+
+![Figure 4: Pie chart][5]
+
+`pie` 函数可以传入以下参数:
+
+| 参数 | 描述 |
+| :- | :- |
+| `x | 元素大于 0 的数值向量 |
+| `label` | 字符向量,用于设置每个扇形的标签 |
+| `radius` | 饼图的半径 |
+| `clockwise` | 逻辑型,若 `TRUE` 则顺时针绘图,若 `FALSE` 则逆时针绘图 |
+| `density` | 数值型,设置阴影线的填充密度(条数/英寸),默认为 `NULL`,即不填充阴影线|
+| `angle` | 数值型,填充线条的角度,默认为 45 |
+| `col` | 数值向量,用于设置颜色 |
+| `lty` | 每个扇形的线条类型 |
+| `main` | 标题 |
+
+### 箱线图
+
+(LCTT 译注:箱线图主要是 [从四分位数的角度出发][11] 描述数据的分布,它通过最大值(Q4)、上四分位数(Q3)、中位数(Q2)、下四分位数(Q1) 和最小值(Q0)五处位置来获取一维数据的分布概况。我们知道,这五处位置之间依次包含了四段数据,每段中数据量均为总数据量的 1/4。通过每一段数据占据的长度,我们可以大致推断出数据的集中或离散趋势。长度越短,说明数据在该区间上越密集,反之则稀疏。)
+
+箱线图能够用“须线” 展示一个变量的四分位距(简称 IQR=Q3-Q1)。用上下四分位数分别加/减内四分位距,再乘以一个人为设定的倍数 `range`(见下面的参数列表),得到 `range * c(Q1-IQR, Q3+IQR)`,超过这个范围的数据点就被视作离群点,在图中直接以点的形式表示出来。
+
+`boxplot` 函数可以传入以下参数:
+
+| 参数 | 描述 |
+| :- | :- |
+| `data` | 数据框或列表,用于参数类型为公式的情况 |
+| `x` | 数值向量或者列表,若为列表则对列表中每一个子对象依次作出箱线图 |
+| `width` | 设置箱子的宽度 |
+| `outline` | 逻辑型,设置是否绘制离群点 |
+| `names` | 设置每个箱子的标签 |
+| `border` | 设置每个箱子的边缘的颜色 |
+| `range` | 延伸倍数,设置箱线图末端(须)延伸到什么位置 |
+| `plot` | 逻辑型,设置是否生成图像,若 TRUE 则生成图像,若 FALSE 则打印传入数据的描述信息 |
+| `horizontal` | 逻辑型,设置箱线图是否水平放置 |
+
+用 `boxplot` 函数绘制部分州的箱线图:
+
+```
+> names <- c ('Andaman and Nicobar', 'Lakshadweep', 'Delhi', 'Goa', 'Gujarat', 'Bihar')
+> boxplot(cpi$Andaman.and.Nicobar, cpi$Lakshadweep, cpi$Delhi, cpi$Goa, cpi$Gujarat, cpi$Bihar, names=names)
+```
+
+![Figure 5: Box plot][6]
+
+### QQ 图
+
+QQ 图可以用来对比两个数据集,也可以用来检查数据是否服从某种理论分布。`qqnorm` 函数能绘制正态分布 QQ 图,可以检验数据是否服从正态分布,用下面的代码绘制 Punjab 州 CPI 数据的 QQ 图:
+
+```
+> qqnorm(punjab$x)
+```
+
+![Figure 6: Q-Q plot][7]
+
+`qqline` 函数可以向正态分布 QQ 图上添加理论分布曲线,它可以传入以下参数:
+
+| 参数 | 描述 |
+| :- | :- |
+| `x` | 第一个数据样本 |
+| `y` | 第二个数据样本 |
+| `datax` | 逻辑型,设置是否以 x 轴表示理论曲线的值,默认为 `FALSE` |
+| `probs` | 长度为 2 的数值向量,代表概率 |
+| `xlab` | x 轴标题 |
+| `ylab` | y 轴标题 |
+| `qtype` | `[1,9]` 内的整数,设置分位计算类型,详情见 `help(quantile)` 的类型小节 |
+
+### 等高图
+
+等高图可以描述三维数据,在 R 中对应的函数是 `contour`,这个函数也可以用来向已有的图表添加等高线。等高图常与其他图表一起使用。我们用 `contour` 对 R 中的 `volcano` 数据集(奥克兰的火山地形信息)绘制等高图,代码如下:
+
+```
+> contour(volcano)
+```
+
+![Figure 7: Volcano][8]
+
+`contour` 函数的常用参数如下:
+
+| 参数 | 描述 |
+| :- | :- |
+| `x,y` | z 中数值对应的点在平面上的位置 |
+| `z` | 数值向量 |
+| `nlevels` | 设置等高线的条数,调整等高线的疏密 |
+| `labels` | 等高线上的标记字符串,默认是高度的数值 |
+| `xlim` | 设置 x 轴的范围 |
+| `ylim` | 设置 y 轴的范围 |
+| `zlim` | 设置 z 轴的范围 |
+| `axes` | 设置是否绘制坐标轴 |
+| `col` | 设置等高线的颜色 |
+| `lty` | 设置线条的类型 |
+| `lwd` | 设置线条的粗细 |
+| `vfont` | 设置标签字体 |
+
+等高线之间的区域可以用颜色填充,每种颜色表示一个高度范围,如下所示:
+
+```
+> filled.contour(volcano, asp = 1)
+# asp 为图形纵横比,即 y 轴上的 1 单位长度和 x 轴上 1 单位长度的比率
+```
+填充结果见图 8。
+
+![Figure 8: Filled volcano][9]
+
+掌握上述内容后,你可以尝试 R 语言 `graphics` 包中的其他函数和图表(LCTT 译注:用 `help(package=graphics)` 可以查看 graphics 包提供的函数列表)。
+
+--------------------------------------------------------------------------------
+
+via: https://www.opensourceforu.com/2022/05/plotting-data-in-r-graphs/
+
+作者:[Shakthi Kannan][a]
+选题:[lkxed][b]
+译者:[tanloong](https://github.com/tanloong)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.opensourceforu.com/author/shakthi-kannan/
+[b]: https://github.com/lkxed
+[1]: https://www.opensourceforu.com/wp-content/uploads/2022/04/business-man-visulising-graphs.jpg
+[2]: https://www.opensourceforu.com/wp-content/uploads/2022/04/Figure-1-Line-chart.jpg
+[3]: https://www.opensourceforu.com/wp-content/uploads/2022/04/Figure-2-ACF-chart.jpg
+[4]: https://www.opensourceforu.com/wp-content/uploads/2022/04/Figure-3-Line-chart-of-Punjabs-CPI.jpg
+[5]: https://www.opensourceforu.com/wp-content/uploads/2022/04/Figure-4-Pie-chart.jpg
+[6]: https://www.opensourceforu.com/wp-content/uploads/2022/04/Figure-5-ox-plot.jpg
+[7]: https://www.opensourceforu.com/wp-content/uploads/2022/04/Figure-6-Q-Q-plot.jpg
+[8]: https://www.opensourceforu.com/wp-content/uploads/2022/04/Figure-7-Volcano.jpg
+[9]: https://www.opensourceforu.com/wp-content/uploads/2022/04/Figure-8-Filled-volcano.jpg
+[10]: https://bookdown.org/xiangyun/msg/gallery.html#sec:pie
+[11]: https://bookdown.org/xiangyun/msg/gallery.html#sec:boxplot
diff --git a/published/20220531 How dynamic linking for modular libraries works on Linux.md b/published/20220531 How dynamic linking for modular libraries works on Linux.md
new file mode 100644
index 0000000000..a3fab8faa0
--- /dev/null
+++ b/published/20220531 How dynamic linking for modular libraries works on Linux.md
@@ -0,0 +1,223 @@
+[#]: subject: "How dynamic linking for modular libraries works on Linux"
+[#]: via: "https://opensource.com/article/22/5/dynamic-linking-modular-libraries-linux"
+[#]: author: "Jayashree Huttanagoudar https://opensource.com/users/jayashree-huttanagoudar"
+[#]: collector: "lkxed"
+[#]: translator: "robsean"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14813-1.html"
+
+如何在 Linux 上动态链接模块库
+======
+
+
+
+> 学习如何用动态链接库将多个 C 目标文件结合到一个单个的可执行文件之中。
+
+当使用 C 编程语言编写一个应用程序时,你的代码通常有多个源文件代码。
+
+最终,这些文件必须被编译到一个单个的可执行文件之中。你可以通过创建静态或动态库(后者也被称为 共享 库)来实现这一点。这两种类型的库在创建和链接的方式上有所不同。两者都有缺点和优点,这取决于你的使用情况。
+
+动态链接是最常见的方法,尤其是在 Linux 系统上。动态链接会保持库模块化,因此,很多应用程序可以共享一个库。应用程序的模块化也允许单独更新其依赖的共享库。
+
+在这篇文章中,我将演示动态链接是如何工作的。在后期的文章中,我将演示静态链接。
+
+### 链接器
+
+链接器是一个命令,它将一个程序的数个部分结合在一起,并为它们重新组织内存分配。
+
+链接器的功能包括:
+
+* 整合一个程序的所有的部分
+* 计算出一个新的内存组织结构,以便所有的部分组合在一起
+* 恢复内存地址,以便程序可以在新的内存组织结构下运行
+* 解析符号引用
+
+链接器通过这些功能,创建了一个名为可执行文件的可以运行的程序。在你创建一个动态链接的可执行文件前,你需要一些用来链接的库,和一个用来编译的应用程序。准备好你 [最喜欢的文本编辑器][2] 并继续。
+
+### 创建目标文件
+
+首先,创建带有这些函数签名的头文件 `mymath.h` :
+
+```
+int add(int a, int b);
+int sub(int a, int b);
+int mult(int a, int b);
+int divi(int a, int b);
+```
+
+使用这些函数定义来创建 `add.c` 、`sub.c` 、`mult.c` 和 `divi.c` 文件。我将把所有的代码都放置到一个代码块中,请将其分为四个文件,如注释所示:
+
+```
+// add.c
+int add(int a, int b){
+return (a+b);
+}
+
+//sub.c
+int sub(int a, int b){
+return (a-b);
+}
+
+//mult.c
+int mult(int a, int b){
+return (a*b);
+}
+
+//divi.c
+int divi(int a, int b){
+return (a/b);
+}
+```
+
+现在,使用 GCC 来创建目标文件 `add.o`、`sub.o`、`mult.o` 和 `divi.o` :
+
+(LCTT 校注:关于“目标文件”,有时候也被称作“对象文件”,对此,存在一些译法混乱情形,称之为“目标文件”的译法比较流行,本文采用此译法。)
+
+```
+$ gcc -c add.c sub.c mult.c divi.c
+```
+
+`-c` 选项跳过链接步骤,并且只创建目标文件。
+
+### 创建一个共享的目标文件
+
+在最终的可执行文件的执行过程中将链接动态库。在最终的可执行文件中仅放置动态库的名称。实际上的链接过程发生在运行时,在此期间,可执行文件和库都被放置到了主内存中。
+
+除了可共享外,动态库的另外一个优点是它减少了最终的可执行文件的大小。在一个应用程序最终的可执行文件生成时,其使用的库只包括该库的名称,而不是该库的一个多余的副本。
+
+你可以从你现有的示例代码中创建动态库:
+
+```
+$ gcc -Wall -fPIC -c add.c sub.c mult.c divi.c
+```
+
+选项 `-fPIC` 告诉 GCC 来生成位置无关的代码(PIC)。`-Wall` 选项不是必需的,并且与代码的编译方式是无关的。不过,它却是一个有价值的选项,因为它会启用编译器警告,这在排除故障时是很有帮助的。
+
+使用 GCC ,创建共享库 `libmymath.so` :
+
+```
+$ gcc -shared -o libmymath.so add.o sub.o mult.o divi.o
+```
+
+现在,你已经创建了一个简单的示例数学库 `libmymath.so` ,你可以在 C 代码中使用它。当然,也有非常复杂的 C 库,这就是他们这些开发者来生成最终产品的工艺流程,你和我可以安装这些库并在 C 代码中使用。
+
+接下来,你可以在一些自定义代码中使用你的新数学库,然后链接它。
+
+### 创建一个动态链接的可执行文件
+
+假设你已经为数学运算编写了一个命令。创建一个名称为 `mathDemo.c` 的文件,并将这些代码复制粘贴至其中:
+
+```
+#include
+#include
+#include
+
+int main()
+{
+ int x, y;
+ printf("Enter two numbers\n");
+ scanf("%d%d",&x,&y);
+
+ printf("\n%d + %d = %d", x, y, add(x, y));
+ printf("\n%d - %d = %d", x, y, sub(x, y));
+ printf("\n%d * %d = %d", x, y, mult(x, y));
+
+ if(y==0){
+ printf("\nDenominator is zero so can't perform division\n");
+ exit(0);
+ }else{
+ printf("\n%d / %d = %d\n", x, y, divi(x, y));
+ return 0;
+ }
+}
+```
+
+注意:第一行是一个 `include` 语句,通过名称来引用你自己的 `libmymath` 库。要使用一个共享库,你必须已经安装了它,如果你没有安装你将要使用的库,那么当你的可执行文件在运行并搜索其包含的库时,将找不到该共享库。如果你需要在不安装库到已知目录的情况下编译代码,这里有 [一些方法可以覆盖默认设置][3]。不过,对于一般使用来说,我们希望库存在于已知的位置,因此,这就是我在这里演示的东西。
+
+复制文件 `libmymath.so` 到一个标准的系统目录,例如:`/usr/lib64`, 然后运行 `ldconfig` 。`ldconfig` 命令创建所需的链接,并缓存到标准库目录中发现的最新共享库。
+
+```
+$ sudo cp libmymath.so /usr/lib64/
+$ sudo ldconfig
+```
+
+### 编译应用程序
+
+从你的应用程序源文件代码(`mathDemo.c`)中创建一个名称为 `mathDemo.o` 的目标文件:
+
+```
+$ gcc -I . -c mathDemo.c
+```
+
+`-I` 选项告诉 GCC 来在其后所列出的目录中搜索头文件(在这个示例中是 `mymath.h`)。在这个示例中,你指定的是当前目录,通过一个单点(`.`)来表示。创建一个可执行文件,使用 `-l` 选项来通过名称来引用你的共享数学库:
+
+```
+$ gcc -o mathDynamic mathDemo.o -lmymath
+```
+
+GCC 会找到 `libmymath.so` ,因为它存在于一个默认的系统库目录中。使用 `ldd` 来查证所使用的共享库:
+
+```
+$ ldd mathDemo
+ linux-vdso.so.1 (0x00007fffe6a30000)
+ libmymath.so => /usr/lib64/libmymath.so (0x00007fe4d4d33000)
+ libc.so.6 => /lib64/libc.so.6 (0x00007fe4d4b29000)
+ /lib64/ld-linux-x86-64.so.2 (0x00007fe4d4d4e000)
+```
+
+看看 `mathDemo` 可执行文件的大小:
+
+```
+$ du ./mathDynamic
+24 ./mathDynamic
+```
+
+当然,它是一个小的应用程序,它所占用的磁盘空间量也反映了这一点。相比之下,相同代码的一个静态链接版本(正如你将在我后期的文章所看到的一样)是 932K !
+
+```
+$ ./mathDynamic
+Enter two numbers
+25
+5
+
+25 + 5 = 30
+25 - 5 = 20
+25 * 5 = 125
+25 / 5 = 5
+```
+
+你可以使用 `file` 命令来查证它是动态链接的:
+
+```
+$ file ./mathDynamic
+./mathDynamic: ELF 64-bit LSB executable, x86-64,
+dynamically linked,
+interpreter /lib64/ld-linux-x86-64.so.2,
+with debug_info, not stripped
+```
+
+成功!
+
+### 动态链接
+
+因为链接发生在运行时,所以,使用一个共享库会产生一个轻量型的可执行文件。因为它在运行时解析引用,所以它会花费更多的执行时间。不过,因为在日常使用的 Linux 系统上绝大多数的命令是动态链接的,并且在现代硬件上,所能节省的时间是可以忽略不计的。对开发者和用户来说,它的固有模块性是一种强大的功能。
+
+在这篇文章中,我描述了如何创建动态库,并将其链接到一个最终可执行文件。在我的下一篇文章中,我将使用相同的源文件代码来创建一个静态链接的可执行文件。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/22/5/dynamic-linking-modular-libraries-linux
+
+作者:[Jayashree Huttanagoudar][a]
+选题:[lkxed][b]
+译者:[robsean](https://github.com/robsean)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/jayashree-huttanagoudar
+[b]: https://github.com/lkxed
+[1]: https://opensource.com/sites/default/files/lead-images/links.png
+[2]: https://opensource.com/article/21/2/open-source-text-editors
+[3]: https://opensource.com/article/22/5/compile-code-ldlibrarypath
diff --git a/translated/tech/20180712 An introduction to Go arrays and slices.md b/published/202206/20180712 An introduction to Go arrays and slices.md
similarity index 90%
rename from translated/tech/20180712 An introduction to Go arrays and slices.md
rename to published/202206/20180712 An introduction to Go arrays and slices.md
index 40e3f9a3b6..9dcac9545c 100644
--- a/translated/tech/20180712 An introduction to Go arrays and slices.md
+++ b/published/202206/20180712 An introduction to Go arrays and slices.md
@@ -3,17 +3,16 @@
[#]: author: "Mihalis Tsoukalos https://opensource.com/users/mtsouk"
[#]: collector: "lkxed"
[#]: translator: "lkxed"
-[#]: reviewer: " "
-[#]: publisher: " "
-[#]: url: " "
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14665-1.html"
Go 数组和切片的介绍
======
-了解使用数组和切片在 Go 中存储数据的优缺点,以及为什么其中一个比另一个更好。
-![][1]
+
-图源:carrotmadman6,经 Opensource.com 修改,CC BY-SA 2.0
+> 了解使用数组和切片在 Go 中存储数据的优缺点,以及为什么其中一个更好。
在本系列的第四篇文章中,我将解释 [Go][5] 数组和切片,包括如何使用它们,以及为什么你通常要选择其中一个而不是另一个。
@@ -26,6 +25,7 @@ Go 数组和切片的介绍
```
anArray := [4]int{-1, 2, 0, -4}
```
+
数组的大小应该在它的类型之前声明,而类型应该在声明元素之前定义。`len()` 函数可以帮助你得到任何数组的长度。上面数组的大小是 4。
如果你熟悉其他编程语言,你可能会尝试使用 `for` 循环来遍历数组。Go 当然也支持 `for` 循环,不过,正如你将在下面看到的,Go 的 `range` 关键字可以让你更优雅地遍历数组或切片。
@@ -39,7 +39,6 @@ twoD := [3][3]int{
{10, 11, 12}}
```
-The `arrays.go` source file explains the use of Go arrays. The most important code in `arrays.go` is:
`arrays.go` 源文件中包含了 Go 数组的示例代码。其中最重要的部分是:
```
@@ -101,7 +100,6 @@ Go 切片与 Go 数组类似,但是它没有后者的缺点。
此外,切片是通过引用传递给函数的,这意味着实际传递给函数的是切片变量的内存地址,这样一来,你对函数内部的切片所做的任何修改,都不会在函数退出后丢失。因此,将大切片传递给函数,要比将具有相同数量元素的数组传递给同一函数快得多。这是因为 Go 不必拷贝切片 —— 它只需传递切片变量的内存地址。
-Go slices are illustrated in `slice.go`, which contains the following code:
`slice.go` 源文件中有 Go 切片的代码示例,其中包含以下代码:
```
@@ -141,7 +139,7 @@ func main() {
}
```
-切片和数组在定义方式上的最大区别就在于:你不需要指定切片的大小。实际上,切片的大小取决于你要放入其中的元素数量。此外,`append()` 函数允许你将元素添加到现有切片 —— 请注意,即使切片的容量允许你将元素添加到该切片,它的长度也不会被修改,除非你调用 `append ()`。上述代码中的 `printSlice()` 函数是一个辅助函数,用于打印切片中的所有元素,而 `negative()` 函数将切片中的每个元素都变为各自的相反数。
+切片和数组在定义方式上的最大区别就在于:你不需要指定切片的大小。实际上,切片的大小取决于你要放入其中的元素数量。此外,`append()` 函数允许你将元素添加到现有切片 —— 请注意,即使切片的容量允许你将元素添加到该切片,它的长度也不会被修改,除非你调用 `append()`。上述代码中的 `printSlice()` 函数是一个辅助函数,用于打印切片中的所有元素,而 `negative()` 函数将切片中的每个元素都变为各自的相反数。
运行 `slice.go` 将得到以下输出:
@@ -192,7 +190,7 @@ Array: [1 -2 3 -4 5]
你可以在 [GitHub][6] 上找到 `arrays.go`、`slice.go` 和 `refArray.go` 的源代码。
-如果您有任何问题或反馈,请在下方发表评论或在 [Twitter][7] 上与我联系。
+如果你有任何问题或反馈,请在下方发表评论或在 [Twitter][7] 上与我联系。
--------------------------------------------------------------------------------
@@ -201,7 +199,7 @@ via: https://opensource.com/article/18/7/introduction-go-arrays-and-slices
作者:[Mihalis Tsoukalos][a]
选题:[lkxed][b]
译者:[lkxed](https://github.com/lkxed)
-校对:[校对者ID](https://github.com/校对者ID)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/published/202206/20190131 OOP Before OOP with Simula.md b/published/202206/20190131 OOP Before OOP with Simula.md
new file mode 100644
index 0000000000..c5d9c97a84
--- /dev/null
+++ b/published/202206/20190131 OOP Before OOP with Simula.md
@@ -0,0 +1,183 @@
+[#]: subject: "OOP Before OOP with Simula"
+[#]: via: "https://twobithistory.org/2019/01/31/simula.html"
+[#]: author: "Two-Bit History https://twobithistory.org"
+[#]: collector: "lujun9972"
+[#]: translator: "aREversez"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14682-1.html"
+
+Simula 诞生之前的面向对象程序设计
+======
+
+想象一下,你坐在河边,河岸上如茵绿草,不远处湍急河流;午后的阳光慵懒惬意,使人陷入冥想哲思,不觉开始思考眼前的河流是否真实存在。诚然,几米外确实有河水奔流而下。不过,我们所称为“河流”的存在究竟是什么呢?毕竟,河水奔流不息,一直处于变化之中。似乎,“河流”这个词无法指代任何固定不变的事物。
+
+2009 年,Clojure 的创始人 里奇·希基 发表了 [一场精彩的演讲][1],探讨了为什么上文那样的哲学窘境会给面向对象程序的编程范式带来难题。他认为,人们看待计算机程序中的对象与看待河流的逻辑是一样的:我们想象对象是固定不变的,即使对象的许多或者说全部的属性都无时无刻不处于变化之中。所以,这种逻辑并不正确,我们无法区分在不同状态下同一对象实例的不同之处。程序中没有明确的时间的概念。人们只是单纯地用着同一个名字,以期在引用对象时,对象能够处于预期的状态中。这样,我们也就难免会遇到 故障。
+
+希基总结道,这一难题的应对办法就是人们应该将世界建模成作用于不可变数据的 进程 的集合,而不是可变的对象的集合。换句话说,我们应把每个对象看作一条“河流”,因果相连。总结说来,你应该使用 Clojure 等函数式语言。
+
+![][2]
+
+_作者在远足途中思考面向对象程序设计的本体论问题。_
+
+自从希基发表演讲之后,人们对函数式编程语言的兴趣不断提升,主流的面向对象编程语言也大多都采用了函数式编程语言。尽管如此,大多数程序员依旧沿用自己的老一套,继续将对象实例化,不断改变其状态。这些人长此以往,很难做到用不同的视角看待编程。
+
+我曾经想写一篇关于 Simula 的文章,大概会写到我们今天所熟知的面向对象的理念是何时又是如何应用到程序语言之中的。但是,我觉得写当初的 Simula 与如今的面向对象程序设计的 _迥然不同之处_,会更有趣一些,这我敢打包票。毕竟,我们现在熟知的面向对象程序设计还未完全成型。Simula 有两个主要版本:Simula I 和 Simula 67。Simula 67 为世界带来了 类、 类的继承 以及 虚拟方法;但 Simula I 是一个初稿,它实验了如何能够将数据和进程捆绑起来的其他设想。Simula I 的模型不是希基提出的函数式模型,不过这一模型关注的是随时间展开的 _进程_,而非有着隐藏状态的对象之间的相互作用。如果 Simula 67 采用了 Simula I 的理念,那么我们如今所知的面向对象程序设计可能会大有不同——这类偶然性启示我们,不要想着现在的程序设计范式会一直占据主导地位。
+
+### 从 Simula 0 到 Simula 67
+
+Simula 是由两位挪威人 克里斯汀·尼加德 和 奥利-约翰·达尔 创建的。
+
+20 世纪 50 年代末,尼加德受雇于 挪威防务科学研究中心(NDRE),该研究中心隶属于挪威军方。在那里,他负责设计 蒙特卡洛模拟方法,用于核反应堆设计与操作研究。最初,那些模拟实验是由人工完成的;后来,实验在 Ferranti Mercury 电脑 [^1] 上编入程序运行。尼加德随后发现,将这些模拟实验输入电脑需要一种更有效的方式。
+
+尼加德设计的这种模拟实验就是人们所知的“离散事件模型”,这种模拟记录了一系列事件随着时间改变系统状态的进程。但是问题的关键在于模拟可以从一个事件跳跃到另一个事件中,因为事件是离散的,事件之间的系统不存在任何变化。根据尼加德和达尔在 1966 年发表的一篇关于 Simula 的论文,这种模型被迅速应用于“神经网络、通信系统、交通流量、生产系统、管理系统、社会系统等” [^2] 领域的分析。因此,尼加德认为,其他人描述模拟实验时,可能也需要更高层级的模型。于是他开始物色人才,帮助他完成他称之为“模拟语言”或者“蒙特卡洛编译器”的项目 [^3]。
+
+达尔当时也受雇于挪威防务科学研究中心,专攻语言设计,此时也加入了尼加德的项目,扮演“沃兹尼亚克”的角色(LCTT 译注:指苹果公司联合创始人斯蒂夫·盖瑞·沃兹尼亚克)。在接下来一年左右的时间,尼加德和达尔携手开发了 Simula 0 语言。[^4] 这一语言的早期版本仅仅是在 ALGOL 60 基础上进行的较小拓展,当时也只是打算将其用作预处理程序而已。当时的语言要比后来的编程语言抽象得多,其基本语言结构是“车站”与“乘客”,这些结构可以用于针对具体某些离散事件网络建立模型。尼加德和达尔给出了一个模拟飞机离港的例子。[^5] 但是尼加德和达尔最后想出了一个更加通用的语言结构,可以同时表示“车站”和“乘客”,也可以为更广泛的模拟建立模型。这是两个主要的概括,它改变了 Simula 作为 ALGOL 专属包的定位,使其转变为通用编程语言。
+
+Simula I 没有“车站”和“乘客”的语言结构,但它可以通过使用“进程”再现这些结构。(LCTT 译注:此处使用的“进程”,与当前计算机中用来指代一个已执行程序的实体的概念不同,大致上,你可以将本文中所说的“进程”理解为一种“对象”。)一个进程包含大量数据属性,这些属性与作为进程的 _操作规程_ 的单个行为相联系。你可能会把进程当作是只有单个方法的对象,比如 `run()` 之类的。不过,这种类比并不全面,因为每个进程的操作规程都可以随时暂停、随时恢复,因为这种操作规程属于 协程 的一种。Simula I 程序会将系统建立为一套进程的模型,在概念上这些进程并行运行。实际上,一个时间点上能称为“当前进程”的只有一个进程。但是,一旦某个进程暂停运行,那么下一个进程就会自动接替它的位置。随着模拟的运行,Simula 会保持一个 “事件通知” 的时间线,跟踪记录每个进程恢复的时间。为了恢复暂停运行的进程,Simula 需要记录多个 调用栈 的情况。这就意味着 Simula 无法再作为 ALGOL 的预处理程序了,因为 ALGOL 只有一个 调用栈。于是,尼加德和达尔下定决心,开始编写自己的编译器。
+
+尼加德和达尔在介绍该系统的论文中,借助图示,通过模拟一个可用机器数量有限的工厂,阐明了其用法。[^6] 在该案例中,进程就好比订单:通过寻找可用的机器,订单得以发出;如果没有可用的机器,订单就会搁置;而一旦有机器空出来,订单就会执行下去。有一个订单进程的定义,用来实例化若干种不同的订单实例,不过这些实例并未调用任何方法。该程序的主体仅仅是创建进程,并使其运行。
+
+历史上第一个 Simula I 编译器发布于 1965 年。尼加德和达尔在离开挪威防务科学研究中心之后,就进入了 挪威计算机中心 工作,Simula I 也是在这里日渐流行起来的。当时,Simula I 在 UNIVAC 公司的计算机和 Burroughs 公司的 B5500 计算机上均可执行。[^7] 尼加德和达尔两人与一家名为 ASEA 的瑞典公司达成了咨询协议,运用 Simula 模拟加工车间。但是,尼加德和达尔随后就意识到 Simula 也可以写一些和模拟完全不搭边的程序。
+
+奥斯陆大学教授 斯坦因·克罗达尔 曾写过关于 Simula 的发展史,称“真正能够促使新开发的通用语言快速发展的催化剂”就是 [一篇题为《记录处理》的论文][10],作者是英国计算机科学家 查尔斯·安东尼·理查德·霍尔。[^8] 假如你现在读霍尔的这篇论文,你就不会怀疑这句话。当人们谈及面向对象语言的发展史时,一定会经常提起霍尔的大名。以下内容摘自霍尔的《记录处理》一文:
+
+> 该方案设想,在程序执行期间,计算机内部存在任意数量的记录,每条记录都代表着程序员在过去、现在或未来所需的某个对象。程序对现有记录的数量保持动态控制,并可以根据当前任务的要求创建新的记录或删除现有记录。
+>
+> 计算机中的每条记录都必须属于数量有限但互不重合的记录类型中的一类;程序员可以根据需要声明尽可能多的记录类型,并借助标识符为各个类型命名。记录类型的命名可能是普通词汇,比如“牛”、“桌子”以及“房子”,同时,归属于这些类型的记录分别代表一头“牛”、一张“桌子”以及一座“房子”。
+
+霍尔在这片论文中并未提到子类的概念,但是达尔由衷地感谢霍尔,是他引导了两人发现了这一概念。[^9] 尼加德和达尔注意到 Simula I 的进程通常具有相同的元素,所以引入父类来执行共同元素就会非常方便。这也强化了“进程”这一概念本身可以用作父类的可能性,也就是说,并非每种类型都必须用作只有单个操作规程的进程。这就是 Simula 语言迈向通用化的第二次飞跃,此时,Simula 67 真正成为了通用编程语言。正是如此变化让尼加德和达尔短暂地萌生了给 Simula 改名的想法,想让人们意识到 Simula 不仅仅可以用作模拟。[^10] 不过,考虑到 “Simula”这个名字的知名度已经很高了,另取名字恐怕会带来不小的麻烦。
+
+1967 年,尼加德和达尔与 控制数据公司 签署协议,着手开发Simula 的新版本:Simula 67。同年六月份的一场会议中,来自控制数据公司、奥斯陆大学以及挪威计算机中心的代表与尼加德和达尔两人会面,意在为这门新语言制定标准与规范。最终,会议发布了 [《Simula 67 通用基础语言》][14],确定了该语言的发展方向。
+
+Simula 67 编译器的开发由若干家供应商负责。Simula 用户协会(ASU)也随后成立,并于每年举办年会。不久,Simula 67 的用户就遍及了 23 个国家。[^11]
+
+### 21 世纪的 Simula 语言
+
+人们至今还记得 Simula,是因为后来那些取代它的编程语言都受到了它的巨大影响。到了今天,你很难找到还在使用 Simula 写程序的人,但是这并不意味着 Simula 已经从这个世界上消失了。得益于 [GNU cim][16],人们在今天依然能够编写和运行 Simula 程序。
+
+cim 编译器遵循 1986 年修订后的 Simula 标准,基本上也就是 Simula 67 版本。你可以用它编写类、子类以及虚拟方法,就像是在使用 Simula 67 一样。所以,用 Python 或 Ruby 轻松写出短短几行面向对象的程序,你照样也可以用 cim 写出来:
+
+```
+! dogs.sim ;
+Begin
+ Class Dog;
+ ! The cim compiler requires virtual procedures to be fully specified ;
+ Virtual: Procedure bark Is Procedure bark;;
+ Begin
+ Procedure bark;
+ Begin
+ OutText("Woof!");
+ OutImage; ! Outputs a newline ;
+ End;
+ End;
+
+ Dog Class Chihuahua; ! Chihuahua is "prefixed" by Dog ;
+ Begin
+ Procedure bark;
+ Begin
+ OutText("Yap yap yap yap yap yap");
+ OutImage;
+ End;
+ End;
+
+ Ref (Dog) d;
+ d :- new Chihuahua; ! :- is the reference assignment operator ;
+ d.bark;
+End;
+```
+
+你可以按照下面代码执行程序的编译与运行:
+
+```
+$ cim dogs.sim
+Compiling dogs.sim:
+gcc -g -O2 -c dogs.c
+gcc -g -O2 -o dogs dogs.o -L/usr/local/lib -lcim
+$ ./dogs
+Yap yap yap yap yap yap
+```
+
+(你可能会注意到,cim 先将 Simula 语言编译为 C 语言,然后传递给 C 语言编译器。)
+
+这就是 1967 年的面向对象程序设计,除了语法方面的不同,和 2019 年的面向对象程序设计并无本质区别。如果你同意我的这一观点,你也就懂得了为什么人们会认为 Simula 在历史上是那么的重要。
+
+不过,我更想介绍一下 Simula I 的核心概念——进程模型。Simula 67 保留了进程模型,不过只有在使用 `Process` 类 和 `Simulation` 块的时候才能调用。
+
+为了表现出进程是如何运行的,我决定模拟下述场景。想象一下,有这么一座住满了村民的村庄,村庄的旁边有条小河边,小河里有很多的鱼。但是,村里的村民却只有一条鱼竿。村民们胃口很大,每隔一个小时就饿了。他们一饿,就会拿着鱼竿去钓鱼。如果一位村民正在等鱼竿,另一位村民自然也用不了。这样一来,村民们就会为了钓鱼排起长长的队伍。假如村民要等五、六分钟才能钓到一条鱼,那么这样等下去,村民们的身体状况就会变得越来越差。再假如,一位村民已经到了骨瘦如柴的地步,最后他可能就会饿死。
+
+这个例子多少有些奇怪,虽然我也不说不出来为什么我脑袋里最先想到的是这样的故事,但是就这样吧。我们把村民们当作 Simula 的各个进程,观察在有着四个村民的村庄里,一天的模拟时间内会发生什么。
+
+完整程序可以通过此处 [GitHub Gist][17] 的链接获取。
+
+我把输出结果的最后几行放在了下面。我们来看看一天里最后几个小时发生了什么:
+
+```
+1299.45: 王五饿了,要了鱼竿。
+1299.45: 王五正在钓鱼。
+1311.39: 王五钓到了一条鱼。
+1328.96: 赵六饿了,要了鱼竿。
+1328.96: 赵六正在钓鱼。
+1331.25: 李四饿了,要了鱼竿。
+1340.44: 赵六钓到了一条鱼。
+1340.44: 李四饿着肚子等着鱼竿。
+1340.44: 李四在等鱼竿的时候饿死了。
+1369.21: 王五饿了,要了鱼竿。
+1369.21: 王五正在钓鱼。
+1379.33: 王五钓到了一条鱼。
+1409.59: 赵六饿了,要了鱼竿。
+1409.59: 赵六正在钓鱼。
+1419.98: 赵六钓到了一条鱼。
+1427.53: 王五饿了,要了鱼竿。
+1427.53: 王五正在钓鱼。
+1437.52: 王五钓到了一条鱼。
+```
+
+可怜的李四最后饿死了,但是他比张三要长寿,因为张三还没到上午 7 点就饿死了。赵六和王五现在一定过得很好,因为需要鱼竿的就只剩下他们两个了。
+
+这里,我要说明,这个程序最重要的部分只是创建了进程(四个村民),并让它们运行下去。各个进程操作对象(鱼竿)的方式与我们今天对对象的操作方式相同。但是程序的主体部分并没有调用任何方法,也没有修改进程的任何属性。进程本身具有内部状态,但是这种内部状态的改变只有进程自身才能做到。
+
+在这个程序中,仍然有一些字段发生了变化,这类程序设计无法直接解决纯函数式编程所能解决的问题。但是正如克罗达尔所注意到的那样,“这一机制引导进行模拟的程序员为底层系统建立模型,生成一系列进程,每个进程表示了系统内的自然事件顺序。”[^12] 我们不是主要从名词或行动者(对其他对象做事的对象)的角度来思考正在进行的进程。我们可以将程序的总控制权交予 Simula 的事件通知系统,克罗达尔称其为 “时间管理器”。因此,尽管我们仍然在适当地改变进程,但是没有任何进程可以假设其他进程的状态。每个进程只能间接地与其他进程进行交互。
+
+这种模式如何用以编写编译器、HTTP 服务器以及其他内容,尚且无法确定。(另外,如果你在 Unity 游戏引擎上编写过游戏,就会发现两者十分相似。)我也承认,尽管我们有了“时间管理器”,但这可能并不完全是希基的意思,他说我们在程序中需要一个明确的时间概念。(我认为,希基想要的类似于 [阿达·洛芙莱斯 用于区分一个变量随时间变化产生的不同数值的上标符号][19]。)尽管如此,我们可以发现,面向对象程序设计前期的设计方式与我们今天所习惯的面向对象程序设计并非完全一致,我觉得这一点很有意思。我们可能会理所当然地认为,面向对象程序设计的方式千篇一律,即程序就是对事件的一长串记录:某个对象以特定顺序对其他对象产生作用。Simula I 的进程系统表明,面向对象程序设计的方式不止一种。仔细想一下,函数式语言或许是更好的设计方式,但是 Simula I 的发展告诉我们,现代面向对象程序设计被取代也很正常。
+
+_如果你喜欢这篇文章,欢迎关注推特 [@TwoBitHistory][20],也可通过 [RSS feed][21] 订阅,获取最新文章(每四周更新一篇)。_
+
+
+[^1]: Jan Rune Holmevik, “The History of Simula,” accessed January 31, 2019, .
+[^2]: Ole-Johan Dahl and Kristen Nygaard, “SIMULA—An ALGOL-Based Simulation Langauge,” Communications of the ACM 9, no. 9 (September 1966): 671, accessed January 31, 2019, [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.95.384&rep=rep1&type=pdf][24].
+[^3]: Stein Krogdahl, “The Birth of Simula,” 2, accessed January 31, 2019, .
+[^4]: 出处同上。
+[^5]: Ole-Johan Dahl and Kristen Nygaard, “The Development of the Simula Languages,” ACM SIGPLAN Notices 13, no. 8 (August 1978): 248, accessed January 31, 2019, .
+[^6]: Dahl and Nygaard (1966), 676.
+[^7]: Dahl and Nygaard (1978), 257.
+[^8]: Krogdahl, 3.
+[^9]: Ole-Johan Dahl, “The Birth of Object-Orientation: The Simula Languages,” 3, accessed January 31, 2019, .
+[^10]: Dahl and Nygaard (1978), 265.
+[^11]: Holmevik.
+[^12]: Krogdahl, 4.
+
+--------------------------------------------------------------------------------
+
+via: https://twobithistory.org/2019/01/31/simula.html
+
+作者:[Two-Bit History][a]
+选题:[lujun9972][b]
+译者:[aREversez](https://github.com/aREversez)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://twobithistory.org
+[b]: https://github.com/lujun9972
+[1]: https://www.infoq.com/presentations/Are-We-There-Yet-Rich-Hickey
+[2]: https://twobithistory.org/images/river.jpg
+[10]: https://archive.computerhistory.org/resources/text/algol/ACM_Algol_bulletin/1061032/p39-hoare.pdf
+[14]: http://web.eah-jena.de/~kleine/history/languages/Simula-CommonBaseLanguage.pdf
+[16]: https://www.gnu.org/software/cim/
+[17]: https://gist.github.com/sinclairtarget/6364cd521010d28ee24dd41ab3d61a96
+[19]: https://twobithistory.org/2018/08/18/ada-lovelace-note-g.html
+[20]: https://twitter.com/TwoBitHistory
+[21]: https://twobithistory.org/feed.xml
+[22]: https://twitter.com/TwoBitHistory/status/1075075139543449600?ref_src=twsrc%5Etfw
+[24]: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.95.384&rep=rep1&type=pdf
diff --git a/published/202206/20210104 10 ways Ansible is for everyone.md b/published/202206/20210104 10 ways Ansible is for everyone.md
new file mode 100644
index 0000000000..a47695f268
--- /dev/null
+++ b/published/202206/20210104 10 ways Ansible is for everyone.md
@@ -0,0 +1,75 @@
+[#]: collector: (lujun9972)
+[#]: translator: (Donkey-Hao)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-14739-1.html)
+[#]: subject: (10 ways Ansible is for everyone)
+[#]: via: (https://opensource.com/article/21/1/ansible)
+[#]: author: (James Farrell https://opensource.com/users/jamesf)
+
+分享 10 篇 Ansible 文章
+======
+
+> 通过这些 Ansible 文章扩展你的知识和技能。
+
+
+
+我希望能够激发刚刚接触 Ansible 的初学者的兴趣。这里有一系列总结文章,我已将其包括在内,以供你随意后续查阅。
+
+### 适合初学者的 Ansible
+
+这五篇文章对于 Ansible 新手来说是一个非常好的起点。前三篇文章由 Seth Kenlon 撰写。
+
+ * 如果你不了解 Ansible ,[现在可以做这 7 件事][2] 来入手。这是很好的入门指导,它收集了用于管理硬件、云、容器等的链接。
+ * 在 《[编排与自动化有何区别?][3]》 这篇文章中,你会学到一些术语和技术路线,将会激发你对 Ansible 感兴趣。
+ * 文章 《[如何用 Ansible 安装软件][4]》 覆盖了一些脚本概念和一些 Ansible 的好惯例,给出了一些本地或远程管理软件包的案例。
+ * 在 [我编写 Ansible 剧本时学到的 3 个教训][5] 中,使自己养成 Jeff Geerling 所传授的好习惯,他是一位真正的 Ansible 资深人士。源代码控制、文档、测试、简化和优化是自动化成功的关键。
+ * 《[我使用 Ansible 的第一天][6]》 介绍了记者 David Both 在解决重复性开发任务时的思考过程。这篇文章从 Ansible 的基础开始,并说明了一些简单的操作和任务。
+
+### 尝试 Ansible 项目
+
+一旦你掌握了基础和并拥有良好习惯,就可以开始一些具体主题和实例了。
+
+ * Ken Fallon 在 《[使用 Ansible 管理你的树莓派机群][7]》 一文中介绍了一个部署和管理树莓派设备机群的示例。它介绍了受限环境中的安全和维护概念。
+ * 在 《[将你的日历与 Ansible 融合以避免日程冲突][8]》一文中,Nicolas Leiva 快速介绍了如何使用前置任务和条件在自动日程安排中中强制执行隔离窗口
+ * Nicolas 在 《[创建一个整合你的谷歌日历的 Ansible 模块][9]》中完成了他的日历隔离的理念。他的文章深入探讨了在 Go 中编写自定义 Ansible 模块以实现所需的日历连接。 Nicolas 介绍了构建和调用 Go 程序并将所需数据传递给 Ansible 并接收所需输出的不同方法。
+
+### 提升你的 Ansible 技巧
+
+Kubernetes 是近来的热门话题,以下文章提供了一些很好的示例来学习新技能。
+
+ * 在 《[适用于 Kubernets 自动编排你的 Ansible 模块][10]》 文章中,Seth Kenlon 介绍了 Ansible Kubernetes 模块, 介绍了用于测试的基本 Minikube 环境,并提供了一些用于荚 控制的 `k8s` 模块的基本示例。
+ * Jeff Geerling 在 《[使用 Ansible 的 Helm 模块构建 Kubernetes Minecraft 服务器][11]》 中解释了 Helm Chart 应用程序、Ansible 集合以及执行一个有趣的项目以在 k8s 集群中设置你自己的 Minecraft 服务器的概念。
+
+我希望你的 Ansible 旅程已经开始,并能常从这些文章中充实自己。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/1/ansible
+
+作者:[James Farrell][a]
+选题:[lujun9972][b]
+译者:[Donkey](https://github.com/Donkey-Hao)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [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/innovation_lightbulb_gears_devops_ansible.png?itok=TSbmp3_M (gears and lightbulb to represent innovation)
+[2]: https://opensource.com/article/20/9/ansible
+[3]: https://opensource.com/article/20/11/orchestration-vs-automation
+[4]: https://opensource.com/article/20/9/install-packages-ansible
+[5]: https://opensource.com/article/20/1/ansible-playbooks-lessons
+[6]: https://opensource.com/article/20/10/first-day-ansible
+[7]: https://opensource.com/article/20/9/raspberry-pi-ansible
+[8]: https://opensource.com/article/20/10/calendar-ansible
+[9]: https://opensource.com/article/20/10/ansible-module-go
+[10]: https://opensource.com/article/20/9/ansible-modules-kubernetes
+[11]: https://opensource.com/article/20/10/kubernetes-minecraft-ansible
+[12]: https://opensource.com/article/20/1/ansible-news-edition-six
+[13]: https://opensource.com/article/20/2/ansible-news-edition-seven
+[14]: https://opensource.com/article/20/3/ansible-news-edition-eight
+[15]: https://opensource.com/article/20/4/ansible-news-edition-nine
+[16]: https://opensource.com/article/20/5/ansible-news-edition-ten
+[17]: https://opensource.com/how-submit-article
diff --git a/published/202206/20210104 Docker Compose- a nice way to set up a dev environment.md b/published/202206/20210104 Docker Compose- a nice way to set up a dev environment.md
new file mode 100644
index 0000000000..fd2ddc9846
--- /dev/null
+++ b/published/202206/20210104 Docker Compose- a nice way to set up a dev environment.md
@@ -0,0 +1,245 @@
+[#]: collector: (lujun9972)
+[#]: translator: (lkxed)
+[#]: reviewer: (turbokernel)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-14747-1.html)
+[#]: subject: (Docker Compose: a nice way to set up a dev environment)
+[#]: via: (https://jvns.ca/blog/2021/01/04/docker-compose-is-nice/)
+[#]: author: (Julia Evans https://jvns.ca/)
+
+Docker Compose:搭建开发环境的好方式
+======
+
+
+
+大家好!我又写了一篇关于 [我最喜欢的电脑工具][1] 的文章。这一篇讲的是 Docker Compose!
+
+本文主要就是讲一讲我对 Docker Compose 有多么满意啦(不讨论它的缺点)!咳咳,因为它总能够完成它该做的,并且似乎总能有效,更棒的是,它的使用还非常简单。另外,在本文中,我只讨论我是如何用 Docker Compose 来搭建开发环境的,而不涉及它在生产中的使用。
+
+最近,我考虑了很多关于这种个人开发环境的搭建方式,原因是,我现在把所有的计算工作都搬到了一个私有云上,大概 20 美元/月的样子。这样一来,我就不用在工作的时候花时间去思考应该如何管理几千台 AWS 服务器了。
+
+在此之前,我曾花了两天的时间,尝试使用其他的工具来尝试搭建一个开发环境,搭到后面,我实在是心累了。相比起来,Docker Compose 就简单易用多了,我非常满意。于是,我和妹妹分享了我的 `docker-compose` 使用经历,她略显惊讶:“是吧!你也觉得 Docker Compose 真棒对吧!” 嗯,我觉得我应该写一篇博文把过程记录下来,于是就有了你们看到的这篇文章。
+
+### 我们的目标是:搭建一个开发环境
+
+目前,我正在编写一个 Ruby on Rails 服务(它是一个计算机“调试”游戏的后端)。在我的生产服务器上,我安装了:
+
+ * 一个 Nginx 服务器
+ * 一个 Rails 服务
+ * 一个 Go 服务(使用了 [gotty][2] 来代理一些 SSH 连接)
+ * 一个 Postgres 数据库
+
+在本地搭建 Rails 服务非常简单,用不着容器(我只需要安装 Postgres 和 Ruby 就行了,小菜一碟)。但是,我还想要把匹配 `/proxy/*` 的请求的发送到 Go 服务,其他所有请求都发送到 Rails 服务,所以需要借助 Nginx。问题来了,在笔记本电脑上安装 Nginx 对我来说太麻烦了。
+
+是时候使用 `docker-compose` 了!
+
+### docker-compose 允许你运行一组 Docker 容器
+
+基本上,Docker Compose 的作用就是允许你运行一组可以互相通信 Docker 容器。
+
+你可以在一个叫做 `docker-compose.yml` 的文件中,配置你所有的容器。我在下方将贴上我为这个服务编写的 `docker-compose.yml` 文件(完整内容),因为我觉得它真的很简洁、直接!
+
+```
+version: "3.3"
+services:
+ db:
+ image: postgres
+ volumes:
+ - ./tmp/db:/var/lib/postgresql/data
+ environment:
+ POSTGRES_PASSWORD: password # yes I set the password to 'password'
+ go_server:
+ # todo: use a smaller image at some point, we don't need all of ubuntu to run a static go binary
+ image: ubuntu
+ command: /app/go_proxy/server
+ volumes:
+ - .:/app
+ rails_server:
+ build: docker/rails
+ command: bash -c "rm -f tmp/pids/server.pid && source secrets.sh && bundle exec rails s -p 3000 -b '0.0.0.0'"
+ volumes:
+ - .:/app
+ web:
+ build: docker/nginx
+ ports:
+ - "8777:80" # this exposes port 8777 on my laptop
+```
+
+这个配置包含了两种容器。对于前面两个容器,我直接使用了现有的镜像(`image: postgres` 和 `image: ubuntu`)。对于后面两个容器,我不得不构建一个自定义容器镜像,其中, `build: docker/rails` 的作用就是告诉 Docker Compose,它应该使用 `docker/rails/Dockerfile` 来构建一个自定义容器。
+
+我需要允许我的 Rails 服务访问一些 API 密钥和其他东西,因此,我使用了 `source secrets.sh`,它的作用就是在环境变量中预设一组密钥。
+
+### 如何启动所有服务:先 “build” 后 “up”
+
+我一直都是先运行 `docker-compose build` 来构建容器,然后再运行 `docker-compose up` 把所有服务启动起来。
+
+你可以在 yaml 文件中设置 `depends_on`,从而进行更多启动容器的控制。不过,对于我的这些服务而言,启动顺序并不重要,所以我没有设置它。
+
+### 网络互通也非常简单
+
+容器之间的互通也是一件很重要的事情。Docker Compose 让这件事变得超级简单!假设我有一个 Rails 服务正在名为 `rails_server` 的容器中运行,端口是 3000,那么我就可以通过 `http://rails_server:3000` 来访问该服务。就是这么简单!
+
+以下代码片段截取自我的 Nginx 配置文件,它是根据我的使用需求配置的(我删除了许多 `proxy_set_headers` 行,让它看起来更清楚):
+
+```
+location ~ /proxy.* {
+ proxy_pass http://go_server:8080;
+}
+location @app {
+ proxy_pass http://rails_server:3000;
+}
+```
+
+或者,你可以参考如下代码片段,它截取自我的 Rails 项目的数据库配置,我在其中使用了数据库容器的名称(`db`):
+
+```
+development:
+ <<: *default
+ database: myproject_development
+ host: db # <-------- 它会被“神奇地”解析为数据库容器的 IP 地址
+ username: postgres
+ password: password
+```
+
+至于 `rails_server` 究竟是如何被解析成一个 IP 地址的,我还真有点儿好奇。貌似是 Docker 在我的计算机上运行了一个 DNS 服务来解析这些名字。下面是一些 DNS 查询记录,我们可以看到,每个容器都有它自己的 IP 地址:
+
+```
+$ dig +short @127.0.0.11 rails_server
+172.18.0.2
+$ dig +short @127.0.0.11 db
+172.18.0.3
+$ dig +short @127.0.0.11 web
+172.18.0.4
+$ dig +short @127.0.0.11 go_server
+172.18.0.5
+```
+
+### 是谁在运行这个 DNS 服务?
+
+我(稍微)研究了一下这个 DNS 服务是怎么搭建起来的。
+
+以下所有命令都是在容器外执行的,因为我没有在容器里安装很多网络工具。
+
+**第一步:**:使用 `ps aux | grep puma`,获取 Rails 服务的进程 ID。
+
+找到了,它是 `1837916`!简单~
+
+**第二步:**:找到和 `1837916` 运行在同一个网络命名空间的 UDP 服务。
+
+我使用了 `nsenter` 来在 `puma` 进程的网络命令空间内运行 `netstat`(理论上,我猜想你也可以使用 `netstat -tupn` 来只显示 UDP 服务,但此时,我的手指头只习惯于打出 `netstat -tulpn`)。
+
+```
+$ sudo nsenter -n -t 1837916 netstat -tulpn
+Active Internet connections (only servers)
+Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
+tcp 0 0 127.0.0.11:32847 0.0.0.0:* LISTEN 1333/dockerd
+tcp 0 0 0.0.0.0:3000 0.0.0.0:* LISTEN 1837916/puma 4.3.7
+udp 0 0 127.0.0.11:59426 0.0.0.0:* 1333/dockerd
+```
+
+我们可以看到,此时有一个运行在 `59426` 端口的 UDP 服务,它是由 `dockerd` 运行的!或许它就是我们要找的 DNS 服务?
+
+**第三步**:确定它是不是我们要找的 DNS 服务
+
+我们可以使用 `dig` 工具来向它发送一个 DNS 查询:
+
+```
+$ sudo nsenter -n -t 1837916 dig +short @127.0.0.11 59426 rails_server
+172.18.0.2
+```
+
+奇怪,我们之前运行 `dig` 的时候,DNS 查询怎么没有发送到 `59426` 端口,而是发送到了 `53` 端口呢?这到底是怎么回事呀?
+
+**第四步**:iptables
+
+对于类似“这个服务似乎正运行在 X 端口上,但我却在 Y 端口上访问到了它,这是什么回事呢?”的问题,我的第一念头都是“一定是 iptables 在作怪”。
+
+于是,我在运行了容器的网络命令空间内执行 `iptables-save`,果不其然,真相大白:
+
+```
+$ sudo nsenter -n -t 1837916 iptables-save
+.... redacted a bunch of output ....
+-A DOCKER_POSTROUTING -s 127.0.0.11/32 -p udp -m udp --sport 59426 -j SNAT --to-source :53
+COMMIT
+```
+
+在输出中有一条 iptables 规则,它将 `53` 端口的流量发送到了 `59426` 上。哈哈,真有意思!
+
+### 数据库文件储存在一个临时目录中
+
+这样做有一个好处:我可以直接挂载 Postgres 容器的数据目录 `./tmp/db`,而无需在我的笔记本电脑上管理 Postgres 环境。
+
+我很喜欢这种方式,因为我真的不想在笔记本电脑上独自管理一个 Postgres 环境(我也真的不知道该如何配置 Postgres)。另外,出于习惯,我更喜欢让开发环境的数据库和代码放在同一个目录下。
+
+### 仅需一行命令,我就可以访问 Rails 控制台
+
+管理 Ruby 的版本总是有点棘手,并且,即使我暂时搞定了它,我也总是有点担心自己会把 Ruby 环境搞坏,然后就要修它个十年(夸张)。
+
+(使用 Docker Compose)搭建好这个开发环境后,如果我需要访问 Rails 控制台(一个交互式环境,加载了所有我的 Rails 代码),我只需要运行一行代码即可:
+
+```
+$ docker-compose exec rails_server rails console
+Running via Spring preloader in process 597
+Loading development environment (Rails 6.0.3.4)
+irb(main):001:0>
+```
+
+好耶!
+
+### 小问题:Rails 控制台的历史记录丢失了
+
+我碰到了一个问题:Rails 控制台的历史记录丢失了,因为我一直在不断地重启它。
+
+不过,我也找到了一个相当简单的解决方案(嘿嘿):我往容器中添加了一个 `/root/.irbrc` 文件,它能够把 IRB 历史记录文件的保存位置指向一个不受容器重启影响的地方。只需要一行代码就够啦:
+
+```
+IRB.conf[:HISTORY_FILE] = "/app/tmp/irb_history"
+```
+
+### 我还是不知道它在生产环境的表现如何
+
+到目前为止,这个项目的生产环境搭建进度,还停留在“我制作了一个 DigitalOcean droplet(LCCT 译注:一种 Linux 虚拟机服务),并手工编辑了很多文件”的阶段。
+
+嗯……我相信以后会在生产环境中使用 docker-compose 来运行一下它的。我猜它能够正常工作,因为这个服务很可能最多只有两个用户在使用,并且,如果我愿意,我可以容忍它在部署过程中有 60 秒的不可用时间。不过话又说回来,出错的往往是我想不到的地方。
+
+推特网友提供了一些在生产中使用 docker-compose 的注意事项:
+
+ * `docker-compose up` 只会重启那些需要重启的容器,这会让重启速度更快。
+ * 有一个 Bash 小脚本 [wait-for-it][3],你可以用它来保持等待一个容器,直到另一个容器的服务可用。
+ * 你可以准备两份 `docker-compose.yaml` 文件:用于开发环境的 `docker-compose.yaml` 和用于生产环境的 `docker-compose-prod.yaml`。我想我会在分别为 Nginx 指定不同的端口:开发时使用 `8999`,生产中使用 `80`。
+ * 人们似乎一致认为,如果你的项目是一台计算机上运行的小网站,那么 docker-compose 在生产中不会有问题。
+ * 有个人建议说,如果愿意在生产环境搭建复杂那么一丢丢,Docker Swarm 就或许会是更好的选择,不过我还没试过(当然,如果要这么说的话,干嘛不用 Kubernetes 呢?Docker Compose 的意义就是它超级简单,而 Kubernetes 肯定不简单 : ))。
+
+Docker 似乎还有一个特性,它能够 [把你用 docker-compose 搭建的环境,自动推送到弹性容器服务(ESC)上][4],听上去好酷的样子,但是我还没有试过。
+
+### docker-compose 会有不适用的场景吗
+
+我听说 docker-compose 在以下场景的表现较差:
+
+ * 当你有很多微服务的时候(还是自己搭建比较好)
+ * 当你尝试从一个很大的数据库中导入数据时(就像把几百 G 的数据存到每个人的笔记本电脑里一样)
+ * 当你在 Mac 电脑上运行 Docker 时。我听说 Docker 在 macOS 上比在 Linux 上要慢很多(我猜想是因为它需要做额外的虚拟化)。我没有 Mac 电脑,所以我还没有碰到这个问题。
+
+### 以上就是全部内容啦!
+
+在此之前,我曾花了一整天时间,尝试使用 Puppet 来配置 Vagrant 虚拟机,然后在这个虚拟机里配置开发环境。结果,我发现虚拟机启动起来实在是有点慢啊,还有就是,我也不喜欢编写 Puppet 配置(哈哈,没想到吧)。
+
+幸好,我尝试了 Docker Compose,它真好简单,马上就可以开始工作啦!
+
+--------------------------------------------------------------------------------
+
+via: https://jvns.ca/blog/2021/01/04/docker-compose-is-nice/
+
+作者:[Julia Evans][a]
+选题:[lujun9972][b]
+译者:[lkxed](https://github.com/lkxed)
+校对:[turbokernel](https://github.com/turbokernel)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://jvns.ca/
+[b]: https://github.com/lujun9972
+[1]: https://jvns.ca/#cool-computer-tools---features---ideas
+[2]: https://github.com/yudai/gotty/
+[3]: https://github.com/vishnubob/wait-for-it
+[4]: https://docs.docker.com/cloud/ecs-integration/
diff --git a/translated/tech/20210115 Learn awk by coding a -guess the number- game.md b/published/202206/20210115 Learn awk by coding a -guess the number- game.md
similarity index 71%
rename from translated/tech/20210115 Learn awk by coding a -guess the number- game.md
rename to published/202206/20210115 Learn awk by coding a -guess the number- game.md
index 30040b9347..24738ff4be 100644
--- a/translated/tech/20210115 Learn awk by coding a -guess the number- game.md
+++ b/published/202206/20210115 Learn awk by coding a -guess the number- game.md
@@ -1,57 +1,57 @@
[#]: collector: (lujun9972)
-[#]: translator: (FYJNEVERFOLLOWS )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
+[#]: translator: (FYJNEVERFOLLOWS)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-14668-1.html)
[#]: subject: (Learn awk by coding a "guess the number" game)
[#]: via: (https://opensource.com/article/21/1/learn-awk)
[#]: author: (Chris Hermansen https://opensource.com/users/clhermansen)
-编写一个“猜数”游戏的程序来学习 awk
+通过编写“猜数字”游戏来学习 Awk
======
-编程语言往往具有许多共同特征。学习一门新语言的好方法是去写一个熟悉的程序。在本文中,我将会使用 awk 编写一个“猜数”程序来展示熟悉的概念。
-![question mark in chalk][1]
+> 编程语言往往具有许多共同特征。学习一门新语言的好方法是去写一个熟悉的程序。在本文中,我将会使用 Awk 编写一个“猜数字”程序来展示熟悉的概念。
+
+
当你学习一门新的编程语言时,最好把重点放在大多数编程语言都有的共同点上:
+
* 变量 —— 存储信息的地方
* 表达式 —— 计算的方法
* 语句 —— 在程序中表示状态变化的方法
-
这些概念是大多是编程语言的基础。
-一旦你理解了这些概念,你就可以开始把其他的弄清楚。例如,大多数语言都有得到其设计支持的“处理方式”,这些方式在不同语言之间可能有很大的不同。这些方法包括模块化(将相关功能分组在一起)、声明性与命令性、面向对象、低级与高级语法特性等等。许多程序员熟悉的一个例子是“仪式”,即,在处理问题之前设置场景所需的工作量。据说 Java 编程语言有一个重要的仪式要求,这源于它的设计,要求所有代码都在一个类中定义。
+一旦你理解了这些概念,你就可以开始把其他的弄清楚。例如,大多数语言都有由其设计所支持的“处理方式”,这些方式在不同语言之间可能有很大的不同。这些方法包括模块化(将相关功能分组在一起)、声明式与命令式、面向对象、低级与高级语法特性等等。许多程序员比较熟悉的是编程“仪式”,即,在处理问题之前设置场景所需花费的工作。据说 Java 编程语言有一个源于其设计的重要仪式要求,就是所有代码都在一个类中定义。
-但是回到最基本的,编程语言通常有相似之处。一旦你掌握了一种编程语言,就从学习另一种语言的基本知识开始,去品味这种新语言的不同之处。
+但从根本上讲,编程语言通常有相似之处。一旦你掌握了一种编程语言,就可以从学习另一种语言的基本知识开始,品味这种新语言的不同之处。
-继续进行的一个好方法是创建一组基本的测试程序。有了这些,就可以从这些相似之处开始学习。
+一个好方法是创建一组基本的测试程序。有了这些,就可以从这些相似之处开始学习。
你可以选择创建的一个测试程序是“猜数字”程序。电脑从 1 到 100 之间选择一个数字,让你猜这个数字。程序一直循环,直到你猜对为止。
“猜数字”程序练习了编程语言中的几个概念:
+
* 变量
* 输入
* 输出
* 条件判断
* 循环
-
这是学习一门新的编程语言的一个很好的实践实验。
-
-**注**:本文改编自 Moshe Zadka 关于在 [Julia][2] 中使用这种方法的文章和Jim Hall关于在 [Bash][3] 中使用这种方法的文章。
+**注**:本文改编自 Moshe Zadka 在 [Julia][2] 中使用这种方法和 Jim Hall在 [Bash][3] 中使用这种方法的文章。
### 在 awk 程序中猜数
-让我们编写一个实现“猜数字”游戏的 awk 程序。
-Awk 是动态类型的,是一种面向数据转换的脚本语言,并且对交互使用有着令人惊讶的良好支持。Awk 出现于 20 世纪 70 年代,最初是 Unix 操作系统的一部分。如果你不了解 Awk,但是喜欢电子表格,可以看一下这个链接 [去学习 Awk][4]!
+让我们编写一个实现“猜数字”游戏的 Awk 程序。
-您可以通过编写一个版本的“猜数字”游戏来开始对 Awk 的探索。
+Awk 是动态类型的,这是一种面向数据转换的脚本语言,并且对交互使用有着令人惊讶的良好支持。Awk 出现于 20 世纪 70 年代,最初是 Unix 操作系统的一部分。如果你不了解 Awk,但是喜欢电子表格,这就是一个你可以 [去学习 Awk][4] 的信号!
+
+您可以通过编写一个“猜数字”游戏版本来开始对 Awk 的探索。
以下是我的实现(带有行号,以便我们可以查看一些特定功能):
-
```
1 BEGIN {
2 srand(42)
@@ -71,20 +71,21 @@ Awk 是动态类型的,是一种面向数据转换的脚本语言,并且对
16 }
17 }
```
+
我们可以立即看到 Awk 控制结构与 C 或 Java 的相似之处,但与 Python 不同。
-在像 *if-then-else*、*while* 这样的语句中,*then*、*else* 和 *while* 部分接受一个语句或一组被 **{** 和 **}** 包围的语句。然而,Awk 有一个很大的区别需要从一开始就了解:
+在像 `if-then-else`、`while` 这样的语句中,`then`、`else` 和 `while` 部分接受一个语句或一组被 `{` 和 `}` 包围的语句。然而,Awk 有一个很大的区别需要从一开始就了解:
根据设计,Awk 是围绕数据管道构建的。
这是什么意思呢?大多数 Awk 程序都是一些代码片段,它们接收一行输入,对数据做一些处理,然后将其写入输出。认识到这种转换管道的需要,Awk 默认情况下提供了所有的转换管道。让我们通过关于上面程序的一个基本问题来探索:“从控制台读取数据”的结构在哪里?
-答案是——“内置的”。特别的,第 7-17 行告诉 Awk 如何处理被读取的每一行。在这种情况下,很容易看到第 1-6 行在读取任何内容之前被执行。
+答案是——“内置的”。特别的,第 7-17 行告诉 Awk 如何处理被读取的每一行。在这种情况下,很容易看到第 1-6 行是在读取任何内容之前被执行的。
-更具体地说,第 1 行上的 **BEGIN** 关键字是一种“模式”,在本例中,它指示 Awk 在读取任何数据之前,应该先执行 { … } 中 **BEGIN** 后面的内容。另一个类似的关键字 **END**,在这个程序中没有被使用,它指示 Awk 在读取完所有内容后要做什么。
+更具体地说,第 1 行上的 `BEGIN` 关键字是一种“模式”,在本例中,它指示 Awk 在读取任何数据之前,应该先执行 `{ ... }` 中 `BEGIN` 后面的内容。另一个类似的关键字 `END`,在这个程序中没有被使用,它指示 Awk 在读取完所有内容后要做什么。
-回到第 7-17 行,我们看到它们创建了一个类似代码块 { … } 的片段,但前面没有关键字。因为在 **{** 之前没有任何东西可以让 Awk 匹配,所以它将把这一行用于接收每一行输入。每一行的输入都将由用户输入作为猜测。
+回到第 7-17 行,我们看到它们创建了一个类似代码块 `{ ... }` 的片段,但前面没有关键字。因为在 `{` 之前没有任何东西可以让 Awk 匹配,所以它将把这一行用于接收每一行输入。每一行的输入都将由用户输入作为猜测。
-让我们看看正在执行的代码。首先,在读取任何输入之前发生的序言。
+让我们看看正在执行的代码。首先,是在读取任何输入之前发生的序言部分。
在第 2 行,我们用数字 42 初始化随机数生成器(如果不提供参数,则使用系统时钟)。为什么要用 42?[当然要选 42!][5] 第 3 行计算 1 到 100 之间的随机数,第 4 行输出该随机数以供调试使用。第 5 行邀请用户猜一个数字。注意这一行使用的是 `printf`,而不是 `print`。和 C 语言一样,`printf` 的第一个参数是一个用于格式化输出的模板。
@@ -94,7 +95,6 @@ Awk 是动态类型的,是一种面向数据转换的脚本语言,并且对
考虑到 Awk 程序不同寻常的结构,代码片段会对特定的输入行配置做出反应,并处理数据,让我们看看另一种结构,看看过滤部分是如何工作的:
-
```
1 BEGIN {
2 srand(42)
@@ -120,7 +120,6 @@ Awk 是动态类型的,是一种面向数据转换的脚本语言,并且对
为了完整起见,我们可以使用这些模式将普通的计算与只适用于特定环境的计算分离开来。下面是第三个版本:
-
```
1 BEGIN {
2 srand(42)
@@ -142,20 +141,21 @@ Awk 是动态类型的,是一种面向数据转换的脚本语言,并且对
18 exit
19 }
```
+
认识到这一点,无论输入的是什么值,都需要将其转换为整数,因此我们创建了第 7-9 行来完成这一任务。现在第 10-12、13-15 和 16-19 行这三组代码,都是指已经定义好的变量 guess,而不是每次都对输入行进行转换。
让我们回到我们想要学习的东西列表:
+
* 变量 —— 是的,Awk 有这些;我们可以推断出,输入数据以字符串形式输入,但在需要时可以转换为数值
* 输入 —— Awk 只是通过它的“数据转换管道”的方式发送输入来读取数据
* 输出 —— 我们已经使用了 Awk 的 `print` 和 `printf` 函数来将内容写入输出
- * 条件判断 —— 我们已经学习了 Awk 的 *if-then-else* 和对应特定输入行配置的输入过滤器
- * 循环 —— 嗯,想象一下!我们在这里不需要循环,这还是多亏了 Awk 采用的“数据转换管道”方法;循环“就这么发生了”。注意,用户可以通过向 Awk 发送一个文件结束信号(当使用 Linux 终端窗口时可通过快捷键 **CTRL-D**)来提前退出管道。
+ * 条件判断 —— 我们已经学习了 Awk 的 `if-then-else` 和对应特定输入行配置的输入过滤器
+ * 循环 —— 嗯,想象一下!我们在这里不需要循环,这还是多亏了 Awk 采用的“数据转换管道”方法;循环“就这么发生了”。注意,用户可以通过向 Awk 发送一个文件结束信号(当使用 Linux 终端窗口时可通过快捷键 `CTRL-D`)来提前退出管道。
-考虑不需要循环来处理输入的重要性是非常值得的。Awk 能够长期存在的一个原因是 Awk 程序是紧凑的,而它们紧凑的一个原因是不需要从控制台或文件中读取样板文件。
+不需要循环来处理输入的重要性是非常值得的。Awk 能够长期保持存在的一个原因是 Awk 程序是紧凑的,而它们紧凑的一个原因是不需要从控制台或文件中读取的那些格式代码。
让我们运行下面这个程序:
-
```
$ awk -f guess.awk
random number is 25
@@ -167,14 +167,15 @@ that's right
$
```
-我们没有涉及的一件事是注释。Awk 注释以“#”开头,以行尾结束。
+我们没有涉及的一件事是注释。Awk 注释以 `#` 开头,以行尾结束。
### 总结
-Awk 非常强大,这种“猜数字”游戏是入门的好方法。但这不应该是你探索 Awk 的终点。你可以 [阅读关于 Awk 和 Gawk (GNU Awk) 的历史][6],Gawk是 Awk 的扩展版本,如果你在电脑上运行Linux,可能会有这个。或者,你可以 [阅读所有关于它最初开发者的原始版本][7]。
+Awk 非常强大,这种“猜数字”游戏是入门的好方法。但这不应该是你探索 Awk 的终点。你可以看看 [Awk 和 Gawk(GNU Awk)的历史][6],Gawk 是 Awk 的扩展版本,如果你在电脑上运行 Linux,可能会有这个。或者,从它的原始开发者那里阅读关于 [最初版本][7] 的各种信息。
你还可以 [下载我们的备忘单][8] 来帮你记录下你所学的一切。
+> **[Awk 备忘单][8]**
--------------------------------------------------------------------------------
@@ -183,7 +184,7 @@ via: https://opensource.com/article/21/1/learn-awk
作者:[Chris Hermansen][a]
选题:[lujun9972][b]
译者:[FYJNEVERFOLLOWS](https://github.com/FYJNEVERFOLLOWS)
-校对:[校对者ID](https://github.com/校对者ID)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/published/202206/20210122 Configure a Linux workspace remotely from the command line.md b/published/202206/20210122 Configure a Linux workspace remotely from the command line.md
new file mode 100644
index 0000000000..5c632a9870
--- /dev/null
+++ b/published/202206/20210122 Configure a Linux workspace remotely from the command line.md
@@ -0,0 +1,134 @@
+[#]: collector: (lujun9972)
+[#]: translator: (Donkey-Hao)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-14776-1.html)
+[#]: subject: (Configure a Linux workspace remotely from the command line)
+[#]: via: (https://opensource.com/article/21/1/remote-configuration-xfce4)
+[#]: author: (David Both https://opensource.com/users/dboth)
+
+从命令行远程配置 Xfce4 工作区
+======
+
+> 几乎所有的事情都可以从 Linux 命令行完成,包括对 Xfce4 进行远程配置。
+
+
+
+与专有操作系统相比,我很欣赏 Linux 的一个特点是,几乎所有的东西都可以从命令行中进行管理和配置。意味着几乎所有的事情都可以在本地或者通过 SSH 远程登录进行管理。虽然有时候需要花费一点时间在互联网上搜索,但是你能想到的任务,是有可能从命令行完成的。
+
+### 问题
+
+有时候需要使用命令行对桌面进行远程配置。在这种特殊情况下,我需要响应远程用户的请求将在 [Xfce][2] 控制板上的工作区从四个减少到三个。这种配置只需要在互联网上搜索约 20 分钟就找到了。
+
+xfwm4 的默认工作区数量和许多其他设置可以在 `/usr/share/xfwm4/defaults` 这个文件中找到和修改。因此将 `workspace_count=2` 设置为 `workspace_count=4` 就改变了主机上所有用户的默认值。同时,非 root 用户可以执行 `xfconf-query` 命令来查询和设置 xfwm4 窗口管理器的各种属性。它应该由需要改变设置的用户使用,而不是由 root 使用。
+
+在下面的例子中,首先我验证了当前工作区数量为 `4` ,然后将数量改为 `2`,最后确认了新设置。
+
+```
+[user@test1 ~]# xfconf-query -c xfwm4 -p /general/workspace_count
+4
+[user@test1 ~]# xfconf-query -c xfwm4 -p /general/workspace_count -s 2
+[user@test1 ~]# xfconf-query -c xfwm4 -p /general/workspace_count
+2
+[user@test1 ~]#
+```
+
+此更改会立即生效,用户可以马上看到,无需重新启动,甚至无需注销并重新登录。我曾在我的工作站上玩过这个游戏,当我输入设置不同数量的工作空间的命令时,可以观察到工作空间切换器的变化。我在哪儿都能找到乐子。;- )
+
+### 更多探索
+
+现在我解决了这个问题,我决深入了解一下 `xfconf-query` 命令。不幸的是,该工具没有手册或信息页,`/usr/share` 中也没有任何文档。退而求其次,使用 `-h` 选项获取一些帮助信息。
+
+```
+$ xfconf-query -h
+ Usage:
+ xfconf-query [OPTION…] - Xfconf commandline utility
+ Help Options:
+ -h, --help 显示帮助选项
+ Application Options:
+ -V, --version 版本信息
+ -c, --channel 查询/修改通道
+ -p, --property 查询/修改属性
+ -s, --set 更新权限的值
+ -l, --list 罗列属性(或者通道,如果没有用 -c 指定)
+ -v, --verbose 详细输出
+ -n, --create 当新属性不存在,则创建它
+ -t, --type 指定属性值类型
+ -r, --reset 重置属性
+ -R, --recursive 递归(与 -r 一起使用)
+ -a, --force-array 即使只有一个元素也强制采用数组
+ -T, --toggle 反转现有的布尔属性
+ -m, --monitor 监视属性更改的通道
+```
+
+这没有多大帮助,但我们还是可以从中找出一些有用的东西。首先,_通道_ 是可以修的属性的分组。我对 `general` 通道下的 `workspace_count` 属性进行了更改。让我们看看完整的通道列表:
+
+```
+$ xfconf-query -l
+Channels:
+ xfwm4
+ xfce4-keyboard-shortcuts
+ xfce4-notifyd
+ xsettings
+ xfdashboard
+ thunar
+ parole
+ xfce4-panel
+ xfce4-appfinder
+ xfce4-settings-editor
+ xfce4-power-manager
+ xfce4-session
+ keyboards
+ displays
+ keyboard-layout
+ ristretto
+ xfcethemer
+ xfce4-desktop
+ pointers
+ xfce4-settings-manager
+ xfce4-mixer
+```
+
+给定通道的属性也可以用下列的命令来查看。我使用 `less` 分页器,因为结果是一长串数据。我对下面的列表进行了裁剪,但留下了足够多的条目,你可以看到这些条目的类型。
+
+```
+$ xfconf-query -c xfwm4 -l | less
+/general/activate_action
+/general/borderless_maximize
+/general/box_move
+/general/box_resize
+/general/button_layout
+/general/button_offset
+<裁剪>
+/general/workspace_count
+/general/workspace_names
+/general/wrap_cycle
+/general/wrap_layout
+/general/wrap_resistance
+/general/wrap_windows
+/general/wrap_workspaces
+/general/zoom_desktop
+(END)
+```
+
+你可以用这种方式探索所有的通道。我发现通道通常对应“设置管理器”中的各种设置。这些属性是你在这些对话框中设置的。请注意,并非你在“设置管理器”对话窗口中找到的所有设置都是 Xfce 桌面的一部分,因此它们没有对应的通道。屏幕保护程序就是一个例子,因为它是通用的 GNU 屏幕保护程序,并不是 Xfce 独有的。“设置管理器” 是 Xfce 定位这些配置工具的一个很好的中心位置。
+
+### 文档
+
+综上所述,`xconf-query` 命令似乎没有任何手册或信息页,并且我在网上发现了很多不正确的、记录不全的信息。我发现对 Xfce4 来说最好的文档是 [Xfce 网站][2],关于 `xconf-query` 的一些具体信息可以在这里找到。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/1/remote-configuration-xfce4
+
+作者:[David Both][a]
+选题:[lujun9972][b]
+译者:[Donkey-Hao](https://github.com/Donkey-Hao)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/dboth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/code_computer_laptop_hack_work.png?itok=aSpcWkcl (Coding on a computer)
+[2]: https://www.xfce.org/
diff --git a/published/202206/20210124 3 stress-free steps to tackling your task list.md b/published/202206/20210124 3 stress-free steps to tackling your task list.md
new file mode 100644
index 0000000000..015dc51560
--- /dev/null
+++ b/published/202206/20210124 3 stress-free steps to tackling your task list.md
@@ -0,0 +1,66 @@
+[#]: collector: (lujun9972)
+[#]: translator: (Donkey-Hao)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-14773-1.html)
+[#]: subject: (3 stress-free steps to tackling your task list)
+[#]: via: (https://opensource.com/article/21/1/break-down-tasks)
+[#]: author: (Kevin Sonney https://opensource.com/users/ksonney)
+
+轻松解决你的任务清单的三个步骤
+======
+
+> 将你的大任务分为小步骤,避免自己不堪重负。
+
+
+
+本周开始,我先回顾我的日程安排,看看我需要或想要完成的事情。通常,列表上有些较大的项目。无论来自工作上的问题,还是一系列关于生产力的文章,或者改进我家的鸡舍,当作为一项工作时,这个任务真的很艰巨。很有可能我无法坐下来,在一个时间段内,甚至在一天内完成类似(请注意,只是举例)21 篇文章之类的事情。
+
+![21 Days of Productivity project screenshot][2]
+
+*21 天的生产力 (Kevin Sonney, [CC BY-SA 4.0][3])*
+
+所以当我的清单上有这样的东西时,我做的第一件事就是把它分解成更小的部分。如著名的诺贝尔文学奖得主 [William Faulkner][4] 说的“移山的人,从小石头开始。”(LCTT 译注:感觉与“千里之行,始于足下”是一个意思) 我们要解决大任务(山)并且需要完成各个步骤(小石头)。
+
+我使用下面的步骤将大任务分割为小步骤:
+
+ 1. 我通常很清楚完成一项任务需要做什么。如果没有,我会做一些研究来弄清楚这一点。
+ 2. 我会顺序的写下完成的步骤。
+ 3. 最后,我坐下来拿着我的日历和清单,开始将任务分散到几天(或几周或几个月),以了解我何时可以完成它。
+
+现在我不仅有计划,还知道多久能完成。逐步完成,我可以看到这项大任务不仅变得更小,而且更接近完成。
+
+军队有句古话,“遇敌无计”。 几乎可以肯定的是,有一两点(或五点)我意识到像“截屏”这样简单的事情需要扩展到更复杂的事情。事实上,在 [Easy!Appointments][5] 的截图中,竟然是:
+
+ 1. 安装和配置 Easy!Appointments
+ 2. 安装和配置 Easy!Appointments WordPress 插件
+ 3. 生成 API 密钥来同步日历
+ 4. 截屏
+
+即便如此,我也不得不将这些任务分解成更小的部分——下载软件、配置 NGINX、验证安装……你明白了吧。没关系。一个计划或一组任务不是一成不变的,可以根据需要进行更改。
+
+![project completion pie chart][6]
+
+*今年的计划已经完成了 2/3 ! (Kevin Sonney, [CC BY-SA 4.0][3])*
+
+这是一项后天习得的技能,最初几次需要一些努力。学习如何将大任务分解成更小的步骤可以让您跟踪实现目标或完成大任务的进度,而不会在过程中不知所措。
+
+--------------------------------------------------------------------
+
+via: https://opensource.com/article/21/1/break-down-tasks
+
+作者:[Kevin Sonney][a]
+选题:[lujun9972][b]
+译者:[Donkey](https://github.com/Donkey-Hao)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/ksonney
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/checklist_todo_clock_time_team.png?itok=1z528Q0y (Team checklist)
+[2]: https://opensource.com/sites/default/files/day14-image1.png
+[3]: https://creativecommons.org/licenses/by-sa/4.0/
+[4]: https://en.wikipedia.org/wiki/William_Faulkner
+[5]: https://opensource.com/article/21/1/open-source-scheduler
+[6]: https://opensource.com/sites/default/files/day14-image2_1.png
diff --git a/published/202206/20210131 How to teach open source beyond business.md b/published/202206/20210131 How to teach open source beyond business.md
new file mode 100644
index 0000000000..1e8afecdf6
--- /dev/null
+++ b/published/202206/20210131 How to teach open source beyond business.md
@@ -0,0 +1,73 @@
+[#]: collector: (lujun9972)
+[#]: translator: (duoluoxiaosheng)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-14686-1.html)
+[#]: subject: (How to teach open source beyond business)
+[#]: via: (https://opensource.com/article/21/1/open-source-beyond-business)
+[#]: author: (Irit Goihman https://opensource.com/users/iritgoihman)
+
+在商业之外,为学生们教授开源知识
+======
+
+> Beyond 计划连接起未来科技行业的人才和开源文化。
+
+
+
+那时,我还是一个大学生,我不明白人们为什么那么吹捧开源软件。我也使用 Linux 和开源软件,但是我不明白开源的运作模式,不知道如何参加一个开源项目,也不知道这对我未来的职业有什么好处。我的开发经验主要是家庭作业和学位需要的一个大型期末项目。
+
+所以,当我开始踏足科技行业时,我发现我还有很多知识需要学习。我需要了解如何加入一个既定的、可能很大并且分散在不同地方的团队,为一个正在进行中的项目工作。我还要学会正确的沟通以保证我付出的努力不白费。
+
+在这方面,我并不特别。我只是众多毕业生中的一员。
+
+### 开源让毕业生的起点更高
+
+作为一个工程师,一个管理者,从那时起我开始帮助刚入行的工程师。我发现,有开源经验的毕业生比没有开源经验的毕业生能更快的入门。
+
+通过将开源方法纳入学术研究,学生们可以获得相关的行业经验,学会利用他们自己的知识,并建立一个陈述观点和分享知识的平台。参与开源项目可以对学生的技术知识和经验产生积极影响。这可以帮助他们更好的规划自己的职业生涯。
+
+开源在科技行业的价值是公认的,它塑造了全球软件公司的文化。参与开源项目并采用 [开放组织文化][2] 正在成为行业普遍现象。公司寻求知道如何在开源领域工作并培养其文化的思想新颖、才华横溢的员工。因此,科技行业必须推动学术界将开源文化作为学习科技研究的基本方法之一。
+
+### 商业之上是开源文化
+
+当我遇到红帽的高级软件工程师 [Liora Milbaum][3] 时,我发现,我们对将开源文化和规则引入学术界有着共同的兴趣。Liora 之前创立了 [DevOps Loft][4], 在其中,她与有兴趣进入这个行业的人们分享了 DevOps 实践,并希望发起一个类似的项目,教授大学生开源。我们决定启动 [Beyond][5] 计划,将科技行业拥抱开源精神的人才与红帽的实践联系起来。
+
+我们在 [Tel Aviv-Yafo 技术学院][6] 开始了 Beyond 计划,在那里,我们受到了信息系统学院的热烈欢迎。我们从介绍 DevOps 技术栈的 “DevOps 入门” 开始。我们开始时最大的挑战是怎么讲明白开源是什么。答案似乎很简单:实践出真理。我们不想给学生们讲授什么老套的学院课程,相反,我们想让学生接触到行业标准。
+
+我们创建了一个包含常见的开源项目和工具的教学大纲来教授 DevOps 技术栈。该课程由工程师教授的讲座和实践组成。学生们被分成小组,每组都由一名工程师指导和支持。他们练习团队合作,分享知识(在团队内外),并有效的协作。
+
+在我们为计算机科学学院的通讯准备的高级课程 “开源开发的基础” 中,我们遇到了另外的困难。当我们的课程开始两周以后,随着新冠疫情在全球的流行,我们完全靠远程沟通。我们通过与学生一起使用我们在红帽日常工作中使用的相同远程协作工具解决了这个问题。我们惊讶于过渡的是如此简单和顺利。
+
+![Beyond teaching online][7]
+
+(Irit Goihman, [CC BY-SA 4.0][8])
+
+### 成果展示
+
+这两个课程取得了巨大的成功,我们甚至雇佣了我们最优秀的学生之一。我们收到了非常棒的反馈,同学们表示,我们对他们的知识、思维和软技能产生了积极影响。一些学生因为在课程期间的开源贡献而得到了他们第一份技术工作。
+
+其他学术机构对这些课程表达出了极大的兴趣,因此我们将这个项目扩展到了另外一所大学。
+
+很荣幸,在一群优秀工程师的参与下,与 Liora 一起领导这个成功的项目。我们一起助力开源社区的成长。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/1/open-source-beyond-business
+
+作者:[Irit Goihman][a]
+选题:[lujun9972][b]
+译者:[duoluoxiaosheng](https://github.com/duoluoxiaosheng)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/iritgoihman
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/osdc-lead-teacher-learner.png?itok=rMJqBN5G (Teacher or learner?)
+[2]: https://opensource.com/open-organization/resources/open-org-definition
+[3]: https://www.linkedin.com/in/lioramilbaum
+[4]: https://www.devopsloft.io/
+[5]: https://research.redhat.com/blog/2020/05/24/open-source-development-course-and-devops-methodology/
+[6]: https://www.int.mta.ac.il/
+[7]: https://opensource.com/sites/default/files/pictures/beyond_mta.png (Beyond teaching online)
+[8]: https://creativecommons.org/licenses/by-sa/4.0/
diff --git a/published/202206/20210207 3 ways to play video games on Linux.md b/published/202206/20210207 3 ways to play video games on Linux.md
new file mode 100644
index 0000000000..75f0f9992b
--- /dev/null
+++ b/published/202206/20210207 3 ways to play video games on Linux.md
@@ -0,0 +1,97 @@
+[#]: collector: (lujun9972)
+[#]: translator: (godgithubf)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-14756-1.html)
+[#]: subject: (3 ways to play video games on Linux)
+[#]: via: (https://opensource.com/article/21/2/linux-gaming)
+[#]: author: (Seth Kenlon https://opensource.com/users/seth)
+
+在 Linux 上玩电子游戏的三种方式
+======
+
+> 如果你准备放下爆米花,想从各个角度体验游戏的话,那么就在 Linux 下打开游戏吧!
+
+
+
+如今,人们有更多喜欢 Linux 的理由。在这个系列里,我将分享 21 个使用 Linux 的理由。今天,我将从游戏开始。
+
+我过去认为“游戏玩家”是一种非常特殊的生物,要由科学家们在数年的研究和测试之后严谨地认定才行。我从来没有把自己归类为游戏玩家,因为我所玩过的游戏要么是桌面游戏(棋盘类游戏和纸笔角色扮演游戏),要么是 NetHack、俄罗斯方块。现在,在移动设备、游戏机、电脑和电视机上都有游戏,我觉得现在的承认有各种形式的游戏玩家们了。如果你想自称为游戏玩家,你就可以是,不需任何资格认定。你不用必须在心里熟记那些“上上下下左右左右BA”的科乐美秘籍(你甚至可以不知道这是什么);你也不用必须买过和玩过 3A 级游戏。如果你时不时地玩游戏,你就完全可以自称为玩家。如果你想成为一名玩家,那么现在使用 Linux 正当其时。
+
+### 欢迎来到游戏世界
+
+剥除光鲜的广告,在其下面,你肯定会发现一个欣欣向荣的游戏世界。在人们相信不是电子表格也不是练习打字一类的软件能挣钱以前,新兴的游戏市场已经开始发展起来了。独立游戏已经在流行文化上以各种方式打上了自己的烙印(或许你不相信,《我的世界》尽管不是开源的,但一开始就是一款独立游戏),这也证实了,在玩家眼里,可玩性高于产品价值。
+
+独立开发者和开源开发者之间有很多交集。没有什么比带着你的 Linux 笔记本电脑,浏览 itch.io 或你的发行版的软件库,寻找鲜为人知但珍贵的开源游戏宝藏更有意义了。
+
+有各种各样的开源游戏,包括大量的第一视角射击游戏、Nodulus 之类的益智游戏、运输大亨之类的策略经营游戏、Jethook 之类的竞速游戏、Sauerbraten 之类的竞速逃生游戏,以及很多未提到的(多亏了像 Open Jam 这样伟大的活动,每年都有新增的游戏)。
+
+![Jethook game screenshot][10]
+
+总的来说,探索开源游戏的世界的体验,和购买大型游戏工作室的产品带来的即时满足感有很大的不同。大型游戏工作室生产的游戏提供大量的视听刺激、知名演员、和长达 60 小时以上的游戏时长。而独立和开源游戏不能与之相提并论。但是话又说回来,大型游戏工作室无法提供的是,当你发现一款别人未曾听说过的游戏时的产生的发现感和与个人相关的感受。当你意识到别人都非常想知道你刚玩过的哪个出色游戏时,大型工作室也并不能提供这种紧迫感。(LCTT 校注:此处大概的意思是指大型工作室的作品已被人熟知,没有什么挖掘的新鲜感)
+
+花点时间找出你最喜欢的游戏,然后浏览下你的发行商的软件仓库、Flathub、开源的游戏仓库,看看你能发现什么,如果发现你很喜欢的游戏,就帮忙推广一下吧。
+
+#### Proton 和 WINE
+
+Linux 上的游戏并没有止步于开源,但是从开源开始的。数年前 Valve 软件公司通过发行 Linux 版的 Steam 客户端把 Linux 重新带入游戏市场时,人们希望这可以推动游戏工作室能编写原生的 Linux 游戏。一些工作室这样做了,但 Valve 公司并没有成功的把 Linux 推为主要的平台,即使是 Valve 品牌的游戏电脑。并且大多数游戏工作室又转回仅在 Windows 平台上开发游戏的旧方式。
+
+有趣的是,最终的结果是产生了更多的开源代码。Valve 公司为 Linux 兼容创建了 Proton 工程,一个可以转换 Windows 游戏到 Linux 的兼容层。在 Proton 的内核层面,它使用了WINE(Wine Is Not an Emulator) —— 以开源的方式极好地重新实现了主要的 Windows 库。
+
+游戏市场的成果,如今已经变成了开源世界的宝藏。今天,来自大型工作室的大多数游戏都可以在 Linux 上像原生游戏一样运行。
+
+当然,如果你是必须要在发行日就玩上最新版游戏的这类玩家,你可能会遇到一些令人不愉快的“惊喜”。尽管那不是惊喜,很少有大型游戏在发行时毫无漏洞,一周后才补上补丁。这些游戏在 Proton 和 WINE 上运行时遇到这些错误可能更糟糕,因此 Linux 玩家通过避免尽早上车而避免这些问题。这种妥协可能是值得的。我玩过一些游戏,它们在 Proton 平台运行完美,后来从愤怒的论坛帖子中发现,它在最新版的 Windows 上运行显然充满了致命的错误。总之,似乎来自大型工作室的游戏并不完美,但你可能在 Linux 上遇到相似但不同的问题,正如你在 Windows 上遇到的。
+
+#### Flatpak
+
+Linux 近来历史上最令人激动的发展就是 Flatpak 了,它是本地容器和打包的结合,它和游戏无关(或者它和游戏息息相关),它使得 Linux 应用基本上能被分发到任意的 Linux 发行版上。这也适用于游戏,因为在游戏中使用了相当多的前沿技术,而对发行版维护者来说,要跟上任何特定游戏所需的所有最新版本可能是相当苛刻的。
+
+Flapak 通过为应用程序库抽象出一种通用的 Flatpak 特定的层,而将其从发行版中抽象出来。Flatpak 软件包的发行者知道,如果一个库不在 Flatpak SDK 中,那么它必须要包含在 Flatpak 软件包中,简单而直接。
+
+多亏了 Flatpak,Steam 客户端可以运行在像 Fedora 这样的常用发行版上,也可以运行在 RHEL、Slackware 等从传统角度看并不面向游戏市场的操作系统上。
+
+#### Lutris
+
+如果你并不急于在 Steam 上注册账号,那么可以用我比较偏爱的游戏客户端 Lutris 。表面上看,Lutris 是一个简单的游戏启动器,当你想玩游戏但还没决定玩什么的时候,你可以到这这里找找。有了 Lutris,你可以将系统上的所有游戏添加到你的游戏库,然后从 Lutris 界面启动并立即玩起来。更好的是,Lutris 贡献者(像我一样)会定期发布安装脚本,使你可以轻松安装自己的游戏。这并不是必须的,但它可以是一个很好的捷径,可以绕过一些繁琐的配置。
+
+Lutris 也可以借助运行器或子系统,来运行那些不能从应用菜单直接启动的游戏。比如你想玩开源的《魔兽塔防》这样的游戏机游戏,你必须运行模拟器。如果你已经安装过模拟器的话,Lutris 可以帮你处理这一切。除此以外,如果你有一个 GOG.com 游戏账号,Lutris 可以访问它,并可以把游戏导入你的游戏库中。
+
+没有比这更容易的管理你的游戏的方式了。
+
+### 去玩游戏吧
+
+Linux 游戏是一种充实且给人力量的体验。我过去避免玩电脑游戏,因为我不觉得我有太多的选择。似乎昂贵的游戏总是在不断发布,并且不可避免的获得好或者不好的极端体验,然后很快又转向下一个。另一方面,开源游戏把我引入了游戏的圈子。我见到过其他玩家和开发者。我见到过艺术家和音乐家、粉丝以及推广者。我玩过各种各样的我从来不知道的游戏。其中一些甚至不够我玩一下午,而其他的却让我长久的着迷于游戏、修改、关卡设计和乐趣。
+
+如果你准备好放下爆米花,从各个角度体验下游戏的话,那就在 Linux 上开始游戏吧。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/2/linux-gaming
+
+作者:[Seth Kenlon][a]
+选题:[lujun9972][b]
+译者:[godgithubf](https://github.com/godgithubf)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/seth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/gaming_grid_penguin.png?itok=7Fv83mHR (Gaming with penguin pawns)
+[2]: https://opensource.com/alternatives/minecraft
+[3]: https://itch.io/jam/open-jam-2020
+[4]: https://opensource.com/article/20/5/open-source-fps-games
+[5]: https://hyperparticle.itch.io/nodulus
+[6]: https://www.openttd.org/
+[7]: https://rcorre.itch.io/jethook
+[8]: http://sauerbraten.org/
+[9]: https://opensource.com/article/18/9/open-jam-announcement
+[10]: https://opensource.com/sites/default/files/game_0.png
+[11]: http://flathub.org
+[12]: https://github.com/ValveSoftware/Proton
+[13]: http://winehq.org
+[14]: https://opensource.com/business/16/8/flatpak
+[15]: https://www.redhat.com/en/enterprise-linux-8
+[16]: http://lutris.net
+[17]: https://opensource.com/article/18/10/lutris-open-gaming-platform
+[18]: https://ndswtd.wordpress.com/download
diff --git a/published/202206/20210210 Manage your budget on Linux with this open source finance tool.md b/published/202206/20210210 Manage your budget on Linux with this open source finance tool.md
new file mode 100644
index 0000000000..7434c9614f
--- /dev/null
+++ b/published/202206/20210210 Manage your budget on Linux with this open source finance tool.md
@@ -0,0 +1,81 @@
+[#]: collector: (lujun9972)
+[#]: translator: (hanszhao80)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-14679-1.html)
+[#]: subject: (Manage your budget on Linux with this open source finance tool)
+[#]: via: (https://opensource.com/article/21/2/linux-skrooge)
+[#]: author: (Seth Kenlon https://opensource.com/users/seth)
+
+使用 Linux 上的开源财务工具 Skrooge 管理你的预算
+======
+
+> 使用开源预算工具 Skrooge 让你的财务管理更加轻松。
+
+
+
+2021 年,人们喜欢 Linux 的理由比以往任何时候都多。在本系列中,我将分享使用 Linux 的 21 个不同理由。本篇介绍的是个人财务管理。
+
+个人财务可能很难管理。当你没有足够的钱在没有经济援助的情况下度日时,这可能是令人沮丧甚至不安的,而当你确实有所需的钱却又不清楚每个月的去向时,这可能会令人惊讶地难以接受。更糟糕的是,我们经常被告知要“制定预算”,好像宣布你每个月的花销就能在某种程度上体现出你需要多少钱。底线是:制定预算是困难的,没有达到你的财务目标是令人沮丧的。但这仍然很重要,Linux 有几个工具可以帮助使任务变得可管理。
+
+### 理财
+
+就像生活中的其他事情一样,我们都有自己的方法来跟踪我们的财务。我过去常常采取一种简单而直接的方法:我的薪水支票被存入一个账户,然后我会提取一定比例的现金。一旦我钱包里的钱没了,我就得等到下一个发薪日才能花钱。我用了一天没有午餐的时间,就明白了我必须认真对待我的目标,并相应地调整了我的消费行为。对于当时我的简单的生活方式来说,这是一种让我对自己的收入保持诚实的有效手段,但它并不能很好地转化为在线商业交易、长期公用事业合同、投资等等。
+
+随着我不断完善我的财务跟踪方式,我了解到个人会计始终是一个不断发展的过程。我们每个人都有独特的财务状况,这告诉我们可以或应该使用什么样的解决方案来跟踪我们的收入和债务。如果你失业了,那么你的预算目标可能是尽可能少花钱。如果你在工作,但在还学生贷款,那么你的目标可能是向银行汇款。如果你在工作,但计划退休,那么你可能会尽可能多地存钱。
+
+关于预算,要记住的一点是,它是为了将你的财务现实与你的财务 _目标_ 进行比较。你无法避免一些开支,但在这些之后,你可以设定自己的优先事项。如果你没有达到你的目标,你可以调整自己的行为或改写你的目标,使其更好地反映现实。调整你的财务计划并不意味着你失败了,这只是意味着你最初的预测并不准确。在困难时期,你可能无法达到任何预算目标,但如果你坚持你的预算,你会学到很多关于维持你目前的生活方式(无论它是什么)所需要的财务手段。随着时间的推移,你可以学习调整你可能从未意识到的变化。例如,由于远程工作已成为一种被广泛接受的选择,人们正在搬到农村城镇以降低生活成本。看到这样一种生活方式的转变可以改变你的预算报告,真是令人震惊。
+
+重点是,预算编制是一项经常被低估的活动,这在很大程度上是因为它令人生畏。重要的是要认识到,无论你的专业水平或对财务的兴趣如何,你都可以进行预算。无论你 [只使用 LibreOffice 电子表格][2],还是尝试专用的财务应用程序,你都可以设定目标,跟踪自己的行为,并学到许多宝贵的经验教训,这些经验教训最终可能会带来回报。
+
+### 开源会计
+
+有几个专用于 [Linux 的个人理财应用程序][3],包括 [HomeBank][4]、[Money Manager EX][5]、[GNUCash][6]、[KMyMoney][7] 和 [Skrooge][8]。所有这些应用程序本质上都是账本,你可以在每个月底(或每当你查看帐户时)退回到一个地方,从你的银行导入数据,并审查你的支出如何与你为自己设定的预算保持一致。
+
+![显示财务数据的 Skrooge 界面][9]
+
+我使用 Skrooge 作为我的个人预算跟踪器。即便面对多个银行账户,它也能轻松自如的设置。与大多数开源金融应用程序一样,Skrooge 可以导入多种文件格式,因此我的工作流程大致如下:
+
+ 1. 登录我的银行。
+ 2. 将当月的银行对账单导出为 QIF 文件。
+ 3. 打开 Skrooge。
+ 4. 导入 QIF 文件。每个文件都会自动分配到相应的帐户。
+ 5. 对照我为自己设定的预算目标审查我的支出。如果我超支了,那么我就会扣减下个月的目标(这样我就会理性地少花钱来弥补差额)。如果我尚未超出我的目标预算,那么我会把多余的部分移到 12 月的预算中(这样我在年底就会有更多的支出份额)。
+
+我只跟踪了 Skrooge 中的家庭预算的一部分。Skrooge 通过一个动态数据库简化了这一过程,该数据库允许我使用自定义标签一次对多个交易进行分类。这使我可以轻松地从一般家庭和公用事业支出中提取我的个人支出,并且我可以在查看 Skrooge 提供的自动生成的报告时利用这些类别。
+
+![Skrooge 预算饼图][10]
+
+最重要的是,流行的 Linux 财务应用程序使我能够以最适合我的方式管理我的预算。例如,我的合作伙伴更喜欢使用 LibreOffice 电子表格,但我只需要付出很少的努力就可以从家庭预算中提取 CSV 文件,将其导入到 Skrooge,并使用一组更新的数据集。不存在供应商锁定和不兼容。该系统灵活敏捷,使我们能够在更多地了解有效预算和生活中的情况时调整我们的预算和跟踪支出的方法。
+
+### 开放选择
+
+世界各地的货币市场各不相同,我们每个人与之互动的方式也决定了我们可以使用哪些工具。归根结底,你对财务类软件的选择必须基于自己的需求。开源做得特别好的一件事是为用户提供了选择的自由。
+
+在设定自己的财务目标时,我很欣赏我可以使用最适合我个人计算风格的任何应用程序。我可以控制我在生活中如何处理数据,即使是我不一定喜欢处理的数据。Linux 及其令人惊叹的应用程序集使它不再是一件苦差事。
+
+在 Linux 上尝试一些财务应用程序,看看你是否可以激励自己设定一些目标并节省开支吧!
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/2/linux-skrooge
+
+作者:[Seth Kenlon][a]
+选题:[lujun9972][b]
+译者:[hanszhao80](https://github.com/hanszhao80)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/seth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/Medical%20Costs%20Transparency_1.jpg?itok=CkZ_J88m (2 cents penny money currency)
+[2]: https://opensource.com/article/20/3/libreoffice-templates
+[3]: https://opensource.com/life/17/10/personal-finance-tools-linux
+[4]: http://homebank.free.fr/en/index.php
+[5]: https://www.moneymanagerex.org/download
+[6]: https://opensource.com/article/20/2/gnucash
+[7]: https://kmymoney.org/download.html
+[8]: https://apps.kde.org/en/skrooge
+[9]: https://opensource.com/sites/default/files/skrooge.jpg
+[10]: https://opensource.com/sites/default/files/skrooge-pie_0.jpg
diff --git a/published/202206/20210319 Create a countdown clock with a Raspberry Pi.md b/published/202206/20210319 Create a countdown clock with a Raspberry Pi.md
new file mode 100644
index 0000000000..40f4299374
--- /dev/null
+++ b/published/202206/20210319 Create a countdown clock with a Raspberry Pi.md
@@ -0,0 +1,369 @@
+[#]: subject: (Create a countdown clock with a Raspberry Pi)
+[#]: via: (https://opensource.com/article/21/3/raspberry-pi-countdown-clock)
+[#]: author: (Chris Collins https://opensource.com/users/clcollins)
+[#]: collector: (lujun9972)
+[#]: translator: (Donkey-Hao)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-14731-1.html)
+
+使用树莓派做一个倒计时器
+======
+
+> 使用树莓派和电子纸显示屏开始倒计时你的下一个假期。
+
+
+
+[圆周率日][2](3 月 14 日) 来了又走,留下美好的回忆以及 [许多树莓派项目][3] 等待我们去尝试。在任何令人精神振奋、充满欢乐的假期后回到工作中都很难,圆周率日也不例外。当我们回望三月的时候,渴望那些天的快乐。但是不用害怕,亲爱的圆周率日庆祝者们,我们开始下一个节日的漫长倒计时!
+
+好了,严肃点。我做了一个圆周率日倒计时器,你也可以!
+
+不久前,我购买了一个 [树莓派 Zero W][4],并且用它来 [解决 WiFi 信号较差的原因][5] 。我也对使用电子纸来作为它的显示屏十分感兴趣。虽然我不知道该用它来干什么,但是!它看起来真的很有趣!我买了一个十分适合放在树莓派的顶部的 2.13 英寸的 [WaveShare 显示器][6] 。安装很简单:只需要将显示器接到树莓派的 GPIO 上即可。
+
+我使用 [树莓派操作系统][7] 来实现该项目,虽然其他的操作系统肯定也能完成。但是下面的 `raspi-config` 命令在树莓派系统上很容易使用。
+
+### 设置树莓派和电子纸显示屏
+
+设置树莓派和电子纸显示屏一起工作,需要你在树莓派软件中启用串行外设接口(SPI),安装 BCM2835 C 库(来访问树莓派上的博通 BCM 2835 芯片的 GPIO 功能),安装 Python GPIO 库来控制电子纸显示屏。最后,你需要安装 WaveShare 的库来使用 Python 控制这个 2.13 英寸的显示屏。
+
+下面是完成这些的步骤。
+
+#### 启用 SPI
+
+树莓派上启用 SPI 最简单的方式是使用 `raspi-config` 命令。SPI 总线允许与设备进行串行数据通信——在本例中,电子纸显示:
+
+```
+$ sudo raspi-config
+```
+
+从弹出的菜单中, 选择 “接口选项 -> SPI -> 是” 来启用 SPI 接口,然后启动。
+
+#### 安装 BCM2835 库
+
+如上所述,BCM2835 库是用于树莓派博通 BCM2385 芯片的软件,它允许访问 GPIO 引脚来控制设备。
+
+在我写这篇文章之时,用于树莓派的最新博通 BCM2385 库版本是 v1.68 。安装此库需要下载软件压缩包然后使用 `make` 来安装:
+
+```
+# 下载 BCM2853 库并解压
+$ curl -sSL http://www.airspayce.com/mikem/bcm2835/bcm2835-1.68.tar.g> -o - | tar -xzf -
+
+# 进入解压后的文件夹
+$ pushd bcm2835-1.68/
+
+# 配置、检查并安装 BCM2853 库
+$ sudo ./configure
+$ sudo make check
+$ sudo make install
+
+# 返回上级目录
+$ popd
+```
+
+#### 安装需要的 Python 库
+
+你用 Python 控制电子纸显示屏需要安装 Python 库 `RPi.GPIO`,还需要使用 `python3-pil` 包来画图。显然,PIL 包已经不行了,但 Pillow 可以作为代替方案。我还没有为该项目测试过 Pillow ,但它可行:
+
+```
+# 安装需要的 Python 库
+$ sudo apt-get update
+$ sudo apt-get install python3-pip python3-pil
+$ sudo pip3 install RPi.GPIO
+```
+
+_注意:这些是 Python3 的指令。你可以在 WaveShare 网站查到 Python2 的指令。_
+
+#### 下载 WaveShare 示例和 Python 库
+
+Waveshare 维护了一个 Python 和 C 的 Git 库,用于使用其电子纸显示屏和一些展示如何使用它们的示例。对这个倒计时时钟而言,你需要克隆这个库并使用用于 2.13 英寸显示屏的库:
+
+```
+# 克隆这个 WaveShare e-Paper git 库
+$ git clone https://github.com/waveshare/e-Paper.gi>
+```
+
+如果你用不同的显示器或者其他公司产品,需要使用适配软件。
+
+Waveshare 提供了很多指导:
+
+ * [WaveShare 电子纸设置指导][9]
+ * [WaveShare 电子纸库安装指导][10]
+
+#### 获得有趣的字体(选做)
+
+你可以随心所欲的使用显示器,为什么不搞点花样?找一个炫酷的字体!
+
+这有大量 [开放字体许可][11] 的字体可供选择。我十分喜爱 Bangers 字体。如果你看过 YouTube 那你见过这种字体了,它十分流行。你可以下载到本地的共享字体目录文件中,并且所有的应用都可以使用,包括这个项目:
+
+```
+# “Bangers” 字体是 Vernon Adams 使用 Google 字体开放许可授权的字体
+$ mkdir -p ~/.local/share/fonts
+$ curl -sSL https://github.com/google/fonts/raw/master/ofl/bangers/Bangers-Regular.ttf -o fonts/Bangers-Regular.ttf
+```
+
+### 创建一个圆周率日倒计时器
+
+现在你已经安装好了软件,可以使用带有炫酷字体的电子纸显示屏了。你可以创建一个有趣的项目:倒计时到下一个圆周率日!
+
+如果你想,你可以从该项目的 [GitHub 仓库][13] 直接下载 [countdown.py][12] 这个 Python 文件并跳到文章结尾。
+
+为了满足大家的好奇心,我将逐步讲解。
+
+#### 导入一些库
+
+```
+#!/usr/bin/python3
+# -*- coding:utf-8 -*-
+import logging
+import os
+import sys
+import time
+
+from datetime import datetime
+from pathlib import Path
+from PIL import Image,ImageDraw,ImageFont
+
+logging.basicConfig(level=logging.INFO)
+
+basedir = Path(__file__).parent
+waveshare_base = basedir.joinpath('e-Paper', 'RaspberryPi_JetsonNano', 'python')
+libdir = waveshare_base.joinpath('lib')
+```
+
+开始先导入一些标准库之后脚本中用。也需要你从 PIL 添加 `Image`、`ImageDraw` 和 `ImageFont`,你会用到这些来画一些简单的图形。最后,为本地 `lib` 目录设置一些变量,该目录包含了用于 2.13 英寸显示屏的 Waveshare Python 库,稍后你可以使用这些变量从本地目录加载库。
+
+#### 字体大小辅助函数
+
+下一部分是为你选择的 Bangers-Regular.ttf 字体建立一个修改大小的辅助函数。该函数将整型变量作为大小参数,并返回一个图形字体对象来用于显示:
+
+```
+def set_font_size(font_size):
+ logging.info("Loading font...")
+ return ImageFont.truetype(f"{basedir.joinpath('Bangers-Regular.ttf').resolve()}", font_size)
+```
+
+#### 倒计时逻辑
+
+接下来是计算这个项目的一个函数:距下次圆周率日还有多久。如果是在一月,那么计算剩余天数将很简单。但是你需要考虑是否今年的圆周率日是否已经过去了(允悲)。如果是的话,那么计算在你可以再次庆祝之前还有多少天:
+
+```
+def countdown(now):
+ piday = datetime(now.year, 3, 14)
+
+ # 如果错过了就增加一年
+ if piday < now:
+ piday = datetime((now.year + 1), 3, 14)
+
+ days = (piday - now).days
+
+ logging.info(f"Days till piday: {days}")
+ return day
+```
+
+#### 主函数
+
+最后,到了主函数,需要初始化显示屏并向它写数据。这时,你应该写一个欢迎语然后再开始倒计时。但是首先,你需要加载 Waveshare 库:
+
+```
+def main():
+
+ if os.path.exists(libdir):
+ sys.path.append(f"{libdir}")
+ from waveshare_epd import epd2in13_V2
+ else:
+ logging.fatal(f"not found: {libdir}")
+ sys.exit(1)
+```
+
+上面的代码片段检查以确保该库已下载到倒计时脚本旁边的目录中,然后加载`epd2in13_V2` 库。如果你使用不同的显示屏,则需要使用不同的库。如果你愿意,也可以自己编写。我发现阅读 Waveshare 随显示屏提供的 Python 代码很有趣,它比我想象的要简单得多。
+
+下一段代码创建一个 EPD(电子纸显示屏)对象以与显示器交互并初始化硬件:
+
+```
+ logging.info("Starting...")
+ try:
+ # 创建一个显示对象
+ epd = epd2in13_V2.EPD()
+
+ # 初始化并清空显示
+ # ePaper 保持它的状态处分更新
+ logging.info("Initialize and clear...")
+ epd.init(epd.FULL_UPDATE)
+ epd.Clear(0xFF)
+```
+
+关于电子纸的一个有趣之处:它仅在将像素从白色变为黑色或从黑色变为白色时才耗电。这意味着当设备断电或应用程序因任何原因停止时,屏幕上的任何内容都会保留下来。从功耗的角度来看,这很好,但这也意味着你需要在启动时清除显示,否则你的脚本只会覆盖屏幕上已有的内容。 因此,`epd.Clear(0xFF)` 用于在脚本启动时清除显示。
+
+接下来,创建一个“画布”来绘制剩余的显示输出:
+
+```
+ # 创建一个图形对象
+ # 注意:"epd.heigh" 是屏幕的长边
+ # 注意:"epd.width" 是屏幕的短边
+ # 真是反直觉…
+ logging.info(f"Creating canvas - height: {epd.height}, width: {epd.width}")
+ image = Image.new('1', (epd.height, epd.width), 255) # 255: clear the frame
+ draw = ImageDraw.Draw(image)
+```
+
+这与显示器的宽度和高度相匹配——但它有点反直觉,因为显示器的短边是宽度。我认为长边是宽度,所以这只是需要注意的一点。 请注意,`epd.height` 和 `epd.width` 由 Waveshare 库设置以对应于你使用的设备。
+
+#### 欢迎语
+
+接下来,你将开始画一些画。这涉及在你之前创建的“画布”对象上设置数据。这还没有将它绘制到电子纸显示屏上——你现在只是在构建你想要的图像。由你为这个项目绘制带有一块馅饼的图像,来创建一个庆祝圆周率日的欢迎信息:
+
+![画一块馅饼][14]
+
+很可爱,不是吗?
+
+```
+ logging.info("Set text text...")
+ bangers64 = set_font_size(64)
+ draw.text((0, 30), 'PI DAY!', font = bangers64, fill = 0)
+
+ logging.info("Set BMP...")
+ bmp = Image.open(basedir.joinpath("img", "pie.bmp"))
+ image.paste(bmp, (150,2))
+```
+最后,_真是是最后了_,你可以展示你画的图画:
+
+```
+ logging.info("Display text and BMP")
+ epd.display(epd.getbuffer(image))
+```
+
+上面那段话更新了显示屏,以显示你所画的图像。
+
+接下来,准备另一幅图像展示你的倒计时:
+
+#### 圆周率日倒计时
+
+首先,创建一个用来展示倒计时的图像对象。也需要设置数字的字体大小:
+
+```
+ logging.info("Pi Date countdown; press CTRL-C to exit")
+ piday_image = Image.new('1', (epd.height, epd.width), 255)
+ piday_draw = ImageDraw.Draw(piday_image)
+
+ # 设置字体大小
+ bangers36 = set_font_size(36)
+ bangers64 = set_font_size(64)
+```
+
+为了使它显示的时候更像一个倒计时,更新图像的一部分是更加有效的手段,仅更改已经改变的显示数据部分。下面的代码准备以这样方式运行:
+
+```
+ # 准备更新显示
+ epd.displayPartBaseImage(epd.getbuffer(piday_image))
+ epd.init(epd.PART_UPDATE)
+```
+
+最后,需要计时,开始一个无限循环来检查据下次圆周率日还有多久,并显示在电子纸上。如果到了圆周率日,你可以输出一些庆祝短语:
+
+```
+ while (True):
+ days = countdown(datetime.now())
+ unit = get_days_unit(days)
+
+ # 通过绘制一个填充有白色的矩形来清除屏幕的下半部分
+ piday_draw.rectangle((0, 50, 250, 122), fill = 255)
+
+ # 绘制页眉
+ piday_draw.text((10,10), "Days till Pi-day:", font = bangers36, fill = 0)
+
+ if days == 0:
+ # 绘制庆祝语
+ piday_draw.text((0, 50), f"It's Pi Day!", font = bangers64, fill = 0)
+ else:
+ # 绘制距下一次 Pi Day 的时间
+ piday_draw.text((70, 50), f"{str(days)} {unit}", font = bangers64, fill = 0)
+
+ # 渲染屏幕
+ epd.displayPartial(epd.getbuffer(piday_image))
+ time.sleep(5)
+```
+
+脚本最后做了一些错误处理,包括捕获键盘中断,这样你可以使用 `Ctrl + C` 来结束无限循环,以及一个根据计数来打印 `day` 或 `days` 的函数:
+
+```
+ except IOError as e:
+ logging.info(e)
+
+ except KeyboardInterrupt:
+ logging.info("Exiting...")
+ epd.init(epd.FULL_UPDATE)
+ epd.Clear(0xFF)
+ time.sleep(1)
+ epd2in13_V2.epdconfig.module_exit()
+ exit()
+
+def get_days_unit(count):
+ if count == 1:
+ return "day"
+
+ return "days"
+
+if __name__ == "__main__":
+ main()
+```
+
+现在你已经拥有一个倒计时并显示剩余天数的脚本!这是在我的树莓派上的显示(视频经过加速,我没有足够的磁盘空间来保存一整天的视频):
+
+![Pi Day Countdown Timer In Action][16]
+
+#### 安装 systemd 服务(选做)
+
+如果你希望在系统打开时运行倒计时显示,并且无需登录并运行脚本,你可以将可选的 systemd 单元安装为 [systemd 用户服务][17]。
+
+将 GitHub 上的 [piday.service][18] 文件复制到 `${HOME}/.config/systemd/user`,如果该目录不存在,请先创建该目录。然后你可以启用该服务并启动它:
+
+```
+$ mkdir -p ~/.config/systemd/user
+$ cp piday.service ~/.config/systemd/user
+$ systemctl --user enable piday.service
+$ systemctl --user start piday.service
+
+# Enable lingering, to create a user session at boot
+# and allow services to run after logout
+$ loginctl enable-linger $USER
+```
+
+该脚本将输出到 systemd 日志,可以使用 `journalctl` 命令查看输出。
+
+### 它开始看起来像是圆周率日了!
+
+这就是你的作品!一个显示在电子纸显示屏上的树莓派 Zero W 圆周率日倒计时器!并在系统启动时使用 systemd 单元文件启动!现在距离我们可以再次相聚庆祝圆周率日还有好多天的奇妙设备———树莓派。通过我们的小项目,我们可以一目了然地看到确切的天数。
+
+但实际上,每个人都可以在每一天在心中庆祝圆周率日,因此请使用自己的树莓派创建一些有趣且具有教育意义的项目吧!
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/3/raspberry-pi-countdown-clock
+
+作者:[Chris Collins][a]
+选题:[lujun9972][b]
+译者:[Donkey](https://github.com/Donkey-Hao)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/clcollins
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/clocks_time.png?itok=_ID09GDk (Alarm clocks with different time)
+[2]: https://en.wikipedia.org/wiki/Pi_Day
+[3]: https://opensource.com/tags/raspberry-pi
+[4]: https://www.raspberrypi.org/products/raspberry-pi-zero-w/
+[5]: https://opensource.com/article/21/3/troubleshoot-wifi-go-raspberry-pi
+[6]: https://www.waveshare.com/product/displays/e-paper.htm
+[7]: https://www.raspberrypi.org/software/operating-systems/
+[8]: https://pypi.org/project/Pillow/
+[9]: https://www.waveshare.com/wiki/2.13inch_e-Paper_HAT
+[10]: https://www.waveshare.com/wiki/Libraries_Installation_for_RPi
+[11]: https://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL
+[12]: https://github.com/clcollins/epaper-pi-ex/blob/main/countdown.py
+[13]: https://github.com/clcollins/epaper-pi-ex/
+[14]: https://opensource.com/sites/default/files/uploads/pie.png (drawing of a piece of pie)
+[15]: https://creativecommons.org/licenses/by-sa/4.0/
+[16]: https://opensource.com/sites/default/files/uploads/piday_countdown.gif (Pi Day Countdown Timer In Action)
+[17]: https://wiki.archlinux.org/index.php/systemd/User
+[18]: https://github.com/clcollins/epaper-pi-ex/blob/main/piday.service
diff --git a/published/202206/20210405 How different programming languages do the same thing.md b/published/202206/20210405 How different programming languages do the same thing.md
new file mode 100644
index 0000000000..0d8a476397
--- /dev/null
+++ b/published/202206/20210405 How different programming languages do the same thing.md
@@ -0,0 +1,409 @@
+[#]: subject: "How different programming languages do the same thing"
+[#]: via: "https://opensource.com/article/21/4/compare-programming-languages"
+[#]: author: "Jim Hall https://opensource.com/users/jim-hall"
+[#]: collector: "lujun9972"
+[#]: translator: "VeryZZJ"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14687-1.html"
+
+不同编程语言是如何完成同一件事
+======
+
+> 通过一个简单的小游戏比较 13 种编程语言。
+
+
+
+当我开始学习一种新的编程语言时,会把重点放在定义变量、书写声明以及计算表达式,一旦对这些概念有一个大致的了解,通常就能够自己弄清剩下的部分。大多数编程语言都具有相似性,所以如果你掌握了一种编程语言,学习下一种语言的重点就是弄清楚独有的概念以及区分不同。
+
+我喜欢写一些测试程序来帮助练习新的编程语言。其中我经常写的是一个叫做“猜数字”的小游戏,计算机选出 1 到 100 里的任一数字,然后我来猜。程序循环进行,直到猜出正确数字。通过伪代码可以看出,这是个非常简单的程序:
+
+* 计算机在 1 到 100 之间选出一个随机数字
+* 循环进行直到猜出该随机数字
+ + 计算机读取我的猜测
+ + 告诉我我的猜测过高还是过低
+
+我们发表了一些文章,用不同的语言写这个程序。这是一个比较不同语言做同样事情的有趣机会。大多数编程语言具有相似性,所以当你在学习下一种新的编程语言时,主要是学习它的独特之处。
+
+C 语言由 Dennis Ritchie 于 1972 年在贝尔实验室创建,是一种早期的通用编程语言。C 语言非常受欢迎,并迅速成为 Unix 系统上的标准编程语言。正是因为它的流行,许多其他编程语言也采用了类似的编程语法。这就是为什么如果你已经知道如何使用 C 语言编程,学习 C++、Rust、Java、Groovy、JavaScript、awk 或 Lua 会更容易。
+
+接下来我们看看这些不同的编程语言是如何实现 “猜数字” 游戏的主要步骤。我将把重点放在基本元素的相似或不同,跳过一些外围代码,如分配临时变量。
+
+### 计算机在 1 到 100 之间选出一个随机数字
+
+你可以看到这里有许多相似之处。大多数编程语言使用类似 `rand()` 的函数,你可以设定一个范围来生成随机数。而其他一些语言使用一个特殊的函数来设定范围生成随机数。
+
+C:
+
+```
+// Using the Linux `getrandom` system call
+getrandom(&randval, sizeof(int), GRND_NONBLOCK);
+number = randval % maxval + 1;
+
+// Using the standard C library
+number = rand() % 100 + 1;
+```
+
+C++:
+
+```
+int number = rand() % 100+1;
+```
+
+Rust:
+
+```
+let random = rng.gen_range(1..101);
+```
+
+Java:
+
+```
+private static final int NUMBER = r.nextInt(100) + 1;
+```
+
+Groovy:
+
+```
+int randomNumber = (new Random()).nextInt(100) + 1
+```
+
+JavaScript:
+
+```
+const randomNumber = Math.floor(Math.random() * 100) + 1
+```
+
+awk:
+
+```
+randomNumber = int(rand() * 100) + 1
+```
+
+Lua:
+
+```
+number = math.random(1,100)
+```
+
+### 循环进行直到我猜出该随机数字
+
+循环通常是用控制流程来实现的,如 `while` 或 `do-while`。JavaScript 中的实现没有使用循环,而是 “实时 ”更新 HTML 页面,直到用户猜出正确的数字。Awk 虽然支持循环,但是通过循环读取输入信息是没有意义的,因为 Awk 是基于数据管道的,所以它从文件而不是直接从用户读取输入信息。
+
+C:
+
+```
+do {
+ …
+} while (guess != number);
+```
+
+C++:
+
+```
+do {
+ …
+} while ( number != guess );
+```
+
+Rust:
+
+```
+for line in std::io::stdin().lock().lines() {
+ …
+ break;
+}
+```
+
+Java:
+
+```
+while ( guess != NUMBER ) {
+ …
+}
+```
+
+Groovy:
+
+```
+while ( … ) {
+ …
+ break;
+}
+```
+
+Lua:
+
+```
+while ( player.guess ~= number ) do
+ …
+end
+```
+
+### 计算机读取我的猜测
+
+不同编程语言对输入的处理方式不同。例如,JavaScript 直接从 HTML 表单中读取数值,而 Awk 则从数据管道中读取数据。
+
+C:
+
+```
+scanf("%d", &guess);
+```
+
+C++:
+
+```
+cin >> guess;
+```
+
+Rust:
+
+```
+let parsed = line.ok().as_deref().map(str::parse::);
+if let Some(Ok(guess)) = parsed {
+ …
+}
+```
+
+Java:
+
+```
+guess = player.nextInt();
+```
+
+Groovy:
+
+```
+response = reader.readLine()
+int guess = response as Integer
+```
+
+JavaScript:
+
+```
+let myGuess = guess.value
+```
+
+Awk:
+
+```
+guess = int($0)
+```
+
+Lua:
+
+```
+player.answer = io.read()
+player.guess = tonumber(player.answer)
+```
+
+### 告诉我猜测过高还是过低
+
+在这些类 C 语言中,通常是通过 `if` 语句进行比较的。每种编程语言打印输出的方式有一些变化,但打印语句在每个样本中都是可识别的。
+
+C:
+
+```
+if (guess < number) {
+ puts("Too low");
+}
+else if (guess > number) {
+ puts("Too high");
+}
+…
+puts("That's right!");
+```
+
+C++:
+
+```
+if ( guess > number) { cout << "Too high.\n" << endl; }
+else if ( guess < number ) { cout << "Too low.\n" << endl; }
+else {
+ cout << "That's right!\n" << endl;
+ exit(0);
+}
+```
+
+Rust:
+
+```
+_ if guess < random => println!("Too low"),
+_ if guess > random => println!("Too high"),
+_ => {
+ println!("That's right");
+ break;
+}
+```
+
+Java:
+
+```
+if ( guess > NUMBER ) {
+ System.out.println("Too high");
+} else if ( guess < NUMBER ) {
+ System.out.println("Too low");
+} else {
+ System.out.println("That's right!");
+ System.exit(0);
+}
+```
+
+Groovy:
+
+```
+if (guess < randomNumber)
+ print 'too low, try again: '
+else if (guess > randomNumber)
+ print 'too high, try again: '
+else {
+ println "that's right"
+ break
+}
+```
+
+JavaScript:
+
+```
+if (myGuess === randomNumber) {
+ feedback.textContent = "You got it right!"
+} else if (myGuess > randomNumber) {
+ feedback.textContent = "Your guess was " + myGuess + ". That's too high. Try Again!"
+} else if (myGuess < randomNumber) {
+ feedback.textContent = "Your guess was " + myGuess + ". That's too low. Try Again!"
+}
+```
+
+Awk:
+
+```
+if (guess < randomNumber) {
+ printf "too low, try again:"
+} else if (guess > randomNumber) {
+ printf "too high, try again:"
+} else {
+ printf "that's right\n"
+ exit
+}
+```
+
+Lua:
+
+```
+if ( player.guess > number ) then
+ print("Too high")
+elseif ( player.guess < number) then
+ print("Too low")
+else
+ print("That's right!")
+ os.exit()
+end
+```
+
+### 非类 C 编程语言会怎么样呢?
+
+非类 C 编程语言会有很大的不同,需要学习特定的语法来完成每一步。Racket 源于 Lisp 和 Scheme,所以它使用 Lisp 的前缀符和大量括号。Python 使用空格而不是括号来表示循环之类的块。Elixir 是一种函数式编程语言,有自己的语法。Bash 是基于 Unix 系统中的 Bourne shell,它本身借鉴了 Algol68,并支持额外的速记符,如 `&&` 作为 `and` 的变体。Fortran 是在使用打孔卡片输入代码的时期创建的,所以它依赖于一些重要列的 80 列布局。
+
+我将通过比较 `if` 语句,举例表现这些编程语言的不同。`if` 判断一个值是否小于或大于另一个值,并向用户打印适当信息。
+
+Racket:
+
+```
+(cond [(> number guess) (displayln "Too low") (inquire-user number)]
+ [(< number guess) (displayln "Too high") (inquire-user number)]
+ [else (displayln "Correct!")]))
+```
+
+Python:
+
+```
+if guess < random:
+ print("Too low")
+elif guess > random:
+ print("Too high")
+else:
+ print("That's right!")
+```
+
+Elixir:
+
+```
+cond do
+ guess < num ->
+ IO.puts "Too low!"
+ guess_loop(num)
+ guess > num ->
+ IO.puts "Too high!"
+ guess_loop(num)
+ true ->
+ IO.puts "That's right!"
+end
+```
+
+Bash:
+
+```
+[ "0$guess" -lt $number ] && echo "Too low"
+[ "0$guess" -gt $number ] && echo "Too high"
+```
+
+Fortran:
+
+```
+IF (GUESS.LT.NUMBER) THEN
+ PRINT *, 'TOO LOW'
+ELSE IF (GUESS.GT.NUMBER) THEN
+ PRINT *, 'TOO HIGH'
+ENDIF
+```
+
+### 更多
+
+当你在学习一种新的编程语言时 “猜数字” 游戏是一个很友好的入门程序,通过一种简单的方式练习了几个常见的编程概念。通过不同编程语言实现这个简单游戏,你可以理解一些核心概念和每种语言的细节。
+
+学习如何用 C 和类 C 语言编写 “猜数字” 游戏:
+
+* [C][2], Jim Hall
+* [C++][3], Seth Kenlon
+* [Rust][4], Moshe Zadka
+* [Java][5], Seth Kenlon
+* [Groovy][6], Chris Hermansen
+* [JavaScript][7], Mandy Kendall
+* [awk][8], Chris Hermansen
+* [Lua][9], Seth Kenlon
+
+其他语言:
+
+* [Racket][10], Cristiano L. Fontana
+* [Python][11], Moshe Zadka
+* [Elixir][12], Moshe Zadka
+* [Bash][13], Jim Hall
+* [Fortran][14], Jim Hall
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/4/compare-programming-languages
+
+作者:[Jim Hall][a]
+选题:[lujun9972][b]
+译者:[VeryZZJ](https://github.com/VeryZZJ)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [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/code_development_programming.png?itok=M_QDcgz5 "Developing code."
+[2]: https://opensource.com/article/21/1/learn-c
+[3]: https://opensource.com/article/20/12/learn-c-game
+[4]: https://opensource.com/article/20/12/learn-rust
+[5]: https://opensource.com/article/20/12/learn-java
+[6]: https://opensource.com/article/20/12/groovy
+[7]: https://opensource.com/article/21/1/learn-javascript
+[8]: https://opensource.com/article/21/1/learn-awk
+[9]: https://opensource.com/article/20/12/lua-guess-number-game
+[10]: https://opensource.com/article/21/1/racket-guess-number
+[11]: https://opensource.com/article/20/12/learn-python
+[12]: https://opensource.com/article/20/12/elixir
+[13]: https://opensource.com/article/20/12/learn-bash
+[14]: https://opensource.com/article/21/1/fortran
diff --git a/published/202206/20210503 Learn the Lisp programming language in 2021.md b/published/202206/20210503 Learn the Lisp programming language in 2021.md
new file mode 100644
index 0000000000..fc5b4e6588
--- /dev/null
+++ b/published/202206/20210503 Learn the Lisp programming language in 2021.md
@@ -0,0 +1,295 @@
+[#]: subject: "Learn the Lisp programming language in 2021"
+[#]: via: "https://opensource.com/article/21/5/learn-lisp"
+[#]: author: "Seth Kenlon https://opensource.com/users/seth"
+[#]: collector: "lkxed"
+[#]: translator: "lkxed"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14751-1.html"
+
+一起来学习 Lisp 编程语言吧!
+======
+
+
+
+> 许多大型代码库中都有 Lisp 代码的身影,因此,熟悉一下这门语言是一个明智之举。
+
+早在 1958 年,Lisp 就被发明出来了,它是世界上第二古老的计算机编程语言(LCTT 译注:最古老的编程语言是 Fortran,诞生于 1957 年)。它有许多现代的衍生品,包括 Common Lisp、Emacs Lisp(Elisp)、Clojure、Racket、Scheme、Fennel 和 GNU Guile 等。
+
+那些喜欢思考编程语言的设计的人,往往都喜欢 Lisp,因为它的语法和数据有着相同的结构:Lisp 代码实际上是一个列表的列表,它的名字其实是 “列表处理” 的简写。而那些喜欢思考编程语言的美学的人,往往都讨厌 Lisp,因为它经常使用括号来定义范围;事实上,编程界也有一个广为流传的笑话:Lisp 代表的其实是 “大量烦人的多余括号”。
+
+不管你是喜欢还是讨厌 Lisp 的设计哲学,你都不得不承认,它都是一门有趣的语言,过去如此,现在亦然(这得归功于现代方言 Clojure 和 Guile)。你可能会惊讶于在任何特定行业的大代码库中潜伏着多少 Lisp 代码,因此,现在开始学习 Lisp,至少熟悉一下它,不失为一个好主意。
+
+### 安装 Lisp
+
+Lisp 有很多不同的实现。比较流行的开源版本有 [SBCL][2]、[GNU Lisp][3] 和 [GNU Common Lisp][4](GCL)。你可以使用发行版的包管理器安装它们中的任意一个,在本文中,我是用的是 `clisp`(LCTT 译注:也就是 GNU Lisp,一种 ANSI Common Lisp 的实现)。
+
+以下是在不同的 Linux 发行版中安装 `clisp` 的步骤。
+
+在 Fedora Linux 上,使用 `dnf`:
+
+```
+$ sudo dnf install clisp
+```
+
+在 Debian 上,使用 `apt`:
+
+```
+$ sudo apt install clisp
+```
+
+在 macOS 上,使用 [MacPorts][5] 或者 [Homebrew][6]:
+
+```
+# 使用 MacPorts
+$ sudo port install clisp
+
+# 使用 Homebrew
+$ brew install clisp
+```
+
+在 Windows 上,你可以使用 [clisp on Cygwin][7] 或者从 [gnu.org/software/gcl][8] 上下载 GCL 的二进制文件。
+
+虽然我使用 `clisp` 命令来运行 Lisp 代码,但是本文中涉及到的大多数语法规则,对任何 Lisp 实现都是适用的。如果你选择使用一个不同的 Lisp 实现,除了用来运行 Lisp 代码的命令会和我不一样外(比如,你可能要用 `gcl` 或 `sbcl` 而不是 `clisp`),其它的所有东西都是相同的。
+
+### 列表处理
+
+Lisp 源代码的基本单元是 “表达式”,它在形式上是一个列表。举个例子,下面就是一个列表,它由一个操作符(`+`)和两个整数(`1` 和 `2`)组成:
+
+```
+(+ 1 2)
+```
+
+同时,它也是一个 Lisp 表达式,内容是一个符号(`+`,会被解析成一个加法函数)和它的两个参数(`1` 和 `2`)。你可以在 Common Lisp 的交互式环境(即 REPL)中运行该表达式和其它表达式。如果你熟悉 Python 的 IDLE,那么你应该会对 Lisp 的 REPL 感到亲切。(LCTT 译注:REPL 的全称是 “Read-Eval-Print Loop”,意思是 “‘读取-求值-输出’循环”,这个名字很好地描述了它的工作过程。)
+
+要进入到 REPL 中,只需运行 Common Lisp 即可:
+
+```
+$ clisp
+[1]>
+```
+
+在 REPL 提示符中,尝试输入一些表达式:
+
+```
+[1]> (+ 1 2)
+3
+[2]> (- 1 2)
+-1
+[3]> (- 2 1)
+1
+[4]> (+ 2 3 4)
+9
+```
+
+### 函数
+
+在了解了 Lisp 表达式的基本结构后,你可以使用函数来做更多有用的事。譬如,`print` 函数可以接受任意数量的参数,然后把它们都显示在你的终端上,`pprint` 函数还可以实现格式化打印。还有更多不同的打印函数,不过,`pprint` 在 REPL 中的效果就挺好的:
+
+```
+[1]> (pprint "hello world")
+
+"hello world"
+
+[2]>
+```
+
+你可以使用 `defun` 函数来创建一个自定义函数。`defun` 函数需要你提供自定义函数的名称,以及它接受的参数列表:
+
+```
+[1]> (defun myprinter (s) (pprint s))
+MYPRINTER
+[2]> (myprinter "hello world")
+
+"hello world"
+
+[3]>
+```
+
+### 变量
+
+你可以使用 `setf` 函数来在 Lisp 中创建变量:
+
+```
+[1]> (setf foo "hello world")
+"hello world"
+[2]> (pprint foo)
+
+"hello world"
+
+[3]>
+```
+
+你可以在表达式里嵌套表达式(就像使用某种管道一样)。举个例子,你可以先使用 `string-upcase` 函数,把某个字符串的所有字符转换成大写,然后再使用 `pprint` 函数,将它的内容格式化打印到终端上:
+
+```
+[3]> (pprint (string-upcase foo))
+
+"HELLO WORLD"
+
+[4]>
+```
+
+Lisp 是动态类型语言,这意味着,你在给变量赋值时不需要声明它的类型。Lisp 默认会把整数当作整数来处理:
+
+```
+[1]> (setf foo 2)
+[2]> (setf bar 3)
+[3]> (+ foo bar)
+5
+```
+
+如果你想让整数被当作字符串来处理,你可以给它加上引号:
+
+```
+[4]> (setf foo "2")
+"2"
+[5]> (setf bar "3")
+"3"
+[6]> (+ foo bar)
+
+*** - +: "2" is not a number
+The following restarts are available:
+USE-VALUE :R1 Input a value to be used instead.
+ABORT :R2 Abort main loop
+Break 1 [7]>
+```
+
+在这个示例 REPL 会话中,变量 `foo` 和 `bar` 都被赋值为加了引号的数字,因此,Lisp 会把它们当作字符串来处理。数学运算符不能够用在字符串上,因此 REPL 进入了调试器模式。想要跳出这个调试器,你需要按下 `Ctrl+D` 才行(LCTT 译注:就 `clisp` 而言,使用 `quit` 关键字也可以退出)。
+
+你可以使用 `typep` 函数对一些对象进行类型检查,它可以测试对象是否为某个特定数据类型。返回值 `T` 和 `NIL` 分别代表 `True` 和 `False`。
+
+```
+[4]> (typep foo 'string)
+NIL
+[5]> (typep foo 'integer)
+T
+```
+
+`string` 和 `integer` 前面加上了一个单引号(`'`),这是为了防止 Lisp(错误地)把这两个单词当作是变量来求值:
+
+```
+[6]> (typep foo string)
+*** - SYSTEM::READ-EVAL-PRINT: variable STRING has no value
+[...]
+```
+
+这是一种保护某些术语(LCTT 译注:类似于字符串转义)的简便方法,正常情况下它是用 `quote` 函数来实现的:
+
+```
+[7]> (typep foo (quote string))
+NIL
+[5]> (typep foo (quote integer))
+T
+```
+
+### 列表
+
+不出人意料,你当然也可以在 Lisp 中创建列表:
+
+```
+[1]> (setf foo (list "hello" "world"))
+("hello" "world")
+```
+
+你可以使用 `nth` 函数来索引列表:
+
+```
+[2]> (nth 0 foo)
+"hello"
+[3]> (pprint (string-capitalize (nth 1 foo)))
+
+"World"
+```
+
+### 退出 REPL
+
+要结束一个 REPL 会话,你需要按下键盘上的 `Ctrl+D`,或者是使用 Lisp 的 `quit` 关键字:
+
+```
+[99]> (quit)
+$
+```
+
+### 编写脚本
+
+Lisp 可以被编译,也可以作为解释型的脚本语言来使用。在你刚开始学习的时候,后者很可能是最容易的方式,特别是当你已经熟悉 Python 或 [Shell 脚本][9] 时。
+
+下面是一个用 Common Lisp 编写的简单的“掷骰子”脚本:
+
+```
+#!/usr/bin/clisp
+
+(defun roller (num)
+ (pprint (random (parse-integer (nth 0 num))))
+)
+
+(setf userput *args*)
+(setf *random-state* (make-random-state t))
+(roller userput)
+```
+
+脚本的第一行注释(LCTT 译注:称之为“释伴”)告诉了你的 POSIX 终端,该使用什么可执行文件来运行这个脚本。
+
+`roller` 函数使用 `defun` 函数创建,它在内部使用 `random` 函数来打印一个伪随机数,这个伪随机数严格小于 `num` 列表中下标为 0 的元素。在脚本中,这个 `num` 列表还没有被创建,不过没关系,因为只有当脚本被调用时,函数才会执行。
+
+接下来的那一行,我们把运行脚本时提供的任意参数,都赋值给一个叫做 `userput` 的变量。这个 `userput` 变量是一个列表,当它被传递给 `roller` 函数后,它就会变成参数 `num`。
+
+脚本的倒数第二行产生了一个“随机种子”。这为 Lisp 提供了足够的随机性来生成一个几乎随机的数字。
+
+最后一行调用了自定义的 `roller` 函数,并将 `userput` 列表作为唯一的参数传递给它。
+
+将这个文件保存为 `dice.lisp`,并赋予它可执行权限:
+
+```
+$ chmod +x dice.lisp
+```
+
+最后,运行它,并给它提供一个数字,以作为它选择随机数的最大值:
+
+```
+$ ./dice.lisp 21
+
+13
+$ ./dice.lisp 21
+
+7
+$ ./dice.lisp 21
+
+20
+```
+
+看起来还不错!
+
+你或许注意到,你的模拟骰子有可能会是 0,并且永远达不到你提供给它的最大值参数。换句话说,对于一个 20 面的骰子,这个脚本永远投不出 20(除非你把 0 当作 20)。有一个简单的解决办法,它只需要用到在本文中介绍的知识,你能够想到吗?
+
+### 学习 Lisp
+
+无论你是想将 Lisp 作为个人脚本的实用语言,还是为了助力你的职业生涯,抑或是仅仅作为一个有趣的实验,你都可以去看看一年一度(LCTT 译注:应该是两年一度)的 [Lisp 游戏果酱][11],从而收获一些特别有创意的用途(其中的大多数提交都是开源的,因此你可以查看代码以从中学习)。
+
+Lisp 是一门有趣而独特的语言,它有着不断增长的开发者用户群、足够悠久的历史和新兴的方言,因此,它有能力让从事各个行业的程序员都满意。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/5/learn-lisp
+
+作者:[Seth Kenlon][a]
+选题:[lkxed][b]
+译者:[lkxed](https://github.com/lkxed)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/seth
+[b]: https://github.com/lkxed
+[1]: https://opensource.com/sites/default/files/lead-images/OSDC_women_computing_4.png
+[2]: http://sbcl.org
+[3]: http://clisp.org
+[4]: https://www.gnu.org/software/gcl/
+[5]: https://opensource.com/article/20/11/macports
+[6]: https://opensource.com/article/20/6/homebrew-linux
+[7]: https://cygwin.fandom.com/wiki/Clisp
+[8]: http://mirror.lagoon.nc/gnu/gcl/binaries/stable
+[9]: https://opensource.com/article/20/4/bash-programming-guide
+[10]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains
+[11]: https://itch.io/jam/spring-lisp-game-jam-2021
diff --git a/published/202206/20210531 Get started with Kubernetes using chaos engineering.md b/published/202206/20210531 Get started with Kubernetes using chaos engineering.md
new file mode 100644
index 0000000000..2aaaaa83a7
--- /dev/null
+++ b/published/202206/20210531 Get started with Kubernetes using chaos engineering.md
@@ -0,0 +1,72 @@
+[#]: subject: (Get started with Kubernetes using chaos engineering)
+[#]: via: (https://opensource.com/article/21/5/kubernetes-chaos)
+[#]: author: (Jessica Cherry https://opensource.com/users/cherrybomb)
+[#]: collector: (lujun9972)
+[#]: translator: (Donkey-Hao)
+[#]: reviewer: (turbokernel, wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-14743-1.html)
+
+在 Kubernetes 中使用混沌工程
+======
+
+> 在这篇文章中学习混沌工程的基础知识。
+
+
+
+混沌工程是由科学、规划以及实验组成的。它是一门在系统上进行实验的学科,用来建立系统在生产中承受混乱条件能力的信心。
+
+首先,我会在文章导论部分解释混沌系统如何工作。
+
+### 如何开始学习混沌系统呢?
+
+以我的经验,开始学习混沌系统的最好方式是触发一个此前生产中出现的事故来进行实验。使用过去的数据,制定一个计划,以相同的方式破坏你的系统,然后建立修复策略,并确认结果满足你预期。如果计划失败,你就有了一种新的实验方式,并朝着快速处理问题的新方式前进。
+
+最重要的是,你可以随时记录所有内容,这意味着,随着时间的推移,整个系统将被完整记录下来,任何人都可以值守而无需太多加码,每个人都可以在周末好好休息。
+
+### 你要在混沌工程中做什么?
+
+混沌系统实验运行背后有一些科学依据。我记录了其中一些步骤:
+
+1. **定义一个稳定状态:** 使用监控工具来搜集当系统没有问题或事故时,看起来功能正常的数据。
+2. **提出假设或使用先前的事故:** 现在你已经定义了一个稳定状态,请提出一个关于在事故或中断期间会发生(或发生过)的情况的假设。用这个假设来得出一系列将会发生的事故,以及如何解决问题的理论。然后你可以制定一个故意引发该问题的计划。
+3. **引发问题:** 用这个计划来破坏系统,并开始在真实环境中测试。收集破坏时的指标状态,按计划修复,并追踪提出解决方案所需时长。确保你把所有的东西都记录下来,以备将来发生故障时使用。
+4. **试图推翻你的假设:** 实验中最精彩的部分是尝试推翻你的思考或计划。你要创建一个不同的状态,看看你能走多远,并在系统中生成一个不同的稳定状态。
+
+确保在你在另一个系统中生成的破坏因素前,建立一个处于稳定状态的控制系统。这将使你更容易在实验前、期间和之后发现各种稳定状态的差异。
+
+### 混沌工程需要什么?
+
+这有一些初学混沌工程很好的工具:
+
+* 良好的文档编制方法
+* 一个捕捉你系统是否处于稳定状态的监控系统
+ * Grafana
+ * Prometheus
+* 混沌工程工具:
+ * Chaos mesh
+ * Litmus
+ * 之后的文章我会介绍更多
+* 一个假设
+* 一个计划
+
+### 去搞破坏吧
+
+现在你已经掌握了基础,是时候去安全的摧毁你的系统了。我计划每年制造四次混乱,然后努力实现每月一次的破坏。
+
+混沌工程是一种很好的实践,也是推进你的内部文档保持最新的好方法。此外,随着时间的推移,新升级或应用程序部署将更加顺畅,你的日常生活管理将通过 Kubernetes 变得更加轻松。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/5/kubernetes-chaos
+
+作者:[Jessica Cherry][a]
+选题:[lujun9972][b]
+译者:[Donkey](https://github.com/Donkey-Hao)
+校对:[turbokernel](https://github.com/turbokernel), [wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/cherrybomb
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/brett-jordan-chaos-unsplash.jpg?itok=sApp5dVd (Scrabble letters spell out chaos for chaos engineering)
diff --git a/published/202206/20210630 9 reasons I love to use the Qt Creator IDE.md b/published/202206/20210630 9 reasons I love to use the Qt Creator IDE.md
new file mode 100644
index 0000000000..87e3231afc
--- /dev/null
+++ b/published/202206/20210630 9 reasons I love to use the Qt Creator IDE.md
@@ -0,0 +1,186 @@
+[#]: subject: (9 reasons I love to use the Qt Creator IDE)
+[#]: via: (https://opensource.com/article/21/6/qtcreator)
+[#]: author: (Stephan Avenwedde https://opensource.com/users/hansic99)
+[#]: collector: (lujun9972)
+[#]: translator: (hadisi1993)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-14767-1.html)
+
+我爱用 Qt Creator IDE 的九个原因
+======
+
+> Qt Creator 就是丰富的 Qt 库和程序员之间的粘合剂。
+
+
+
+Qt Creator 是 Qt 框架的默认集成开发环境(IDE),同时也是丰富的 Qt 库和用户之前的粘合剂。除了如智能代码补全、调试、项目管理等基础功能外,Qt Creator 还提供了很多让软件开发变得更简单的特性。
+
+在这篇文章中,我会重点介绍一些我最喜欢的 [Qt Creator][2] 特性。
+
+### 深色模式
+
+当我使用一个新的应用时,我的第一个问题是:_它有深色模式吗?_ Qt Creator 的回答是:_你更喜欢哪一种深色模式呢?_
+
+你可以在“选项”菜单中激活深色模式。在顶部的菜单栏中,点击“工具”,选择“选项”,然后转到“环境”部分。下面是你能选择的常用外观:
+
+![QT Creator 深色模式][3]
+
+### 定制外观
+
+像每一个 Qt 应用一样,借助样式表,Qt Creator 的外观是高度可定制化的。下面,你可以按照我的做法给 Qt Creator一个想要的外观。
+
+将下面这些内容写入 `mycustomstylesheet.css` 文件中:
+
+```
+QMenuBar { background-color: olive }
+QMenuBar::item { background-color: olive }
+QMenu { background-color : beige; color : black }
+QLabel { color: green }
+```
+
+然后使用命令行开启 Qt Creator,将样式表作为参数传入:
+
+```
+qtcreator -stylesheet=mycustomstylesheet.css
+```
+
+IDE 现在看上去应该会变成这样:
+
+![QT Creator 定制样式表][5]
+
+在这份 [文档][6] 中可以查阅更多的样式表。
+
+### 命令行参数
+
+Qt Creator 可接受很多命令行选项。例如,如果想在启动时自动加载当前项目,那么你可以将它的路径传入:
+
+```
+qtcreator ~/MyProject/MyQtProject.pro
+```
+
+你甚至可以将默认应该打开的文件和行数作为参数传递。下面这个命令打开 `main.cpp` 20 行处:
+
+```
+qtcreator ~/MyProject/main.cpp:20
+```
+
+在这份 [文档][7] 中可以查阅更多 Qt 特有的命令行选项。
+
+
+Qt Creator 和一般的 Qt 应用无二,所以,除了自己的命令行参数以外,它也接收 [QApplication][8] 和 [QGuiApplication][9] 的一般参数。
+
+### 交叉编译
+
+Qt Creator 允许你定义一些被称为“配套”的工具链。 “配套” 定义了构建和运行应用所需要的二进制库和 SDK。
+
+![QT Creator kits][10]
+
+这使得你通过两次点击,就在完全不同的工具链之间切换。
+
+![在 Qt Creator 中切换配套][11]
+
+在这份 [手册][12] 中可以查阅更多关于配套的内容。
+
+### 分析工具
+
+Qt Creator 集成了一些最流行的性能分析工具,例如:
+
+ * [Linux 性能分析器][13](需要特定的内核)
+ * [Valgrind][14] 内存分析器
+ * [Clang-Tidy 和 Clazy][15],一种检查 C/C++ 的 静态分析器
+
+![Qt Creator 分析工具][16]
+
+### 调试器
+
+在调试方面,Qt Creator 为 GNU Debugger(GDB)配备了一个很好的界面。我喜欢它检查容器类型和创建条件断点的方式,很简单。
+
+![Qt Creator 调试器][17]
+
+### FakeVim
+
+如果你喜欢 Vim,你可以在设置中开启 FakeVim,来像 Vim 一样控制 Qt Creator。点击“工具”,选择“选项”。在 “FakeVim” 选项中,你可以找到许多开关来定制 FakeVim。除了编辑器的功能外,你可以将自己设置的功能和命令关联起来,定制 Vim 命令。
+
+举个例子,你可以将“构建项目”的功能和 `build` 命令关联到一起:
+
+![Qt Creator中的FakeVim][18]
+
+回到编辑器中,当你按下冒号(`:`)并输入 `build`,Qt Creator 利用配置的工具链,开始进行构建:
+
+![Qt Creator中的FakeVim][19]
+
+你可以在这份 [文档][20] 中找到 FakeVim 的更多信息。
+
+### 类检测器
+
+当使用 C++ 开发时,点击 Qt Creator 右下角的按钮可打开右边的窗口。然后在窗口顶部拉下的菜单中选择“大纲”。如果你在左侧窗体中有头文件打开,你可以很好地纵览定义的类和类型。如果你切换到源文件中(`*.cpp`),右侧窗体会列出所有定义的方法,双击其中一个,你可以跳转到这个方法:
+
+![Qt Creator 中的类列表][21]
+
+### 项目配置
+
+Qt Creator 的项目建立在项目目录里的 `*.pro-file` 之上。你可以为你的项目在 `*.pro-file` 中添加定制的配置。我向 `*.pro-file` 中添加了 `my_special_config`,它向编译器的定义添加 `MY_SPECIAL_CONFIG`。
+
+```
+QT -= gui
+
+CONFIG += c++11 console
+CONFIG -= app_bundle
+
+CONFIG += my_special_config
+
+my_special_config {
+DEFINES += MY_SPECIAL_CONFIG
+}
+```
+
+Qt Creator 自动根据当前配置设置代码高亮:
+
+![Qt Creator 的特殊配置][22]
+
+`*.pro-file` 使用 [qmake 语言][23] 进行编写。
+
+### 总结
+
+这些特性仅仅是 Qt Creators 所提供的特性的冰山一角。初学者们应该不会感到被其众多的功能所淹没,Qt Creator 是一款对初学者很友好的 IDE。它甚至可能是入门 C++ 开发最简单的方式。如果要获得 QT Creator 特性的全面概述,请参考它的 [官方文档][24]。
+
+*(插图来自 Stephan Avenwedde, [CC BY-SA 4.0][4])*
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/6/qtcreator
+
+作者:[Stephan Avenwedde][a]
+选题:[lujun9972][b]
+译者:[hadisi1993](https://github.com/hadisi1993)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [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/lenovo-thinkpad-laptop-concentration-focus-windows-office.png?itok=-8E2ihcF (Woman using laptop concentrating)
+[2]: https://www.qt.io/product/development-tools
+[3]: https://opensource.com/sites/default/files/uploads/qt_creator_dark_mode.png ( QT Creator dark mode)
+[4]: https://creativecommons.org/licenses/by-sa/4.0/
+[5]: https://opensource.com/sites/default/files/uploads/qt_creator_custom_stylesheet2.png (QT Creator custom stylesheet)
+[6]: https://doc.qt.io/qt-5/stylesheet-reference.html
+[7]: https://doc.qt.io/qtcreator/creator-cli.html
+[8]: https://doc.qt.io/qt-5/qapplication.html#QApplication
+[9]: https://doc.qt.io/qt-5/qguiapplication.html#supported-command-line-options
+[10]: https://opensource.com/sites/default/files/uploads/qt_creator_cross_compiling.png (QT Creator kits)
+[11]: https://opensource.com/sites/default/files/uploads/qt_creator_select_kits.png (Switching between Kits in Qt Creator)
+[12]: https://doc.qt.io/qtcreator/creator-targets.html
+[13]: https://doc.qt.io/qtcreator/creator-cpu-usage-analyzer.html
+[14]: https://doc.qt.io/qtcreator/creator-valgrind-overview.html
+[15]: https://doc.qt.io/qtcreator/creator-clang-tools.html
+[16]: https://opensource.com/sites/default/files/uploads/qt_creator_analyzer.png (Qt Creator analyzer)
+[17]: https://opensource.com/sites/default/files/uploads/qt_creator_debugger2.png (Qt Creator debugger)
+[18]: https://opensource.com/sites/default/files/uploads/qt_creator_fakevim_ex_commands.png (FakeVim in Qt Creator)
+[19]: https://opensource.com/sites/default/files/uploads/qt_creator_fakevim_build_commands.png (FakeVim in Qt Creator)
+[20]: https://doc.qt.io/qtcreator/creator-editor-fakevim.html
+[21]: https://opensource.com/sites/default/files/uploads/qtcreator_class_overview.png (List of classes in Qt Creator)
+[22]: https://opensource.com/sites/default/files/uploads/qtcreater_special_config.png (Special configuration in Qt Creator)
+[23]: https://doc.qt.io/qt-5/qmake-language.html
+[24]: https://doc.qt.io/qtcreator/
diff --git a/published/202206/20210722 Write your first JavaScript code.md b/published/202206/20210722 Write your first JavaScript code.md
new file mode 100644
index 0000000000..1cbb8f9f06
--- /dev/null
+++ b/published/202206/20210722 Write your first JavaScript code.md
@@ -0,0 +1,186 @@
+[#]: subject: "Write your first JavaScript code"
+[#]: via: "https://opensource.com/article/21/7/javascript-cheat-sheet"
+[#]: author: "Seth Kenlon https://opensource.com/users/seth"
+[#]: collector: "lkxed"
+[#]: translator: "lkxed"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14740-1.html"
+
+编写你的第一段 JavaScript 代码
+======
+
+> JavaScript 是为 Web 而生的,但它可以做的事远不止于此。本文将带领你了解它的基础知识,然后你可以下载我们的备忘清单,以便随时掌握详细信息。
+
+
+
+JavaScript 是一种充满惊喜的编程语言。许多人第一次遇到 JavaScript 时,它通常是作为一种 Web 语言出现的。所有主流浏览器都有一个 JavaScript 引擎;并且,还有一些流行的框架,如 JQuery、Cash 和 Bootstrap 等,它们可以帮助简化网页设计;甚至还有用 JavaScript 编写的编程环境。它似乎在互联网上无处不在,但事实证明,它对于 [Electron][2] 等项目来说也是一种有用的语言。Electron 是一个构建跨平台桌面应用程序的开源工具包,它使用的语言就是 JavaScript。
+
+JavaScript 语言的用途多到令人惊讶,它拥有各种各样的库,而不仅仅是用于制作网站。它的基础知识十分容易掌握,因此,它可以作为一个起点,助你跨出构建你想象中的东西的第一步。
+
+### 安装 JavaScript
+
+随着你的 JavaScript 水平不断提高,你可能会发现自己需要高级的 JavaScript 库和运行时环境。不过,刚开始学习的时候,你是根本不需要安装 JavaScript 环境的。因为所有主流的 Web 浏览器都包含一个 JavaScript 引擎来运行代码。你可以使用自己喜欢的文本编辑器编写 JavaScript,将其加载到 Web 浏览器中,接着你就能看到代码的作用。
+
+### 上手 JavaScript
+
+要编写你的第一个 JavaScript 代码,请打开你喜欢的文本编辑器,例如 [Atom][4] 或 [VSCode][5] 等。因为它是为 Web 开发的,所以 JavaScript 可以很好地与 HTML 配合使用。因此,我们先来尝试一些基本的 HTML:
+
+```
+
+
+ JS
+
+
+ Nothing here.
+
+
+```
+
+保存这个文件,然后在 Web 浏览器中打开它。
+
+![浏览器中显示的 HTML][6]
+
+要将 JavaScript 添加到这个简单的 HTML 页面,你可以创建一个 JavaScript 文件并在页面的 `` 中引用它,或者只需使用 `
+
+
+