diff --git a/translated/tech/20200303 Watching activity on Linux with watch and tail commands.md b/published/20200303 Watching activity on Linux with watch and tail commands.md
similarity index 55%
rename from translated/tech/20200303 Watching activity on Linux with watch and tail commands.md
rename to published/20200303 Watching activity on Linux with watch and tail commands.md
index c576ac80e9..bb8dd7b0d7 100644
--- a/translated/tech/20200303 Watching activity on Linux with watch and tail commands.md
+++ b/published/20200303 Watching activity on Linux with watch and tail commands.md
@@ -1,27 +1,32 @@
[#]: collector: (lujun9972)
[#]: translator: (Starryi)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-14557-1.html)
[#]: subject: (Watching activity on Linux with watch and tail commands)
[#]: via: (https://www.networkworld.com/article/3529891/watching-activity-on-linux-with-watch-and-tail-commands.html)
[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
使用 watch 和 tail 命令监视 Linux 上的活动
======
-watch 和 tail 命令可以帮助监视 Linux 系统上的活动。本文介绍了这两个命令的一些有用的使用方法。
-**watch** 和 **tail** 命令为持续监视 Linux 系统上的活动提供了一些有趣的选项。
+
-也就是说,你可以通过 **watch** 来显示谁已登录,并随着用户登陆和注销,更新显示内容,而不是仅仅提出问题并获得答案(例如询问 **who** 并获取当前登录用户的列表)。
+> watch 和 tail 命令可以帮助监视 Linux 系统上的活动。本文介绍了这两个命令的一些有用的使用方法。
-使用 **tail**,您可以显示文件的底部并在添加内容时查看内容。这种监控一般非常有用,并且比定期运行命令所需的工作更少。
+`watch` 和 `tail` 命令为持续监视 Linux 系统上的活动提供了一些有趣的选项。
+
+也就是说,你可以通过 `watch` 来显示谁已登录,并随着用户登录和注销不断更新,而不是仅仅提出问题并获得答案(例如询问 `who` 并获取当前登录用户的列表)。
+
+使用 `tail`,你可以显示文件的底部并在添加内容时查看内容。这种监控一般非常有用,并且比定期运行命令所需的工作更少。
### 使用 watch 命令
-使用 **watch** 的最简单示例之一是使用命令 **watch who**。你会看到一个列表,其中显示了谁登录了,以及他们登录的时间和登录位置。请注意,默认设置是每两秒更新一次显示(左上角),日期和时间(右上角)将按该间隔自行更新。用户列表将随着用户登录和注销而增长和缩小。
+使用 `watch` 的最简单示例之一是使用命令 `watch who`。你会看到一个列表,其中显示了谁登录了,以及他们登录的时间和登录位置。请注意,默认设置是每两秒更新一次显示(左上角),日期和时间(右上角)将按该间隔自行更新。用户列表将随着用户登录和注销而增长和缩小。
-### $ watch who
+```
+$ watch who
+```
此命令将显示如下所示的登录列表:
@@ -32,14 +37,14 @@ nemo pts/0 2020-02-27 08:07 (192.168.0.11)
shs pts/1 2020-02-27 10:58 (192.168.0.5)
```
-你可以通过添加 **-n** 选项(例如 -n 10)来修改更新间的不同秒数,以修改更新间隔,从而获取较少的更新频率。
+你可以通过添加 `-n` 选项(例如 `-n 10`)来修改更新间的不同秒数,以修改更新间隔,从而获取较少的更新频率。
-### $ watch -n 10 who
+```
+$ watch -n 10 who
+```
上述命令将以新的间隔显示,并且显示的时间更新频率较低,从而使显示时间与所选间隔保持一致。
-[][2]
-
```
Every 10.0s: who dragonfly: Thu Feb 27 11:05:47 2020
@@ -47,9 +52,11 @@ nemo pts/0 2020-02-27 08:07 (192.168.0.11)
shs pts/1 2020-02-27 10:58 (192.168.0.5)
```
-如果你希望仅查看命令的输出,而不是标题(前 2 行),则可以通过添加 **-t**(无标题)选项来省略这些行。
+如果你希望仅查看命令的输出,而不是标题(前 2 行),则可以通过添加 `-t`(无标题)选项来省略这些行。
-### $ watch -t who
+```
+$ watch -t who
+```
然后,你的屏幕将显示如下所示:
@@ -60,21 +67,21 @@ shs pts/1 2020-02-27 10:58 (192.168.0.5)
如果每次运行监视的命令时,输出都是相同的,则只有标题行(如果未省略)会更改。其余显示的信息将保持不变。
-如果你希望 **watch** 命令在它正在监视的命令的输出发生更新后立即退出,则可以使用 **-g**(将其视为“离开”)选项。例如,如果你只是在等待其他人开始登录系统,则可以选择执行此操作。
+如果你希望 `watch` 命令在它正在监视的命令的输出发生更新后立即退出,则可以使用 `-g`(将其视为“离开”)选项。例如,如果你只是在等待其他人开始登录系统,则可以选择执行此操作。
-你还可以使用 **-d**(差异)选项突出显示显示输出中的更改。突出显示只会持续一个间隔(默认为 2 秒),但有助于引起你对更新的注意。
+你还可以使用 `-d`(差异)选项突出显示显示输出中的更改。突出显示只会持续一个间隔(默认为 2 秒),但有助于引起你对更新的注意。
-下面是一个更复杂的示例,该示例使用 **watch** 命令显示正在侦听连接的服务及其使用的端口。虽然输出不太可能更改,但它会提醒你任何新服务正在启动或关闭。
+下面是一个更复杂的示例,该示例使用 `watch` 命令显示正在侦听连接的服务及其使用的端口。虽然输出不太可能更改,但它会提醒你任何新服务正在启动或关闭。
-```console
+```
$ watch 'sudo lsof -i -P -n | grep LISTEN'
```
-值得注意的是,正在运行的命令需要用引号扩起来,以确保 **watch** 命令不会将其输出发送到 grep 命令。
+值得注意的是,正在运行的命令需要用引号扩起来,以确保不会将 `watch` 命令的输出发送到 `grep` 命令。
-使用 **watch -h** 命令将为你提供命令选项的列表。
+使用 `watch -h` 命令将为你提供命令选项的列表。
-```console
+```
$ watch -h
Usage:
@@ -98,19 +105,19 @@ Options:
### 使用 tail -f
-**tail -f** 命令与 **watch** 有一些相同之处。它也会在添加文件时显示文件的底部和其他内容。你不必一次又一次地运行 “tail” 命令,而是运行一个命令并获得可重复更新显示视图的结果。例如,你可以使用如下命令查看系统日志:
+`tail -f` 命令与 `watch` 有一些相同之处。它也会在添加文件时显示文件的底部和其他内容。你不必一次又一次地运行 `tail` 命令,而是运行一个命令并获得可重复更新显示视图的结果。例如,你可以使用如下命令查看系统日志:
-```console
+```
$ tail -f /var/log/syslog
```
-某些文件(如 **/var/log/wtmp**)不适合这种类型的处理,因为它们的格式不是普通文本文件,但是通过组合 **watch** 和 **tail**,你可以获得类似的结果,如下所示:
+某些文件(如 `/var/log/wtmp`)不适合这种类型的处理,因为它们的格式不是普通文本文件,但是通过组合 `watch` 和 `tail`,你可以获得类似的结果,如下所示:
-```bash
+```
watch 'who /var/log/wtmp | tail -20'
```
-无论有多少用户仍处于登录状态, 此命令都将只显示最近的 5 次登录。如果发生其他登录,显示结果将添加一行记录并删除顶行记录。
+无论有多少用户仍处于登录状态,此命令都将只显示最近的 5 次登录。如果发生其他登录,显示结果将添加一行记录并删除顶行记录。
```
Every 60.0s: who /var/log/wtmp | tail -5 dragonfly: Thu Feb 27 12:46:07 2020
@@ -122,9 +129,7 @@ nemo pts/1 2020-02-27 11:34 (192.168.0.5)
dory pts/1 2020-02-27 12:14 (192.168.0.5)
```
-对你有时可能想要监视的信息,无论监视进程、登录名还是系统资源,**watch** 和 **tail -f** 命令都可以提供自动更新视图,从而使监视任务变得更加容易。
-
-加入 [Facebook][3] 和 [LinkedIn][4] 上的网络世界社区,对最重要的话题发表评论。
+对你有时可能想要监视的信息,无论监视进程、登录名还是系统资源,`watch` 和 `tail -f` 命令都可以提供自动更新视图,从而使监视任务变得更加容易。
--------------------------------------------------------------------------------
@@ -133,7 +138,7 @@ via: https://www.networkworld.com/article/3529891/watching-activity-on-linux-wit
作者:[Sandra Henry-Stocker][a]
选题:[lujun9972][b]
译者:[Starryi](https://github.com/Starryi)
-校对:[校对者ID](https://github.com/校对者ID)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/translated/tech/20210310 Troubleshoot WiFi problems with Go and a Raspberry Pi.md b/published/20210310 Troubleshoot WiFi problems with Go and a Raspberry Pi.md
similarity index 50%
rename from translated/tech/20210310 Troubleshoot WiFi problems with Go and a Raspberry Pi.md
rename to published/20210310 Troubleshoot WiFi problems with Go and a Raspberry Pi.md
index 5cd6f96c79..6a46d97f7f 100644
--- a/translated/tech/20210310 Troubleshoot WiFi problems with Go and a Raspberry Pi.md
+++ b/published/20210310 Troubleshoot WiFi problems with Go and a Raspberry Pi.md
@@ -3,34 +3,34 @@
[#]: author: "Chris Collins https://opensource.com/users/clcollins"
[#]: collector: "lkxed"
[#]: translator: "lkxed"
-[#]: reviewer: " "
-[#]: publisher: " "
-[#]: url: " "
+[#]: reviewer: "turbokernel"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14560-1.html"
-使用 Go 和树莓派来解决 WiFi 问题
+使用 Go 和树莓派排查 WiFi 问题
======
-实现一个 WiFi 扫描仪玩玩~
-![在在门廊上喝茶][1]
-(图源:opensource.com)
+> 实现一个 WiFi 扫描器玩玩~
-去年夏天,我和妻子卖掉了我们的全部财产,带着我们的两只狗搬到了夏威夷。这里有我们想象中的一切:美丽的阳光、温暖的沙滩、凉爽的冲浪 —— 你能想到的一切。我们也遇到了一些意料之外的事:WiFi 问题。
+
-不过,这不是夏威夷的问题,而是我们租住的公寓的问题。我们住在一个单身公寓里,与房东的公寓仅一墙之隔。我们的租房协议中包含了免费的网络连接!好耶!只不过,它是由房东的公寓里的 WiFi 提供的,哇哦……
+去年夏天,我和妻子变卖了家产,带着我们的两只狗移居了夏威夷。这里有美丽的阳光、温暖的沙滩、凉爽的冲浪等你能想到的一切。我们同样遇到了一些意料之外的事:WiFi 问题。
-说实话,它的效果还不错……吗?好吧,我承认它不尽如人意,我也不知道是哪里出了问题。明明路由器就在墙的另一边,但我们的信号就是很不稳定,经常会自动断开连接。在家的时候,我们的 WiFi 路由器的信号能够穿过层层墙壁和地板。事实上,它所覆盖的区域比我们居住的 600 平方英尺(大约 55 平方米)的公寓还要大。
+不过,这不是夏威夷的问题,而是我们租住公寓的问题。我们住在一个单身公寓里,与房东的公寓仅一墙之隔。我们的租房协议中包含了免费的网络连接!好耶!只不过,它是由房东的公寓里的 WiFi 提供的,哇哦……
-在这种情况下,一个优秀的技术人员会怎么做呢?既然想知道为什么,当然是开始调查咯!
+说实话,它的效果还不错……吧?好吧,我承认它不尽如人意,并且不知道是哪里的问题。路由器明明就在墙的另一边,但我们的信号就是很不稳定,经常会自动断开连接。在家的时候,我们的 WiFi 路由器的信号能够穿过层层墙壁和地板。事实上,它所覆盖的区域比我们居住的 600 平方英尺(大约 55 平方米)的公寓还要大。
-幸运的是,我们在搬家之前卖掉的“全部财产”并不包括树莓派 Zero W。它是如此小! 如此便携! 我当然就把它一起带来了。我有一个机智的想法:使用树莓派和它内置的 WiFi 适配器,用 Go 语言编写一个小程序来测量并显示从路由器收到的 WiFi 信号。我打算先简单快速地把它实现出来,以后再去考虑该如何优化。烦死了!我现在只想知道这个 WiFi 是怎么回事!
+在这种情况下,一个优秀的技术人员会怎么做呢?既然想知道为什么,当然是开始排查咯!
-谷歌搜索了一番后,我发现了一个相对有用的 Go 软件包 [mdlayher/wifi][2],它专门用于 WiFi 相关操作,听起来很有希望!
+幸运的是,我们在搬家之前并没有变卖掉树莓派 Zero W。它是如此小巧便携! 我当然就把它一起带来了。我有一个机智的想法:通过树莓派和它内置的 WiFi 适配器,使用 Go 语言编写一个小程序来测量并显示从路由器收到的 WiFi 信号。我打算先简单快速地把它实现出来,以后再去考虑优化。真是麻烦!我现在只想知道这个 WiFi 是怎么回事!
+
+谷歌搜索了一番后,我发现了一个比较有用的 Go 软件包 [mdlayher/wifi][2],它专门用于 WiFi 相关操作,听起来很有希望!
### 获取 WiFi 接口的信息
-我的计划是查询 WiFi 接口的统计数据并返回信号强度,所以我需要先找到设备上的接口。幸运的是,mdlayher/wifi 包有一个查询它们的方法,所以我可以创建一个 `main.go` 来实现它,就像下面这样:
+我的计划是查询 WiFi 接口的统计数据并返回信号强度,所以我需要先找到设备上的接口。幸运的是,`mdlayher/wifi` 包有一个查询它们的方法,所以我可以创建一个 `main.go` 来实现它,具体代码如下:
-```go
+```
package main
import (
@@ -54,9 +54,9 @@ func main() {
}
```
-让我们来看看上面的代码都做了什么吧!嗯,首先是导入依赖模块,导入后,我就可以使用 mdlayher/wifi 模块就在主函数中创建一个新的客户端(类型为 `*Client`)。接下来,这个新的客户端(变量名为 `c`)就可以获得系统中的接口列表,只需要调用 `c.Interfaces()` 方法即可。接着,我就可以遍历包含接口指针的切片(变长数组),然后打印出它们的具体信息。
+让我们来看看上面的代码都做了什么吧!首先是导入依赖包,导入后,我就可以使用 `mdlayher/wifi` 模块就在 `main` 函数中创建一个新的客户端(类型为 `*Client`)。接下来,只需要调用这个新的客户端(变量名为 `c`)的 `c.Interfaces()` 方法就可以获得系统中的接口列表。接着,我就可以遍历包含接口指针的切片(变长数组),然后打印出它们的具体信息。
-注意到 `%+v` 中有一个 “+” 了吗?它意味着程序会额外打印出 `*Interface` 结构中的属性名,这将有助于我辨认出我看到的东西,而不用回头去看文档。
+注意到 `%+v` 中有一个 `+` 了吗?它意味着程序会详细输出 `*Interface` 结构体中的属性名,这将有助于我标识出我看到的东西,而不用去查阅文档。
运行上面的代码后,我得到了机器上的 WiFi 接口列表:
@@ -65,17 +65,17 @@ func main() {
&{Index:3 Name:wlp2s0 HardwareAddr:5c:5f:67:f3:0a:a7 PHY:0 Device:1 Type:station Frequency:2412}
```
-注意,两行输出中的 MAC 地址都是 `HardwareAddr`,这意味着它们是同一个物理硬件。你也可以通过 `PHY: 0` 来确认。根据 Go 的 [wifi 模块文档][3],`PHY` 指的就是接口所属的物理设备。
+注意,两行输出中的 MAC 地址(`HardwareAddr`)是相同的,这意味着它们是同一个物理硬件。你也可以通过 `PHY: 0` 来确认。查阅 Go 的 [wifi 模块文档][3],`PHY` 指的就是接口所属的物理设备。
-第一个接口没有名字,类型是 `TYPE: P2P`。第二个接口名为 `wpl2s0`,类型是 `TYPE: Station`。Go 的 wifi 模块文档列出了 [不同类型的接口][4],并描述了它们是什么。根据文档,“P2P” 类型表示“这个接口是点对点客户端网络中的一个设备”。我认为这个接口是用于 [WiFi 直连][5] 的,这是一个允许两个 WiFi 设备在没有中间接入点的情况下直接连接的标准。
+第一个接口没有名字,类型是 `TYPE: P2P`。第二个接口名为 `wpl2s0`,类型是 `TYPE: Station`。`wifi` 模块的文档列出了 [不同类型的接口][4],以及它们的用途。根据文档,`P2P`(点对点传输) 类型表示“该接口属于点对点客户端网络中的一个设备”。我认为这个接口的用途是 [WiFi 直连][5] ,这是一个允许两个 WiFi 设备在没有中间接入点的情况下直接连接的标准。
-“Station” 类型表示“这个接口是带有控制接入点的客户端设备管理的基本服务集(BSS)的一部分”。这是大多数人所习惯的无线设备标准功能,也就是作为一个客户端来连接到网络接入点。这也是测试 WiFi 质量的重要接口。
+`Station`(基站)类型表示“该接口是具有控制接入点的客户端设备管理的基本服务集(BSS)的一部分”。这是大众熟悉的无线设备标准功能:作为一个客户端来连接到网络接入点。这是测试 WiFi 质量的重要接口。
### 利用接口获取基站信息
-利用这个信息,我可以修改遍历接口的代码来获取我正在寻找的信息:
+利用该信息,我可以修改遍历接口的代码来获取所需信息:
-```go
+```
for _, x := range interfaces {
if x.Type == wifi.InterfaceTypeStation {
// c.StationInfo(x) returns a slice of all
@@ -91,9 +91,9 @@ for _, x := range interfaces {
}
```
-首先,这段程序检查了 `x.Type`(接口类型)是否为 `wifi.InterfaceTypeStation`,它是一个基站接口(也是本练习中唯一涉及到的类型)。这是一个不幸的命名冲突,因为这个接口“类型”和 Golang 中的“类型”不是一个东西。事实上,我在这里使用了一个叫做 `interfaceType` 的 Go 类型来代表接口类型。呼,我花了一分钟才弄明白!
+首先,这段程序检查了 `x.Type`(接口类型)是否为 `wifi.InterfaceTypeStation`,它是一个基站接口(也是本练习中唯一涉及到的类型)。不幸的是名字出现了冲突,这个接口“类型”并不是 Golang 中的“类型”。事实上,我在这里使用了一个叫做 `interfaceType` 的 Go 类型来代表接口类型。呼,我花了一分钟才弄明白!
-然后,假设接口的类型符合预期,我们就可以调用 `c.StationInfo(x)` 来检索基站信息,`StationInfo()` 方法可以获取到关于这个接口 `x` 的信息。
+然后,假设接口的类型正确,我们就可以调用 `c.StationInfo(x)` 来检索基站信息,`StationInfo()` 方法可以获取到关于这个接口 `x` 的信息。
这将返回一个包含 `*StationInfo` 指针的切片。我不大确定这里为什么要用切片,或许是因为接口可能返回多个 `StationInfo`?不管怎么样,我都可以遍历这个切片,然后使用之前提到的 `+%v` 技巧格式化打印出 `StationInfo` 结构的属性名和属性值。
@@ -103,7 +103,7 @@ for _, x := range interfaces {
&{HardwareAddr:70:5a:9e:71:2e:d4 Connected:17m10s Inactive:1.579s ReceivedBytes:2458563 TransmittedBytes:1295562 ReceivedPackets:6355 TransmittedPackets:6135 ReceiveBitrate:2000000 TransmitBitrate:43300000 Signal:-79 TransmitRetries:2306 TransmitFailed:4 BeaconLoss:2}
```
-我感兴趣的是“信号”部分,可能还有“传输失败”和“信标丢失”部分。信号强度是以 dBm(全称 decibel-milliwatts)为单位来报告的。
+我感兴趣的是 `Signal`(信号)部分,可能还有 `TransmitFailed`(传输失败)和 `BeaconLoss`(信标丢失)部分。信号强度是以 dBm(分贝-毫瓦)为单位来报告的。
#### 简短科普:如何读懂 WiFi dBm
@@ -112,16 +112,16 @@ for _, x := range interfaces {
* -30 最佳,但它既不现实也没有必要
* -67 非常好,它适用于需要可靠数据包传输的应用,例如流媒体
* -70 还不错,它是实现可靠数据包传输的底线,适用于电子邮件和网页浏览
-* -80 很差,只能保持绝对的基本连接,不可靠的数据包传输
-* -90 不可用,接近“噪音底线”
+* -80 很差,只是基本连接,数据包传输不可靠
+* -90 不可用,接近“背景噪声”
*注意:dBm 是对数尺度,-60 比 -30 要低 1000 倍。*
-### 使它成为一个真的“扫描仪”
+### 使它成为一个真的“扫描器”
-所以,看着上面输出显示的我的信号:-79。哇哦,感觉不大好呢。不过单看这个结果并没有太大帮助,它只能提供某个时间点的参考,只对 WiFi 网络适配器在那一瞬间所在的特定物理空间有效。一个连续的读数会更有用,它能使我们有可能看到信号随着树莓派的移动而变化。我可以再次修改主函数来实现这一点。
+所以,看着上面输出显示的我的信号:-79。哇哦,感觉不大好呢。不过单看这个结果并没有太大帮助,它只能提供某个时间点的参考,只对 WiFi 网络适配器在特定物理空间的某一瞬间有效。一个连续的读数会更有用,借助于它,我们观察到信号随着树莓派的移动而变化。我可以再次修改 `main` 函数来实现这一点。
-```go
+```
var i *wifi.Interface
for _, x := range interfaces {
@@ -153,9 +153,9 @@ for {
首先,我命名了一个 `wifi.Interface` 类型的变量 `i`。因为它在循环的范围外,所以我可以用它来存储接口信息。循环内创建的任何变量在该循环的范围外都是不可访问的。
-然后,我可以把这个循环一分为二。第一个遍历了 `c.Interfaces()` 返回的接口切片,如果元素是一个 `Station` 类型,它就将其存储在先前创建的变量 `i`中,并跳出循环。
+然后,我可以把这个循环一分为二。第一个遍历了 `c.Interfaces()` 返回的接口切片,如果元素是一个 `Station` 类型,它就将其存储在先前创建的变量 `i` 中,并跳出循环。
-第二个循环是一个无限循环,所以它将不断地运行,直到我按下 **Ctrl** + **C** 来结束程序。和之前一样,这个循环内部获取接口信息、检索基站信息,并打印出信号信息。然后它会休眠一秒钟,再次运行,反复打印信号信息,直到我退出为止。
+第二个循环是一个死循环,它将不断地运行,直到我按下 `Ctrl + C` 来结束程序。和之前一样,这个循环内部获取接口信息、检索基站信息,并打印出信号信息。然后它会休眠一秒钟,再次运行,反复打印信号信息,直到我退出为止。
运行上面的程序后,我得到了下面的输出:
@@ -173,13 +173,13 @@ Signal: -81
不管怎么说,知道这些信息总比不知道要好。让树莓派连接上显示器或者电子墨水屏,并接上电源,我就可以让它在公寓里移动,并绘制出信号死角的位置。
-剧透一下:由于房东的接入点在隔壁的公寓里,对我来说最大的死角是公寓厨房的冰箱那里发射出的一个圆锥体形状区域......这个冰箱与房东的公寓共用一堵墙!
+剧透一下:由于房东的接入点在隔壁的公寓里,对我来说最大的死角是以公寓厨房的冰箱为顶点的一个圆锥体形状区域......这个冰箱与房东的公寓靠着一堵墙!
我想如果用《龙与地下城》里的黑话来说,它就是一个“沉默之锥”。或者至少是一个“糟糕的网络连接之锥”。
-总之,这段代码可以直接在树莓派上运行 `go build -o wifi_scanner` 来编译,得到的二进制文件 `wifi_scanner` 可以与任何其他 ARM 设备(同一版本)共享。另外,它也可以在常规系统上用正确的 ARM 设备库进行编译。
+总之,这段代码可以直接在树莓派上运行 `go build -o wifi_scanner` 来编译,得到的二进制文件 `wifi_scanner` 可以运行在其他同样的ARM 设备上。另外,它也可以在常规系统上用正确的 ARM 设备库进行编译。
-祝你扫描愉快!希望你的 WiFi 路由器不在你的冰箱后面!你可以在 [我的 GitHub repo][7] 中找到这个项目所用的代码。
+祝你扫描愉快!希望你的 WiFi 路由器不在你的冰箱后面!你可以在 [我的 GitHub 存储库][7] 中找到这个项目所用的代码。
--------------------------------------------------------------------------------
@@ -188,7 +188,7 @@ via: https://opensource.com/article/21/3/troubleshoot-wifi-go-raspberry-pi
作者:[Chris Collins][a]
选题:[lkxed][b]
译者:[lkxed](https://github.com/lkxed)
-校对:[校对者ID](https://github.com/校对者ID)
+校对:[turbokernel](https://github.com/turbokernel)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/published/20210428 Share files between Linux and Windows computers.md b/published/20210428 Share files between Linux and Windows computers.md
new file mode 100644
index 0000000000..a5820c1b3d
--- /dev/null
+++ b/published/20210428 Share files between Linux and Windows computers.md
@@ -0,0 +1,235 @@
+[#]: subject: (Share files between Linux and Windows computers)
+[#]: via: (https://opensource.com/article/21/4/share-files-linux-windows)
+[#]: author: (Stephan Avenwedde https://opensource.com/users/hansic99)
+[#]: collector: (lujun9972)
+[#]: translator: (hanszhao80)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-14537-1.html)
+
+如何在 Linux 和 Windows 电脑之间共享文件
+======
+
+> 使用 Samba 设置跨平台文件共享。
+
+
+
+如果你使用不同的操作系统,能够在它们之间共享文件会让你倍感方便。这篇文章介绍如何使用 [Samba][3] 和 [mount.cifs][4] 在 Linux ([Fedora 33][2])和 Windows 10 之间设置文件共享。
+
+Samba 是 [SMB/CIFS][5] 协议的 Linux 实现,允许通过网络连接直接访问共享的文件夹和打印机。 mount.cifs 是 Samba 套件的一部分,可让你在 Linux 下挂载 [CIFS][5] 文件系统。
+
+> **注意**: 这些说明适用于在你的私有本地网络内,或在 Linux 宿主机和虚拟化的 Windows 访客机之间的虚拟主机专用网络中共享文件。不要将本文视为你公司网络的操作指南,因为本文没有实现必要的网络安全考虑。
+
+### 从 Windows 访问 Linux
+
+本节介绍从 Windows 文件资源管理器访问用户的 Linux 主目录。
+
+#### 1、安装和配置 Samba
+
+进入你的系统安装 Samba:
+
+```
+dnf install samba
+```
+
+Samba 是一个系统守护进程,其配置文件位于 `/etc/samba/smb.conf`。它的默认配置应该就可以工作。如果不行,下面这个最小化配置应该可以解决问题:
+
+```
+[global]
+ workgroup = SAMBA
+ server string = %h server (Samba %v)
+ invalid users = root
+ security = user
+[homes]
+ comment = Home Directories
+ browseable = no
+ valid users = %S
+ writable = yes
+```
+
+你可以在该项目网站的 [smb.conf][6] 部分找到参数的详细说明。
+
+#### 2、修改 LinuxSE
+
+如果你的 Linux 发行版受 [SELinux][7] 保护(比如 Fedora),必须通过以下命令才能通过 Samba 共享主目录:
+
+```
+setsebool -P samba_enable_home_dirs on
+```
+
+通过以下命令查看这个值:
+
+```
+getsebool samba_enable_home_dirs
+```
+
+输出如下:
+
+![Sebool][8]
+
+#### 3、启用你的用户
+
+Samba 使用一组用户/密码来管理连接权限。通过键入以下命令将你的 Linux 用户添加到该集合中:
+
+```
+smbpasswd -a <你的用户名>
+```
+
+系统提示你输入密码。这是一个 _全新_ 的密码;而不是你账户的当前密码。请输入你想用来登录 Samba 的密码。
+
+键入以下命令得到有 Samba 使用权限的用户列表:
+
+```
+pdbedit -L -v
+```
+
+键入以下命令删除一个用户:
+
+```
+smbpasswd -x <用户名>
+```
+
+#### 4、开启 Samba
+
+既然 Samba 是一个系统守护进程,你可以在 Fedora 上键入以下命令启动它:
+
+```
+systemctl start smb
+```
+
+这将为当前会话开启 Samba 服务。如果想让它自启动,键入以下命令:
+
+```
+systemctl enable smb
+```
+
+在某些系统上,Samba 守护进程注册为 `smbd`。
+
+#### 4、配置防火墙
+
+你的防火墙会默认阻拦 Samba。通过配置防火墙允许 Samba 能永久访问网络。
+
+你可以在命令行执行如下操作:
+
+```
+firewall-cmd --add-service=samba --permanent
+```
+
+或者,你可以使用 `firewall-config` 工具以图形化方式进行操作:
+
+![firewall-config][10]
+
+#### 5、从 Windows 访问 Samba
+
+在 Windows 中,打开文件资源管理器。在地址栏中,键入两个反斜杠(`\\`),紧跟你的 Linux 机器的地址(IP 地址或主机名):
+
+![从 Windows 访问 Linux][11]
+
+系统将提示你输入登录信息。输入第 3 步中的用户名和密码组合。你现在应该可以访问 Linux 机器上的主目录:
+
+![从 Windows 访问 Linux][12]
+
+### 从 Linux 访问 Windows
+
+以下步骤说明了如何从 Linux 访问共享的 Windows 文件夹。要实现这一点,需要你的 Windows 用户帐户具有管理员权限。
+
+#### 1、启用文件共享
+
+通过点击 “Windows 按钮” > “设置” > “网络和 Internet” ,或者右键单击任务栏右下角的小监视器图标,打开网络和共享中心:
+
+![打开网络和共享中心][13]
+
+在打开的窗口中,找到你要使用的连接并记下其配置文件。我使用了 **以太网 3**,它被标记为 公用网络。
+
+> **注意**:如果你的 PC 经常连接公用网络,请考虑将本地计算机的连接配置文件更改为 **私有**。
+
+记住你的网络配置,然后单击 更改高级共享设置:
+
+![更改高级共享设置][14]
+
+选择与你的连接对应的配置文件并打开 网络发现 和 文件和打印机共享:
+
+![网络共享设置][15]
+
+#### 2、定义一个共享文件夹
+
+通过右键单击你要共享的文件夹打开上下文菜单,导航到 授予访问权限,然后选择 特定用户...:
+
+![授予访问权限][16]
+
+检查你当前的用户名是否在列表中。点击 共享 将此文件夹标记为共享:
+
+![标记为共享][17]
+
+你可以通过在文件资源管理器的地址栏中输入 `\\localhost` 来显示所有共享文件夹的列表:
+
+![共享文件夹][18]
+
+![共享文件夹][19]
+
+#### 3、在 Linux 下挂载共享文件夹
+
+回到你的 Linux 系统,打开一个命令行,然后创建一个新文件夹,用于挂载 Windows 共享:
+
+```
+mkdir ~/WindowsShare
+```
+
+挂载 Windows 共享是使用 `mount.cifs` 完成的,它应该被默认安装。使用如下命令临时挂载你的共享文件夹:
+
+```
+sudo mount.cifs ///MySharedFolder ~/WindowsShare/ -o user=,uid=$UID
+```
+
+在这个命令里:
+
+ * `` 是 Windows PC 的地址信息(IP 或主机名)
+ * `` 是允许访问共享文件夹的用户(见步骤 2)
+
+系统将提示你输入 Windows 密码。之后,你将能够使用普通 Linux 用户访问 Windows 上的共享文件夹。
+
+要卸载共享文件夹:
+
+```
+sudo umount ~/WindowsShare/
+```
+
+你还可以在系统启动时挂载 Windows 共享文件夹。按照 [这些步骤][20] 相应地配置你的系统。
+
+### 总结
+
+在这里展示了如何建立临时的文件夹共享访问权限,每次重启后都要重新设置,因此修改成永久访问会更便利。我经常在不同的系统之间来回切换,对我而言设置直接文件访问非常实用。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/4/share-files-linux-windows
+
+作者:[Stephan Avenwedde][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/hansic99
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003499_01_cloud21x_cc.png?itok=5UwC92dO (Blue folders flying in the clouds above a city skyline)
+[2]: https://getfedora.org/en/workstation/download/
+[3]: https://www.samba.org/
+[4]: https://linux.die.net/man/8/mount.cifs
+[5]: https://en.wikipedia.org/wiki/Server_Message_Block
+[6]: https://www.samba.org/samba/docs/current/man-html/smb.conf.5.html
+[7]: https://www.redhat.com/en/topics/linux/what-is-selinux
+[8]: https://opensource.com/sites/default/files/uploads/sebool.png (Enabling Samba to enable user directory access)
+[9]: https://creativecommons.org/licenses/by-sa/4.0/
+[10]: https://opensource.com/sites/default/files/uploads/firewall_configuration.png (firewall-config tool)
+[11]: https://opensource.com/sites/default/files/uploads/windows_access_shared_1.png (Accessing Linux machine from Windows)
+[12]: https://opensource.com/sites/default/files/uploads/windows_acess_shared_2.png (Accessing Linux machine from Windows)
+[13]: https://opensource.com/sites/default/files/uploads/open_network_and_sharing_center.png (Open network and sharing center)
+[14]: https://opensource.com/sites/default/files/uploads/network_and_sharing_center_2.png (Change advanced sharing settings)
+[15]: https://opensource.com/sites/default/files/uploads/network_sharing.png (Network sharing settings)
+[16]: https://opensource.com/sites/default/files/pictures/give_access_to.png (Give access)
+[17]: https://opensource.com/sites/default/files/pictures/tag_as_shared.png (Tag as shared)
+[18]: https://opensource.com/sites/default/files/uploads/show_shared_folder_1.png (Shared folders)
+[19]: https://opensource.com/sites/default/files/uploads/show_shared_folder_2.png (Shared folders)
+[20]: https://timlehr.com/auto-mount-samba-cifs-shares-via-fstab-on-linux/
diff --git a/published/20210617 Linux package management with dnf.md b/published/20210617 Linux package management with dnf.md
new file mode 100644
index 0000000000..a2cb4a8853
--- /dev/null
+++ b/published/20210617 Linux package management with dnf.md
@@ -0,0 +1,177 @@
+[#]: subject: (Linux package management with dnf)
+[#]: via: (https://opensource.com/article/21/6/dnf-linux)
+[#]: author: (Seth Kenlon https://opensource.com/users/seth)
+[#]: collector: (lujun9972)
+[#]: translator: (hanszhao80)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-14542-1.html)
+
+使用 dnf 进行 Linux 包管理
+======
+
+> 了解如何在 Linux 上使用 `dnf` 命令安装软件包,然后下载我们的速查表,让正确的命令触手可及。
+
+
+
+在计算机系统上安装应用程序非常简单:就是将档案(如 `.zip` 文件)中的文件复制到目标计算机上,放在操作系统预期放应用程序的位置。因为我们中的许多人习惯于使用花哨的安装“向导”来帮助我们在计算机上安装软件,所以这个过程似乎在技术上应该比实际更复杂。
+
+然而,复杂的是,是什么构成了一个程序?用户认为的单个应用程序实际上包含了分散在操作系统中的软件库的各种依赖代码(例如:Linux 上的 .so 文件、Windows 上的 .dll 文件和 macOS 上的 .dylib 文件)。
+
+为了让用户不必担心这些程序代码之间的复杂的互相依赖关系, Linux 使用 包管理系统 来跟踪哪些应用程序需要哪些库,哪些库或应用程序有安全或功能更新,以及每个软件会附带安装哪些额外的数据文件。包管理器本质上是一个安装向导。它们易于使用,提供了图形界面和基于终端的界面,让你的生活更轻松。你越了解你的发行版的包管理器,你的生活就会越轻松。
+
+### 在 Linux 上安装应用程序
+
+如果你在使用 Linux 桌面时,偶尔想要安装一个应用程序,那么你可能正在寻找 [GNOME “软件”][2],它是一个桌面应用程序浏览器。
+
+![GNOME “软件” 程序][3]
+
+它会按你的预期工作:点击它的界面,直到你找到一个看起来有用的应用程序,然后单击 “安装” 按钮。
+
+或者,你可以在 GNOME “软件” 中打开从网络下载的 `.rpm` 或 `.flatpakref` 软件包,以便它进行安装。
+
+但如果你更倾向于使用命令行,请继续阅读。
+
+### 用 dnf 搜索软件
+
+在安装应用程序之前,你可能需要确认它是否存在于你的发行版的服务器上。通常,使用 `dnf` 搜索应用程序的通用名称就足够了。例如,假设你最近阅读了 [一篇关于 Cockpit 的文章][4],并决定尝试一下。你可以搜索 `cockpit` 验证该发行版是否包含它:
+
+```
+$ dnf search cockpit
+ Last metadata expiration check: 0:01:46 ago on Tue 18 May 2021 19:18:15 NZST.
+ ==== Name Exactly Matched: cockpit ====
+ cockpit.x86_64 : Web Console for Linux servers
+
+==== Name & Summary Matched: cockpit ==
+ cockpit-bridge.x86_64 : Cockpit bridge server-side component
+ cockpit-composer.noarch : Composer GUI for use with Cockpit
+ [...]
+```
+
+有一个精确的匹配。上面列出的匹配的软件包名为 `cockpit.x86_64`,但名称中的 `.x86_64` 部分仅表示它兼容该 CPU 架构。默认情况下,你的系统会安装适配当前 CPU 架构的软件包,因此你可以忽略该扩展名。所以你确认你要查找的软件包确实简称为 `cockpit`。
+
+现在你可以放心地使用 `dnf install` 安装它。 此步骤需要管理员权限:
+
+```
+$ sudo dnf install cockpit
+```
+
+一般来说,这就是典型的 `dnf` 工作流:搜索并安装。
+
+然而,有时 `dnf search` 的结果并不清晰,或者你想要关于一个软件包的更多信息,而不仅仅是它的通用名称。有一些相关的 `dnf` 子命令,具体取决于你想要的信息。
+
+### 软件包的元数据
+
+如果你觉得你的搜索已 _接近_ 想要的结果,但还不确定,查看软件包的元数据通常会有所帮助,例如项目的网址和描述。要获取此信息,请使用顾名思义的 `dnf info` 命令:
+
+```
+$ dnf info terminator
+Available Packages
+Name : terminator
+Version : 1.92
+Release : 2.el8
+Architecture : noarch
+Size : 526 k
+Source : terminator-1.92-2.el8.src.rpm
+Repository : epel
+Summary : Store and run multiple GNOME terminals in one window
+URL : https://github.com/gnome-terminator
+License : GPLv2
+Description : Multiple GNOME terminals in one window. This is a project to produce
+ : an efficient way of filling a large area of screen space with
+ : terminals. This is done by splitting the window into a resizeable
+ : grid of terminals. As such, you can produce a very flexible
+ : arrangements of terminals for different tasks.
+```
+
+这个信息告诉你可用软件包的版本、在你系统中注册的哪一个存储库提供了它、该项目的网站以及详细的功能描述。
+
+### 哪个软件包提供的这个文件?
+
+软件包名称并不总是与你要查找的内容相匹配。例如,假设你正在阅读的文档告诉你必须安装名为 `qmake-qt5` 的东西:
+
+```
+$ dnf search qmake-qt5
+No matches found.
+```
+
+`dnf` 数据库非常广泛,因此你不要局限于搜索完全匹配的内容。你可以使用 `dnf provides` 命令来了解你正在寻找的东西是否作为某个更大的软件包的一部分而提供:
+
+```
+$ dnf provides qmake-qt5
+qt5-qtbase-devel-5.12.5-8.el8.i686 : Development files for qt5-qtbase
+Repo : appstream
+Matched from:
+Filename : /usr/bin/qmake-qt5
+
+qt5-qtbase-devel-5.15.2-3.el8.x86_64 : Development files for qt5-qtbase
+Repo : appstream
+Matched from:
+Filename : /usr/bin/qmake-qt5
+```
+
+可以确认应用程序 `qmake-qt5` 是名为 `qt5-qtbase-devel` 的软件包的一部分。它还告诉你,该应用程序会安装到 `/usr/bin`,因此你知道了安装后它的确切位置。
+
+### 软件包中包含哪些文件?
+
+有时我发现自己会从完全不同的角度来对待 `dnf`。有时,我已经确认我的系统上安装了一个应用程序;我只是不知道我是怎么得到它的。还有一些时候,我知道我安装了一个特定的软件包,但我不清楚这个软件包到底在我的系统上安装了什么。
+
+如果你需要对包的有效负载进行 “逆向工程”,可以使用 `dnf repoquery` 命令和 `--list` 选项。这将查看存储库中有关软件包的元数据,并列出该软件包提供的所有文件:
+
+```
+$ dnf repoquery --list qt5-qtbase-devel
+/usr/bin/fixqt4headers.pl
+/usr/bin/moc-qt5
+/usr/bin/qdbuscpp2xml-qt5
+/usr/bin/qdbusxml2cpp-qt5
+/usr/bin/qlalr
+/usr/bin/qmake-qt5
+/usr/bin/qvkgen
+/usr/bin/rcc-qt5
+[...]
+```
+
+这些列表可能很长,使用 `less` 或你喜欢的分页命令配合管道操作会有所帮助。
+
+### 移除应用程序
+
+如果你决定系统中不再需要某个应用程序,可以使用 `dnf remove` 卸载它,该软件包本身安装的文件以及不再需要的任何依赖项都会被移除:
+
+```
+$ dnf remove bigapp
+```
+
+有时,你发现随着一个应用程序一起安装的依赖项对后来安装的其他应用程序也有用。如果两个包需要相同的依赖项,`dnf remove` _不会_ 删除依赖项。在安装和卸载大量应用程序之后,孤儿软件包散落各处的现象并不少见。大约每年我都要执行一次 `dnf autoremove` 来清除所有未使用的软件包:
+
+```
+$ dnf autoremove
+```
+
+这不是必需的,但这是一个让我的电脑感觉更好的大扫除步骤。
+
+### 了解 dnf
+
+你对包管理器的工作方式了解得越多,在必要时安装和查询应用程序就越容易。即便你不是 `dnf` 的重度使用者,当你发现自己与基于 RPM 的发行版交互时,了解它也会很有用。
+
+告别 `yum` 后,我最喜欢的包管理器之一是 `dnf` 命令。虽然我不喜欢它的所有子命令,但我发现它是目前最健壮的 包管理系统 之一。 [下载我们的 dnf 速查表][5] 习惯该命令,不要害怕尝试一些新技巧。一旦熟悉了它,你可能会发现很难使用其他任何东西替代它。
+
+> **[dnf 速查表][5]**
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/6/dnf-linux
+
+作者:[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/brown-package-red-bow.jpg?itok=oxZYQzH- (Package wrapped with brown paper and red bow)
+[2]: https://wiki.gnome.org/Apps/Software
+[3]: https://opensource.com/sites/default/files/gnome-software.png (The GNOME Software app)
+[4]: https://opensource.com/article/20/11/cockpit-server-management
+[5]: https://opensource.com/downloads/dnf-cheat-sheet
diff --git a/published/20210624 Linux package management with apt.md b/published/20210624 Linux package management with apt.md
new file mode 100644
index 0000000000..719f02d766
--- /dev/null
+++ b/published/20210624 Linux package management with apt.md
@@ -0,0 +1,184 @@
+[#]: subject: (Linux package management with apt)
+[#]: via: (https://opensource.com/article/21/6/apt-linux)
+[#]: author: (Chris Hermansen https://opensource.com/users/clhermansen)
+[#]: collector: (lujun9972)
+[#]: translator: (hanszhao80)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-14558-1.html)
+
+使用 apt 进行 Linux 包管理
+======
+
+> 学习如何使用 apt 命令在基于 Debian 的 Linux 发行版上安装软件包,然后下载我们的速查表,让正确的命令触手可及。
+
+
+
+[包管理器][2] 可帮助你处理 Linux 系统的计算机上软件的更新、卸载、故障排除等问题。Seth Kenlon 写了 [使用 dnf 进行 Linux 包管理][3] 一文,介绍了如何使用 `dnf` 这款命令行包管理工具,在 RHEL、CentOS、Fedora、Mageia、OpenMandriva 等 Linux 发行版中安装软件。
+
+Debian 和基于 Debian 的发行版(例如 MX Linux、Deepin、Ubuntu)以及基于 Ubuntu 的发行版(例如 Linux Mint 和 Pop!_OS)都有 `apt`,这是一个“相似但不同”的工具。在本文中,我将按照 Seth 的示例(但使用 `apt`)向你展示如何使用它。
+
+在一开始,我想先提一下四个跟 `apt` 相关的软件安装工具:
+
+ * [Synaptic][4] 是为 `apt` 服务的一个基于 GTK+ 的图形用户界面(GUI)的前端工具。
+ * [Aptitude][5] 是为 `apt` 服务的一个基于 Ncurses 的全屏命令行前端工具。
+ * `apt` 的前身有 `apt-get`、`apt-cache` 等工具。
+ * [Dpkg][6] 是在 `apt` 包管理器背后处理繁杂事务的”幕后工作者“。
+
+还有其他的包管理系统,例如 [Flatpak][7] 和 [Snap][8],你可能会在 Debian 和基于 Debian 的系统上遇到它们,但我不打算在这里讨论。还有一些应用程序“商店”,例如 [GNOME “软件”][9],与 `apt` 和其他打包技术重叠;我也不打算在这里讨论它们。最后,还有其他 Linux 发行版,例如 [Arch][10] 和 [Gentoo][11] 既不使用 `dnf` 也不使用 `apt`,我也不打算在这里讨论它们!
+
+上面我讲了这么多我不想提及的内容,你可能怀疑 `apt` 到底还能处理多少软件。这么说吧,在我的 Ubuntu 20.04 上,`apt` 可以让我使用 69,371 个软件包,从 `0ad`(一款古代战争题材的即时战略游戏)到 `zzuf`(一个透明的应用程序模糊测试工具),一点也不差。
+
+### 使用 apt 搜索软件
+
+使用 `apt` 软件包管理器的第一步是找到感兴趣的软件包。Seth 的 `dnf` 文章以 [Cockpit][12] 服务器管理应用程序为例。用 `apt` 我会输入如下命令:
+
+```
+$ apt search cockpit
+Sorting... Done
+Full Text Search... Done
+389-ds/hirsute,hirsute 1.4.4.11-1 all
+ 389 Directory Server suite - metapackage
+
+cockpit/hirsute,hirsute 238-1 all
+ Web Console for Linux servers
+
+...
+$
+```
+
+上面的第二个包就是你要的那个(以 `cockpit/hirsute` 开头的那一行)。如果你决定要安装它,输入:
+
+```
+$ sudo apt install cockpit
+```
+
+`apt` 将负责安装 Cockpit 以及使其工作所需的所有部件或 _依赖_。有时我们不太确定这是我们所需要的。了解更多的信息可能有助于你决定是否真的要安装此应用程序。
+
+### 包元数据
+
+要了解有关软件包的更多信息,使用 `apt show` 命令:
+
+```
+$ apt show cockpit
+Package: cockpit
+Version: 238-1
+Priority: optional
+Section: universe/admin
+Origin: Ubuntu
+Maintainer: Ubuntu Developers
+Original-Maintainer: Utopia Maintenance Team
+Bugs: https://bugs.launchpad.net/ubuntu/+filebug
+Installed-Size: 88.1 kB
+Depends: cockpit-bridge (>= 238-1), cockpit-ws (>= 238-1), cockpit-system (>= 238-1)
+Recommends: cockpit-storaged (>= 238-1), cockpit-networkmanager (>= 238-1), cockpit-packagekit (>= 238-1)
+Suggests: cockpit-doc (>= 238-1), cockpit-pcp (>= 238-1), cockpit-machines (>= 238-1), xdg-utils
+Homepage: https://cockpit-project.org/
+Download-Size: 21.3 kB
+APT-Sources: http://ca.archive.ubuntu.com/ubuntu hirsute/universe amd64 Packages
+Description: Web Console for Linux servers
+ The Cockpit Web Console enables users to administer GNU/Linux servers using a
+ web browser.
+ .
+ It offers network configuration, log inspection, diagnostic reports, SELinux
+ troubleshooting, interactive command-line sessions, and more.
+
+$
+```
+
+特别要注意的是 `Description` 字段,它会告诉你更多关于应用程序的信息。`Depends` 字段说明还必须安装什么,而 `Recommends` 则显示建议安装的其他(如果有的话)合作组件。`Homepage` 字段会提供一个网址,通过它你可以了解更多。
+
+### 哪个包提供的这个文件?
+
+有时你并不知道包名,但你知道包里一定包含着的某个文件。Seth 以 `qmake-qt5` 程序作为示例。使用 `apt search` 找不到它:
+
+```
+$ apt search qmake-qt5
+Sorting... Done
+Full Text Search... Done
+$
+```
+
+但是,另一个有关联的命令 `apt-file` 可以用来探索包内部:
+
+```
+$ apt-file search qmake-qt5
+qt5-qmake-bin: /usr/share/man/man1/qmake-qt5.1.gz
+$
+```
+
+这时会显示一个 `qmake-qt5` 的手册页。它是一个名为 `qt5-qmake-bin` 的包的一部分。注意,此包名称颠倒了字符串 `qmake` 和 `qt5` 的顺序。
+
+### 包里包含哪些文件?
+
+方便的 `apt-file` 命令会列出给定的包中包含哪些文件。例如:
+
+```
+$ apt-file list cockpit
+cockpit: /usr/share/doc/cockpit/TODO.Debian
+cockpit: /usr/share/doc/cockpit/changelog.Debian.gz
+cockpit: /usr/share/doc/cockpit/copyright
+cockpit: /usr/share/man/man1/cockpit.1.gz
+cockpit: /usr/share/metainfo/cockpit.appdata.xml
+cockpit: /usr/share/pixmaps/cockpit.png
+$
+```
+
+注意,这与 `apt show` 命令提供的信息不同,后者列出了包的依赖(其他必须安装的包)。
+
+### 移除一个应用程序
+
+你还可以使用 `apt` 移除软件包。例如,要移除`apt-file` 应用程序:
+
+```
+$ sudo apt purge apt-file
+```
+
+注意必须由超级用户运行 `apt` 才能安装或移除应用程序。
+
+移除一个包并不会自动移除 `apt` 在此过程中安装的所有依赖项。不过,一点点的工作就很容易去除这些残留:
+
+```
+$ sudo apt autoremove
+```
+
+### 认识一下 apt
+
+正如 Seth 所写的,“你对包管理器的工作方式了解得越多,在需要安装和查询应用程序时就会越容易。”
+
+即便你不是 `apt` 的重度使用者,当你需要在命令行中安装或删除软件包时(例如,在一台远程服务器上或遵循某些热心肠发布的操作指南时),掌握一些 `apt` 的知识也会很有用。在某些软件创作者仅提供了一个裸 `.pkg` 文件的情况下,可能还需要了解一些关于 dpkg 的知识(如上所述)。
+
+我发现 Synaptic 包管理器在我的桌面上是一个非常有用的工具,但出于各种目的,我也在少数维护的服务器上使用着 `apt`。
+
+[下载我们的 apt 速查表][15] 习惯该命令并尝试一些新技巧。一旦你这样做了,你可能会发现很难再使用其他任何东西。
+
+> **[apt 速查表][15]**
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/6/apt-linux
+
+作者:[Chris Hermansen][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/clhermansen
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/bash_command_line.png?itok=k4z94W2U (bash logo on green background)
+[2]: https://opensource.com/article/21/2/linux-package-management
+[3]: https://linux.cn/article-14542-1.html
+[4]: https://www.nongnu.org/synaptic/
+[5]: https://wiki.debian.org/Aptitude
+[6]: https://wiki.debian.org/Teams/Dpkg
+[7]: https://flatpak.org/
+[8]: https://snapcraft.io/
+[9]: https://wiki.gnome.org/Apps/Software
+[10]: https://archlinux.org/
+[11]: https://www.gentoo.org/
+[12]: https://opensource.com/article/20/11/cockpit-server-management
+[13]: mailto:ubuntu-devel-discuss@lists.ubuntu.com
+[14]: mailto:pkg-utopia-maintainers@lists.alioth.debian.org
+[15]: https://opensource.com/downloads/apt-cheat-sheet
diff --git a/published/20210710 A new open source operating system for embedded systems.md b/published/20210710 A new open source operating system for embedded systems.md
new file mode 100644
index 0000000000..2674c8d4dc
--- /dev/null
+++ b/published/20210710 A new open source operating system for embedded systems.md
@@ -0,0 +1,91 @@
+[#]: subject: (A new open source operating system for embedded systems)
+[#]: via: (https://opensource.com/article/21/7/rt-thread-smart)
+[#]: author: (Zhu Tianlong https://opensource.com/users/zhu-tianlong)
+[#]: collector: (lujun9972)
+[#]: translator: (tendertime)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-14552-1.html)
+
+一种新的开源嵌入式操作系统
+======
+
+> RT-Thread Smart 致力于物联网和边缘计算领域的开源。
+
+
+
+目前对 [嵌入式操作系统][2] 有巨大的需求,你建立的操作系统最好是开源的。[RT-Thread][3] 项目的研发团队花了两年时间,研发出了该项目的最新成果:RT-Thread Smart。这是一款微内核的操作系统,主要针对中高端的处理器,如具有内存管理单元(MMU)的 RISC-V 或 Arm Cortex-A,为嵌入式领域的所有行业提供了一个具有竞争力的、基于 POSIX 的软件平台。
+
+### 谁需要 RT-Thread Smart?
+
+RT-Thread Smart 是一款专业的、高性能的微内核操作系统,用于实时应用。它为所有市场的嵌入式设备提供了开源基础,如安全(IP 摄像头)、工业控制、车载设备、消费电子及其他嵌入式科技应用,可谓一切场景。它的意义在于:不像传统的物联网操作系统,一个微内核的操作系统可以填补传统实时操作系统 RTOS 和相对大型的操作系统如 Linux 之间的空白,实现实时性能、成本、安全、启动速度等等各方面之间的最佳平衡。
+
+### RT-Thread Smart 的架构
+
+RT-Thread Smart 通过 MMU 和系统调用将系统分割为内核模式和用户模式,并为每种模式区分了地址空间(一个 32 位系统可以提供 4G 地址空间)。
+
+![RT-Thread Smart 架构][4]
+
+(RT-Thread, [CC BY-SA 4.0][5])
+
+RT-Thread Smart 内核包括平台的基础功能,并支持定制化。RT-Thread Smart 的用户应用环境使用 [musl libc][6] 来提供 [POSIX][7] 接口调用和 C 语言的运行时支持。它也继承了原始的 RT-Thread 生态系统,使用 [SCons][8] 或者其他编译工具如 [Autotools][9]、Makefile、[CMake][10] 等等来支持开发,以及 RT-Thread 开箱即用的在线软件包(撰写本文时超过 342 个)。你甚至可以将 Linux 应用程序(如 wget/cURL、BusyBox、OpenSSL 和 Simple DirectMedia Layer)移植到你的平台。
+
+压缩的 RT-Thread Smart 内核仅 217 KB,搭配一个 127 KB 的根文件系统。大约 2 MB的存储占用。包括了对文件系统、网络协议栈、多媒体的完整支持。RT-Thread 只需要 3 到 5 秒完成启动,而在不运行其他功能组件时,RT-Thread Smart 需要的启动及准备时间不到 500ms。
+
+通过其集成的 Persimmon 用户界面(UI)组件,RT-Thread Smart 从上电到运行 UI 需要大约 1 秒。换句话说,这是一个非常轻巧快速的系统。当然,“实时”不是指启动,而是指系统随着时间推进而表现出的一致性。对于 RT-Thread ,实时性能需要优先考虑,中断时延小于 1μs,满足大部分实时性要求严格的场景需求。
+
+### RT-Thread Smart 和 RT-Thread
+
+你可能想知道 RT-Thread Smart 和 RT-Thread 之间的不同。简单来说, RT-Thread Smart 是一个基于 RT-Thread RTOS 的操作系统,但它整合了用户态的处理过程。RT-Smart 的内核部分本质上是 RT-Thread RTOS,它在虚拟地址上运行,增加了进程管理,使用进程间通信机制(IPC)、虚拟内存/地址空间管理、ELF 加载器等等,以上特性全部在 RT-Thread RTOS 内实现,当这些组件被禁用时,RT-Smart 会回归 RT-Thread RTOS。
+
+以下是对比:
+
+| | RT-Thread | RT-Thread Smart
+ :-----| :----: | :----:
+支持芯片 | Cortex-M/R、RISC-V RV32IMAC(以及类似)、Cortex-A MPU | Cortex-A 等具有 MMU 的 MPU
+编译 | 内核和应用都编译到一个镜像 | 内核和应用可以被分开编译和运行
+存储 | 使用线性地址空间(即使有 MMU),使用物理地址的虚拟寻址 | 运行在内核占用超过 1GB 的 32 位操作系统,拥有完整 4G 地址空间的用户态进程彼此隔离,外设驱动程序必须通过虚拟地址访问外设
+运行错误 | 当一个应用程序失败时,整个系统就会崩溃 | 当应用程序失败时,它不会影响内核和其他进程的执行
+运行模式 | 多线程模型 | 多进程模型(进程内支持多线程,内核线程由内核支持)
+用户模型 | 单用户模型 | 单用户模型
+API | RT-Thread API、POSIX PSE52 | RT-Thread API(内核态和用户态),以及完整的 POSIX API
+实时性 | 抢占式硬实时系统 | 抢占式硬实时系统
+资源使用 | 非常小 | 相对小
+调试 | 通常需要模拟器调试 | 支持 GDB 调试,不需要模拟器
+
+RT-Thread RTOS 非常紧凑,它的所有应用和子系统都编译到镜像中,多线程应用运行并分享相同的地址空间。
+
+RT-Thread Smart 是独立的。系统和应用是分别编译和运行的。应用拥有完整且互相隔离的地址空间。它也继承了 RT-Thread 优秀的实时性,同时也具有 POSIX 环境的特性。
+
+类似地,它们都与 RT-Thread API 兼容。RT-Thread RTOS 的应用可以被平滑移植到 RT-Thread Smart。
+
+### 嵌入式开源
+
+RT-Thread Smart 是一个开源项目,项目地址:[GitHub][11]。你可以下载代码和文档,尝试一下,并提交评论和反馈,将该项目传播给更多开源倡导者。嵌入式系统属于它们的用户,有太多的嵌入式开发人员没有找到太多可用的嵌入式系统。
+
+如果你是开发人员,请帮助改进 RT-Thread Smart。随着 RT-Thread 项目的不断推进,我们希望创建物联网和边缘计算的令人激动的开源世界。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/7/rt-thread-smart
+
+作者:[Zhu Tianlong][a]
+选题:[lujun9972][b]
+译者:[tendertime](https://github.com/tendertime)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/zhu-tianlong
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/LAW-Internet_construction_9401467_520x292_0512_dc.png?itok=RPkPPtDe (An intersection of pipes.)
+[2]: https://opensource.com/article/20/6/open-source-rtos
+[3]: https://www.rt-thread.io/
+[4]: https://opensource.com/sites/default/files/uploads/rt-thread-smart.png (RT-Thread Smart architecture)
+[5]: https://creativecommons.org/licenses/by-sa/4.0/legalcode
+[6]: https://musl.libc.org/
+[7]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains
+[8]: https://scons.org/
+[9]: https://opensource.com/article/19/7/introduction-gnu-autotools
+[10]: https://opensource.com/article/21/5/cmake
+[11]: https://github.com/RT-Thread/rt-thread/tree/rt-smart
diff --git a/published/20211213 How I use open source to design my own card games.md b/published/20211213 How I use open source to design my own card games.md
new file mode 100644
index 0000000000..b2d051df18
--- /dev/null
+++ b/published/20211213 How I use open source to design my own card games.md
@@ -0,0 +1,111 @@
+[#]: subject: "How I use open source to design my own card games"
+[#]: via: "https://opensource.com/article/21/12/open-source-card-game"
+[#]: author: "Seth Kenlon https://opensource.com/users/seth"
+[#]: collector: "lujun9972"
+[#]: translator: "hadisi1993"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14551-1.html"
+
+我如何利用开源设计自己的卡牌游戏
+======
+
+> 开源并不仅仅指的是软件。开源是一种文化现象,自然也适合桌面游戏。
+
+
+
+我喜欢优秀的游戏,尤其是桌游,因为桌游的很多特性都和开源相同。在现实生活中,当你和朋友围坐在桌旁一起玩卡牌游戏时,作为一个团队,你们可以一起决定小丑牌是不是万能的。还有,你们可以随意地决定当出了小丑牌后,手上有 Ace 牌的人的要不要舍弃 Ace 牌,或者出了方块皇后以后,每个人是不是都要把手上的牌传给右手边的人。换句话说,你们可以随心所欲地重新制定规则,因为游戏不过是参与者们一致认同的条件集合罢了。对我来说,更棒的是你可以发明自己的游戏,而不用破坏别人的游戏规则。有时候,我会作为一个业余爱好者来开发桌游。因为我喜欢把自己的爱好结合起来,所以我倾向于只使用开源和开放的文化资源来设计游戏。
+
+首先,游戏有大致有两个关键特征,风格和机制,理解这一点非常重要。游戏风格指的是游戏的故事或者主题,游戏机制指的是游戏的规则和条件。这两者并不总是完全脱离的,举个例子,在设计一款以赛车为主题的游戏时,自然而然就会要求玩家迅速完成动作。然而,风格和机制通常是被分开对待的,所以我们完全可以为了好玩就去创造一款使用标准扑克牌,却以太空羊驼为主题的游戏。
+
+### 开源美术
+
+如果你去过现代艺术博物馆,你可能会发现自己站在一幅纯蓝色的画布前,无意中听到有人说起老话:“见鬼,这我也能做!”。但事实是,艺术是一项艰巨的工作。创作赏心悦目的艺术品需要付出大量的思考、时间、信心和技巧。这也意味着艺术是你在设计游戏时中最难采购的部分之一。
+
+我有一些“技巧”来解决这个典型难题。
+
+#### 1、寻找同类素材
+
+现在有很多免费、开放的艺术作品,而且大部分质量上佳。问题在于,游戏通常需要不止一件作品。如果你正在设计一款纸牌游戏,你大概至少需要四到六个不同的元素(假设你的纸牌遵循塔罗牌风格),有可能还需要更多。如果你花足够多的时间在这上面,你可以在 [OpenGameArt.org][3]、[FreeSVG.org][4]、[ArtStation.com][5]、[DeviantArt.com][6] 等网站上找到[知识共享和公共领域][2]的艺术作品。
+
+如果你使用的网站没有专门搜索知识共享的功能,输入以下文字到任何搜索引擎当中,`"This work is licensed under a Creative Commons"` 或 `"本工作处于知识共享许可协议之下"`(引号很重要,不要把它们漏了),并用搜索引擎要求的语法,以便将搜索限制到一个具体的站点当中(举个例子,`site:deviantart.com`)。
+
+一旦你有了一个可供挑选素材的艺术库,那就去辨别这些作品的主题,并根据主题分类。两个不同的人拍摄的机器人的照片可能看起来一点都不像,但它们的主题都是机器人。如果提供给你足够多机器人相关的美术素材,你可以围绕机器人这个主题构建你的游戏风格。
+
+#### 2、委托创作知识共享艺术
+
+你可以雇艺术家来为你定制艺术作品。我与使用开源绘画程序(如 [Krita][7] 和 Mypaint)的艺术家一起合作。同时,作为合同的一部分,我规定艺术作品必须在知识共享署名-相同方式许可证(CC BY-SA)下授权。迄今为止,只有一位艺术家因为许可证的限制拒绝了我的提议,并且大多数人都很高兴自己的美术作品有可能有更大的生命力,而不仅仅是作为业余爱好者自己发行的游戏的一部分。
+
+#### 3、创作自己的艺术
+
+就像现代艺术馆之旅展示的那样,艺术是一个非常灵活的词。我发现只要我给自己设定一个目标,也就是我需要为一款游戏创造多少纸牌或令牌,我便能够从 Linux 上的丰富图像创造工具中选择一种去创作。这并不需要什么高难度的东西。就像现代艺术一样,你可以用蓝色和黄色的条纹,或者红色和白色的圆点花纹,或者绿色和紫色的锯齿线来涂一张卡片,只要你能把它们画出来,那么除了你以外,其他人永远不会知道你暗地里把它们当做仙宫里的贵族和小姐。想想看,通过运用图形应用程序,描摹日常物品的照片,重组经典的扑克花色和塔罗牌主题等一系列方式,你可以创造出的简单作品吧。
+
+### 版面设计
+
+我用 [Inkscape][8]、Scribus 或者 [GIMP][9] 来进行版面设计,这取决与我有什么素材以及我追求的设计方式是什么。
+
+对于卡牌,我发现简单的版面设计很容易实现,看上去也更好,纯色比渐变色更容易印刷,还有,直观的图像是最棒的。
+
+![layout in Inkscape][10]
+
+(Seth Kenlon, CC BY-SA 4.0)
+
+我在一个单独的 Inkscape 文件中为我最新的游戏做了版面设计,这个游戏只使用了来自 OpenGameArt.com 上三四个不同艺术家的九张图片。在有着更大的美工集,更好的卡牌多样性的游戏中,我会在游戏中的每一种卡片的文件中为它们设计版面。
+
+在为你的游戏素材做任何版面设计之前,要先了解你的目标输出是什么。如果你打算在家里打印游戏,那就做一些计算,搞清楚默认的纸张大小(有些是 US Letter,或者是 A4)可以容纳多少卡牌、令牌或卡片。如果你使用 [TheGameCrafter][11] 之类的桌游打印机打印,请下载好模板文件。
+
+![printed cards][12]
+
+(Seth Kenlon, CC BY-SA 4.0)
+
+### 游戏机制
+
+游戏机制是游戏中最重要的部分。它们使一款游戏成为游戏。开发游戏规则并不一定是一个正式的过程。你可以一时兴起地创造了一款游戏,可以拿一个现有的游戏重组它的规则,直到它和原来不同,可以修改一款你不喜欢的游戏,也可以将两款不同的游戏组合在一起。从简单容易的地方做起,拿索引卡,标准扑克牌,或塔罗牌去试着模拟你的想象中游戏是如何工作的。你可以自己尝试早期的游戏创意,但最终,让朋友来帮忙是找出意外故障和进行优化的好方法。
+
+经常测试游戏。与不同类型的玩家一起玩游戏,并听取他们的反馈。你的游戏可能会激发许多玩家去创造新的规则和想法,因此要将关于 _哪些搞砸了_ 的反馈与关于 _哪些可以做修改_ 的反馈分开。你不一定要去真的实施这些反馈意见,只需迭代你的想法,但还是要仔细考虑错误报告。
+
+一旦确定了你想要让你的规则如何运作,就把它们写下来,让它们 [简短且容易解析][13]。你定的规则不必说服玩家去玩这款游戏,不必向他们解释策略,你也不必允许玩家重新设置规则,只要告诉玩家为了让游戏玩起来,他们应该采取的步骤就可以了。
+
+最重要的是,考虑一下,将你的规则开源。分享经验是游戏的一切,这其中也应该包括规则。知识共享或开放游戏许可证的规则集合允许其他玩家在你的作品上进行迭代、混合和构建。你永远不会知道,有人可能会因此想出一个你更喜欢的游戏变体!
+
+### 开源游戏
+
+开源不仅仅指的是软件。开源是一种文化现象,自然也适合桌面游戏。花几个晚上的时间来尝试制作游戏。如果你是新手,那就从一些简单的开始,比如下面的这个空白卡牌游戏:
+
+ 1. 找来一些朋友。
+ 2. 给每个人几张空白的索引卡,告诉他们在每张卡片上写一条规则。规则可以是任何东西(“如果你穿着红色衣服,你就赢了”或“第一个站起来的人赢”等等)。
+ 3. 在你自己的索引卡片上,写上 “和”、“但是”、“但是不要”、“而且不要”、“除了”,以及其他的条件短语。
+ 4. 洗牌并将牌发给所有玩家。
+ 5. 每个玩家轮到的时候出一张牌。
+ 6. 最终目标是获胜,但是玩家可以通过出 “和”、“但是”、“或者” 卡片来修改决定胜负的条件。
+
+这是一个有趣的聚会游戏,同时是一份很好的介绍,告诉你如何像游戏设计者一样思考,它帮助你认识到什么适合作为游戏机制,什么不适合。
+
+还有,当然的,这是开源的。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/12/open-source-card-game
+
+作者:[Seth Kenlon][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/seth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rich-smith-unsplash.jpg?itok=uzzS0gRa (Deck of playing cards)
+[2]: https://opensource.com/article/20/1/what-creative-commons
+[3]: https://opensource.com/article/21/12/opengameart.org/
+[4]: http://freesvg.org
+[5]: http://artstation.com
+[6]: http://deviantart.com
+[7]: https://opensource.com/article/21/12/krita-digital-paint
+[8]: https://opensource.com/article/21/12/linux-draw-inkscape
+[9]: https://opensource.com/content/cheat-sheet-gimp
+[10]: https://opensource.com/sites/default/files/inkscape-layout.jpg (Layout in Inkscape)
+[11]: https://www.thegamecrafter.com/
+[12]: https://opensource.com/sites/default/files/cards-printed_0.jpg (Printed cards)
+[13]: https://opensource.com/life/16/11/software-documentation-tabletop-gaming
diff --git a/published/20220113 Learn Rust in 2022.md b/published/20220113 Learn Rust in 2022.md
new file mode 100644
index 0000000000..5995ca8a67
--- /dev/null
+++ b/published/20220113 Learn Rust in 2022.md
@@ -0,0 +1,275 @@
+[#]: subject: "Learn Rust in 2022"
+[#]: via: "https://opensource.com/article/22/1/rust-cheat-sheet"
+[#]: author: "Seth Kenlon https://opensource.com/users/seth"
+[#]: collector: "lujun9972"
+[#]: translator: "hanszhao80"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14563-1.html"
+
+2022 Rust 入门指南
+======
+
+> 如果你打算在今年探索 Rust,请下载我们的免费 Rust 速查表,以供快速参考基础知识。
+
+
+
+Rust 是一门相对较新的编程语言,受到各个企业的 [程序员的欢迎][2]。尽管如此,它仍是一门建立在之前所有事物之上的语言。毕竟,Rust 不是一天做出来的,所以即便 Rust 中的一些概念看起来与你从 Python、Java、C++ 等编程语言学到的东西大不相同,但它们都是基于同一个基础,那就是你一直与之交互(无论你是否知道)的 CPU 和 NUMA(非统一内存访问)架构,因此 Rust 中的一些新功能让人感觉有些熟悉。
+
+现在,我的职业不是程序员。我没耐心但我又有点儿强迫症。当我需要完成某件事时,如果一门语言不能帮助我相对较快地获得想要的结果,那么我很少会受到鼓舞而使用它。Rust 试图平衡两个矛盾:现代计算机对安全和结构化代码的需求,和现代程序员对编码工作事半功倍的渴望。
+
+### 安装 Rust
+
+[rust-lang.org][3] 网站有丰富的的文档指导如何安装 Rust,但通常,它就像下载 `sh.rustup.rs` 脚本并运行它一样简单。
+
+```
+$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs
+$ less sh.rustup.sh
+$ sh ./sh.rustup.rs
+```
+
+### 没有类
+
+Rust 没有类,也不使用 `class` 关键字。Rust 确实有 `struct` 数据类型,但它的作用是充当数据集合的一种模板。因此,你可以使用结构体,而不是创建一个类来表示虚拟对象:
+
+```
+struct Penguin {
+ genus: String,
+ species: String,
+ extinct: bool,
+ classified: u64,
+}
+```
+
+你可以像使用类一样使用它。例如,当定义完 `Penguin` 结构,你就可以创建它的实例,并与该实例进行交互:
+
+```
+struct Penguin {
+ genus: String,
+ species: String,
+ extinct: bool,
+ classified: u64,
+}
+
+fn main() {
+ let p = Penguin { genus: "Pygoscelis".to_owned(),
+ species: "R adeliæ".to_owned(),
+ extinct: false,
+ classified: 1841 };
+
+ println!("Species: {}", p.species);
+ println!("Genus: {}", p.genus);
+ println!("Classified in {}", p.classified);
+ if p.extinct == true {
+ println!("Sadly this penguin has been made extinct.");
+ }
+}
+```
+
+将 `impl` 数据类型与 `struct` 数据类型结合使用,你可以实现一个包含函数的结构体,并且可以添加继承和其他与类相似的特性。
+
+### 函数
+
+Rust 中的函数很像其他语言中的函数。每个函数都代表一组严谨的任务,你可以在需要时调用它们。主函数名必须是 `main`。
+
+用 `fn` 关键字声明函数,后跟函数名称和函数接受的所有参数。
+
+```
+fn foo() {
+ let n = 8;
+ println!("Eight is written as {}", n);
+}
+```
+
+通过参数,将信息从一个函数传递到另一个函数。例如,我已经创建了一个 `Penguin` 类(结构),并且我有一个 `Penguin` 的实例为 `p`,将目标函数的参数指定为 `Penguin` 类型,就可把 `p` 的属性从一个函数传递到另一个函数。
+
+```
+fn main() {
+ let p = Penguin { genus: "Pygoscelis".to_owned(),
+ species: "R adeliæ".to_owned(),
+ extinct: false, classified: 1841 };
+ printer(p);
+}
+
+fn printer(p: Penguin) {
+ println!("Species: {}", p.species);
+ println!("Genus: {}", p.genus);
+ println!("Classified in {}", p.classified);
+ if p.extinct == true {
+ println!("Sadly this penguin has been made extinct.");
+ }
+}
+```
+
+### 变量
+
+Rust 默认创建的为不可变变量。这意味着你创建的变量以后无法更改。这段代码虽然看起来没问题,但无法编译:
+
+```
+fn main() {
+ let n = 6;
+ let n = 5;
+}
+```
+
+但你可以使用关键字 `mut` 声明一个可变变量,因此下面这段代码可以编译成功:
+
+```
+fn main() {
+ let mut n = 6;
+ println!("Value is {}", n);
+ n = 5;
+ println!("Value is {}", n);
+}
+```
+
+### 编译
+
+Rust 编译器,至少就其报错信息而言,是可用的最好的编译器之一。当你在 Rust 中出错时,编译器会真诚地告诉你做错了什么。实际上,仅通过从编译器错误消息中学习,我就了解了 Rust 的许多细微差别(就我理解到的 Rust 的任何细微差别而言)。即便有时错误消息太过于模糊,而不知所以然,互联网搜索几乎总能得到解释。
+
+启动 Rust 程序的最简单方法是使用 `cargo`,它是 Rust 的包管理和构建系统。
+
+```
+$ mkdir myproject
+$ cd myproject
+$ cargo init
+```
+
+以上命令为项目创建了基本的基础架构,最值得注意的是 `src` 子目录中的 `main.rs` 文件。打开此文件,把我为本文生成的示例代码粘贴进去:
+
+```
+struct Penguin {
+ genus: String,
+ species: String,
+ extinct: bool,
+ classified: u64,
+}
+
+fn main() {
+ let p = Penguin { genus: "Pygoscelis".to_owned(), species: "R adeliæ".to_owned(), extinct: false, classified: 1841 };
+ printer(p);
+ foo();
+}
+
+fn printer(p: Penguin) {
+ println!("Species: {}", p.species);
+ println!("Genus: {}", p.genus);
+ println!("Classified in {}", p.classified);
+ if p.extinct == true {
+ println!("Sadly this penguin has been made extinct.");
+ }
+}
+
+fn foo() {
+ let mut n = 6;
+ println!("Value is {}", n);
+ n = 8;
+ println!("Eight is written as {}", n);
+}
+```
+
+使用 `cargo build` 命令进行编译:
+
+```
+$ cargo build
+```
+
+执行 `target` 子目录下的二进制程序,或者直接运行 `cargo run` 命令来运行你的项目:
+
+```
+$ cargo run
+Species: R adeliæ
+Genus: Pygoscelis
+Classified in 1841
+Value is 6
+Eight is written as 8
+```
+
+### Crates
+
+任何语言的大部分便利都来自于它的库或模块。在 Rust 中,进行分发和跟踪的库称为 “crate”(箱子)。[crates.io][4] 是一个很好的社区 crate 注册网站。
+
+把一个 crate 添加到你的 Rust 项目,首先要在 `Cargo.toml` 文件中添加这个 crate。例如,要安装随机数函数,我使用名为 `rand` 的 crate,使用 `*` 作为通配符,以确保在编译时获得最新版本:
+
+```
+[package]
+name = "myproject"
+version = "0.1.0"
+authors = ["Seth "]
+edition = "2022"
+
+[dependencies]
+rand = "*"
+```
+
+在 Rust 代码中使用它需要在最顶行使用 `use` 语句:
+
+```
+use rand::Rng;
+```
+
+以下是一些创建随机种子和随机范围的示例代码:
+
+```
+fn foo() {
+ let mut rng = rand::thread_rng();
+ let mut n = rng.gen_range(1..99);
+
+ println!("Value is {}", n);
+ n = rng.gen_range(1..99);
+ println!("Value is {}", n);
+}
+```
+
+你可以使用 `cargo run` 来运行它,它会检测代码是否被更改并触发一个新的构建。构建过程中下载名为 `rand` 的 `crete` 和它依赖的所有 `crate`,编译代码,然后运行它:
+
+```
+$ cargo run
+Updating crates.io index
+Downloaded ppv-lite86 v0.2.16
+Downloaded 1 crate (22.2 KB) in 1.40s
+ Compiling libc v0.2.112
+ Compiling cfg-if v1.0.0
+ Compiling ppv-lite86 v0.2.16
+ Compiling getrandom v0.2.3
+ Compiling rand_core v0.6.3
+ Compiling rand_chacha v0.3.1
+ Compiling rand v0.8.4
+ Compiling rustpenguin v0.1.0 (/home/sek/Demo/rustpenguin)
+ Finished dev [unoptimized + debuginfo] target(s) in 13.97s
+ Running `target/debug/rustpenguin`
+
+Species: R adeliæ
+Genus: Pygoscelis
+Classified in 1841
+Value is 70
+Value is 35
+```
+
+### Rust 速查表
+
+Rust 是一门令人非常愉快的语言。集成了在线注册网站、有用的编译器和几乎直观的语法,它给人的适当的现代感。
+
+但请不要误会,Rust 仍是一门复杂的语言,它具有严格的数据类型、强作用域变量和许多内置方法。Rust 值得一看,如果你要探索它,那么你应该下载我们的免费 [Rust 速查表][6],以便快速了解基础知识。越早开始,就越早了解 Rust。当然,你应该经常练习以避免生疏。
+
+> **[Rust 速查表][6]**
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/22/1/rust-cheat-sheet
+
+作者:[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/coverimage_cheat_sheet.png?itok=lYkNKieP (Cheat Sheet cover image)
+[2]: https://opensource.com/article/20/5/rust-java
+[3]: http://rust-lang.org
+[4]: https://crates.io/
+[5]: mailto:seth@opensource.com
+[6]: https://opensource.com/downloads/rust-cheat-sheet
diff --git a/published/20220219 Crop and resize photos on Linux with Gwenview.md b/published/20220219 Crop and resize photos on Linux with Gwenview.md
new file mode 100644
index 0000000000..861d6da3c5
--- /dev/null
+++ b/published/20220219 Crop and resize photos on Linux with Gwenview.md
@@ -0,0 +1,120 @@
+[#]: subject: "Crop and resize photos on Linux with Gwenview"
+[#]: via: "https://opensource.com/article/22/2/crop-resize-photos-gwenview-kde"
+[#]: author: "Seth Kenlon https://opensource.com/users/seth"
+[#]: collector: "lujun9972"
+[#]: translator: "geekpi"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14550-1.html"
+
+用 Gwenview 在 Linux 上裁剪和调整照片大小
+======
+
+> Gwenview 是一个优秀的照片编辑器,适合业余摄影师在 Linux KDE 桌面上使用。
+
+
+
+一张好的照片可以蕴含很多信息。表面上它表达了你所看到的,但它也讲述了你所经历的。细微之处也能说明很多问题:你在拍照时选择的角度、取景中隐约可见的的东西有多大,以及,相比之下,那些有意识选择忽略的部分。
+
+照片通常并不意味着记录真实发生的事情,相反,它们会成为你(摄影师)如何看待发生的事情的洞察力。
+
+这就是照片编辑如此普遍的原因之一。当你把照片发布到你的在线图片库或社交网络时,你不应该发布一张不能准确表达照片所包含的感受的照片。但同样的道理,你也不应该成为一个专业的照片合成师,而只是为了剪掉在最后时刻将头伸进你的家庭快照的路人。如果你使用的是 KDE,你可以使用 Gwenview 这种休闲照片编辑器。
+
+### 在 Linux 上安装 Gwenview
+
+如果你正在运行 KDE Plasma 桌面,你可能已经安装了 Gwenview。如果你没有安装,或者你正在使用一个不同的桌面,而你想尝试 Gwenview,那么你可以用你的软件包管理器安装它。
+
+我建议同时安装 Gwenview 和 Kipi 插件集,它可以将 Gwenview 与几个在线照片服务连接起来,这样你就可以轻松上传照片。在 Fedora、Mageia 和类似发行版上:
+
+```
+$ sudo dnf install gwenview kipi-plugins
+```
+
+在 Debian、Elementary 和类似版本上:
+
+```
+$ sudo apt install gwenview kipi-plugins
+```
+
+### 使用 Gwenview
+
+Gwenview 通常有两种启动方式。你可以在 Dolphin 中点击图片文件,并选择在 Gwenview 中打开它;或者你可以启动 Gwenview,并在文件夹中寻找照片,Gwenview 或多或少可以充当你的文件管理器。第一种方法是直接的方法,很适合快速方便地预览图片文件。第二种方法是当你浏览大量照片,不确定哪一个版本的照片是“正确的”时,你可能会使用。
+
+无论你如何启动 Gwenview,界面和功能都是一样的:右边有一个工作区,左边有一个面板。
+
+![Gwenview][2]
+
+(Seth Kenlon [CC BY-SA 4.0][3], Photo courtesy [Andrea De Santis][4])
+
+在左边的面板下面,有三个标签:
+
+ * 文件夹:显示你电脑上的文件夹的树状视图,以便你可以浏览你的文件,寻找更多的照片。
+ * 信息:提供关于你目前正在查看的照片的元数据。
+ * 操作:允许你对当前的照片进行小的修改,如在横向和纵向之间旋转、调整大小和裁剪等。
+
+Gwenview 能理解文件系统,所以你可以按键盘上的**右**或**左**箭头,查看文件夹中的上一张或下一张照片。
+
+要离开单张照片视图并查看一个文件夹中的所有图片,请点击顶部工具栏中的“浏览”按钮。
+
+![Browsing photos in a folder][5]
+
+(Seth Kenlon,[CC BY-SA 4.0][3])
+
+你也可以同时拥有两种视图。点击 Gwenview 底部的“缩略图栏”按钮,可以以电影胶片的形式看到当前文件夹中的其他图片,而当前选择的照片则在主面板中。
+
+![Thumbnail view][6]
+
+(Seth Kenlon,[CC BY-SA 4.0][3])
+
+### 用 Gwenview 编辑照片
+
+数码照片是很常见的,因此在网上发布或与朋友分享之前,需要对照片进行细微的调整也是同样常见。有非常好的应用可以编辑照片,事实上,其中最好的一个是另一个 KDE 应用,叫做 Krita(你可以在我的 [给摄影者的 Krita][7] 文章中阅读我如何使用它来处理照片),但是小的调整不应该需要艺术学位。这正是 Gwenview 所确保的:用一个休闲但功能强大的应用进行简单而快速的照片调整,并与你的 Plasma 桌面的其他部分整合。
+
+我们大多数人对照片进行的最常见的调整是:
+
+ * **旋转**:当你的相机没有提供正确的元数据让你的电脑知道一张照片是要以横向还是纵向观看时,你可以手动修复它。
+ * **镜像**:许多笔记本电脑或面部摄像头模仿镜子,这很有用,因为这是我们习惯于看到自己的方式。但是,它会使文字逆转。**镜像**功能可以从右到左翻转图像。
+ * **翻转**:在数码相机和笔记本电脑上不太常见,但在手机上,无论你怎么拿手机,使用倒置设备拍照的现象在屏幕翻转的手机中并不少见。**翻转**功能可将图像旋转 180 度。
+ * **调整大小**:数字图像现在通常具有超高清尺寸,有时这比你需要的要多得多。如果你通过电子邮件发送照片或将其发布在你想要优化加载时间的网页上,你可以将尺寸(和相应的文件大小)缩小到更小的尺寸。
+ * **裁剪**:你有一张很棒的自己的照片,但不小心偶然发现了一个你认为不合适的人。用裁剪工具剪掉你不想要的所有东西。
+ * **红眼**:当你的视网膜将相机的闪光灯反射回相机时,会得到红眼效果。Gwenview 可以通过在可调节区域中对红色通道进行去饱和和变暗来减少这种情况。
+
+所有这些工具都在“操作”侧面板或“编辑”菜单中可用。这些操作具有破坏性,因此在你进行更改后,单击“另存为”以保存图像的 _副本_。
+
+![Cropping a photo in Gwenview][8]
+
+(Seth Kenlon,[CC BY-SA 4.0][3],照片由 [Elise Wilcox][9] 提供)
+
+### 分享照片
+
+当你准备好分享照片时,单击顶部工具栏中的“分享”按钮,或转到“插件”菜单并选择“导出”。Gwenview 与 Kipi 插件集成在一起,可以在 [Nextcloud][10]、[Piwigo][11]、普通旧电子邮件以及 Google Drive、Flickr、Dropbox 等服务共享照片。
+
+### Linux 上的照片编辑要点
+
+Gwenview 拥有桌面照片管理器的所有必需功能。如果你需要的不仅仅是基本功能,你可以在 Krita 或 [Digikam][12] 中打开一张照片,并根据需要进行重大修改。对于其他一切,从浏览、排名、标记和小调整,Gwenview 都很方便。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/22/2/crop-resize-photos-gwenview-kde
+
+作者:[Seth Kenlon][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/seth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/design_photo_art_polaroids.png?itok=SqPLgWxJ (Polaroids and palm trees)
+[2]: https://opensource.com/sites/default/files/kde-gwenview-ui.jpg (Gwenview)
+[3]: https://creativecommons.org/licenses/by-sa/4.0/
+[4]: http://unsplash.com/@santesson89
+[5]: https://opensource.com/sites/default/files/kde-gwenview-browse.jpg (Browsing photos in a folder)
+[6]: https://opensource.com/sites/default/files/kde-gwenview-thumbnail.jpg (Thumbnail view)
+[7]: https://opensource.com/article/21/12/open-source-photo-editing-krita
+[8]: https://opensource.com/sites/default/files/kde-gwenview-crop.jpg (Cropping a photo in Gwenview)
+[9]: http://unsplash.com/@elise_outside
+[10]: https://opensource.com/article/20/7/nextcloud
+[11]: https://opensource.com/alternatives/google-photos
+[12]: https://opensource.com/life/16/5/how-use-digikam-photo-management
diff --git a/translated/tech/20220327 Top 10 Linux Distributions for Programmers in 2022 -Featured.md b/published/20220327 Top 10 Linux Distributions for Programmers in 2022 -Featured.md
similarity index 77%
rename from translated/tech/20220327 Top 10 Linux Distributions for Programmers in 2022 -Featured.md
rename to published/20220327 Top 10 Linux Distributions for Programmers in 2022 -Featured.md
index e3bfccf76e..e2caf8ed1d 100644
--- a/translated/tech/20220327 Top 10 Linux Distributions for Programmers in 2022 -Featured.md
+++ b/published/20220327 Top 10 Linux Distributions for Programmers in 2022 -Featured.md
@@ -3,42 +3,43 @@
[#]: author: "Arindam https://www.debugpoint.com/author/admin1/"
[#]: collector: "lujun9972"
[#]: translator: "aREversez"
-[#]: reviewer: " "
-[#]: publisher: " "
-[#]: url: " "
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14547-1.html"
-2022 最适合程序员的 10 款 Linux 发行版 [精选]
+最适合程序员的 10 款 Linux 发行版
======
-我们为程序员和开发人员总结了 2022 年最好用的 10 款 Linux 发行版,以便他们开展日常工作和个人项目。由于工作和项目需要,程序员和开发人员会用到各种工具和应用,包括代码编辑器、编译器、插件以及数据库等等。若对现代开发人员的工作流程做一番整理,一般流程如下:
+
+
+
+> 我们为程序员和开发人员总结了 2022 年最好用的 10 款 Linux 发行版,以便他们开展日常工作和个人项目。
+
+由于工作和项目需要,程序员和开发人员会用到各种工具和应用,包括代码编辑器、编译器、插件以及数据库等等。若对现代开发人员的工作流程做一番整理,一般流程如下:
- 创建代码仓库
- 编程
- 调试
- 测试
- - 配置
-
-
+ - 部署
上述工作流程需要用到各种各样的工具,一份标准的工具清单如下:
- 代码编辑器
- 简单的文本编辑器
- - 网络浏览器(包括 web 开发人员使用的各种浏览器)
+ - 网页浏览器(包括 Web 开发人员使用的各种浏览器)
- 数据库引擎
- 本地服务器
- 各类编程语言的编译器
- - 调试程序
+ - 调试器
- 监视或分析工具(客户端或者网页端)
-
-
与 Windows 相比,Linux 可以说是编程的最佳平台。之所以这样说,主要是因为 Linux 发行版与 Windows 不同,预装了许多功能强大的包和软件,自行安装也比较容易。在本文中,考虑到一些原因,我不会将 macOS 纳入对比范围之内。
综上,本文将整理出 2022 年最适合程序员的 10 款 Linux 发行版。
### 2022 最适合程序员的 10 款 Linux 发行版
-#### 1、Fedora Workstation
+#### 1、Fedora 工作站
![Fedora 35 Workstation][1]
@@ -46,29 +47,29 @@
Fedora Linux 默认安装了开箱即用的主流开发软件包,包括 PHP、OpenJDK、PostgreSQL、Django、Ruby on Rails 以及 Ansible 等等。
-dnf 是 Fedora Linux 的包管理器,有了它,安装代码编辑器以及其他软件就相当容易了。此外,你还可以使用应用商店 Software 一键搜索、安装软件。
+dnf 是 Fedora Linux 的包管理器,有了它,安装代码编辑器以及其他软件就相当容易了。此外,你还可以使用“软件”应用商店一键搜索、安装软件。
-Fedora Linux 支持 Snap 和 Flatpak,使用起来会更加灵活方便。你还可以使用 RPM Fusion 仓库,获取大量免费或收费的软件。因为许可证等一些原因, Fedora Linux 不希望一些包储存在其主仓库内,于是就有了 RPM Fusion。
+Fedora Linux 支持 Snap 和 Flatpak,使用起来会更加灵活方便。你还可以使用 RPM Fusion 仓库,获取大量自由或非自由的软件。因为许可证等一些原因,Fedora Linux 不希望在其主仓库内包括这些包,于是就有了 RPM Fusion。
点击下方链接,了解 Fedora Linux 最新版本。
-[下载 Fedora][2]
+> **[下载 Fedora][2]**
#### 2、Ubuntu Linux
![Ubuntu Desktop is a perfect Linux Distribution for Programmers.][3]
-在今天,无论是服务器还是个人电脑,使用最为广泛的发行版当属 Ubuntu Linux。Ubuntu 提供长期支持版本,每个长期支持版本的官方支持年限为五年(外加五年的维护支持),每年为高级用户提供两个短期版本。
+在今天,无论是服务器还是个人电脑,使用最为广泛的发行版当属 Ubuntu Linux。Ubuntu 提供长期支持版本,每个长期支持版本官方提供五年的支持(外加五年的维护支持),并且每年为高级用户提供两个短期版本。
由于 Ubuntu 非常流行,各种包与软件的供应商都会提供适用于 Ubuntu 的版本(.deb)。此外,得益于广泛的知名度,Ubuntu 有着更为庞大的论坛群体和更为丰富的帮助文档。所以说,Ubuntu 是开发人员的最佳之选,尤其是在开发过程中陷入难题的时候,Ubuntu 更能发挥其作用。点击下方链接,了解更多。
-[下载 Ubuntu][4]
+> **[下载 Ubuntu][4]**
#### 3、openSUSE
-openSUSE 是最稳定、最专业的 Linux 发行版之一,是企业界(包括个人电脑、服务器以及瘦客户机)的首选解决方案。openSUSE 作为关键系统,在世界范围内得到了广泛应用。
+openSUSE 是用在全球关键系统中最稳定、最专业的 Linux 发行版之一,是企业界(包括个人电脑、服务器以及瘦客户机)的首选解决方案。
-相较于 Ubuntu 和 Fedora,openSUSE 具有一些独特的优势。首先,openSUSE 有两个版本:Leap 和 Tumbleweed。其中,openSUSE Leap 属于长期支持版,为用户带来稳定的升级体验。openSUSE Tumbleweed 属于滚动发行版,有着最新、最强大的软件包。
+相较于 Ubuntu 和 Fedora,openSUSE 具有一些独特的优势。首先,openSUSE 有两个版本:Leap 和 Tumbleweed。其中,openSUSE Leap 属于长期支持版,为用户带来稳定的升级体验。openSUSE Tumbleweed 属于滚动发行版,有着最新、最尖端的软件包。
如果你想获得最新的包和硬件支持,助力开发工作,你可以选择 openSUSE Tumbleweed;如果你想要的是稳定性,无需频繁维护即可长期运行,openSUSE Leap 会更适合你。
@@ -78,7 +79,7 @@ openSUSE 是最稳定、最专业的 Linux 发行版之一,是企业界(包
如果你有一些 Linux 发行版的使用经验,推荐选择 openSUSE 进行开发工作。
-[下载 openSUSE][5]
+> **[下载 openSUSE][5]**
#### 4、Manjaro Linux
@@ -86,25 +87,21 @@ Manjaro Linux 基于 Arch Linux,不过安装起来更容易一些。Manjaro Li
如果你想使用 Arch Linux 及其滚动发行的软件包来满足开发需求,但又不想在安装原版 Arch 上来回折腾,Manjaro 绝对是你的最佳选择。
-[下载 Manjaro][6]
+> **[下载 Manjaro][6]**
#### 5、Arch Linux
-尽管有 Manjaro 以及其他基于 Arch Linux 的发行版,而且安装操作非常简单,你可能还是想在自己的定制电脑上折腾一番,亲自动手[安装原版 Arch][7]。
+尽管有 Manjaro 以及其他基于 Arch Linux 的发行版,而且安装操作非常简单,你可能还是想在自己的定制电脑上折腾一番,亲自动手 [安装原版 Arch][7]。
不过这种选择更适合程序员和开发人员,因为他们想得到更多的掌控权,或者想要定制一个 Linux 操作系统,用于开发项目或满足开发需求。这样一来,他们可能就会安装 Arch Linux,选择自己最喜欢的桌面,设置专用于开发工作的操作系统。
-[][8]
-
-推荐阅读:[Nitrux 最佳 Maui 应用程序][24]
-
假设你对 Arch Linux 和普通的电脑都比较熟悉,那么 Arch Linux 就是你的最佳选择,因为在自己定制的 Linux 操作系统上,你可以完全控制每一个软件包。
-[下载 Arch Linux][9]
+> **[下载 Arch Linux][9]**
#### 6、Pop OS
-Pop OS(即 Pop!_OS)由电脑制造商 System76 针对其系列硬件开发,是一款基于 Ubuntu 的免费开源发行版。发行周期与 Ubuntu 保持同步,并为用户提供了额外的调整工具和软件包。
+Pop OS(即 Pop!_OS)由电脑制造商 System76 针对其系列硬件开发,是一款基于 Ubuntu 的自由开源的发行版。发行周期与 Ubuntu 保持同步,并为用户提供了额外的调整工具和软件包。
![Pop OS 21.10 Desktop][10]
@@ -114,7 +111,7 @@ Pop OS 基于 Ubuntu,默认支持多种程序语言,所以非常适合程序
如果你既想要基于 Ubuntu,又想要适合程序员的稳定 Linux 发行版,推荐选择 Pop OS。
-[下载 POP OS][11]
+> **[下载 POP OS][11]**
#### 7、KDE Neon
@@ -124,17 +121,17 @@ KDE Neon 基于 Ubuntu 长期支持版本,兼具最新的 KDE Plasma 桌面和
运行速度快,程序开箱即用,用户界面友好,广泛的社区支持,如你所愿,完美如斯。
-[下载 KDE Neon][12]
+> **[下载 KDE Neon][12]**
#### 8、Debian
-Debian GUN/Linux 就无需过多介绍了。Debian 的稳定分支是 Ubuntu 及其衍生系统的基础。换句话说,Debian 是最基本、最稳定的 Linux 发行版。优秀的稳定性和较长的支持时间使得 Debian 非常适合用做开发环境。
+Debian GUN/Linux 就无需过多介绍了。Debian 的稳定分支是 Ubuntu 及其衍生系统的基础。换句话说,Debian 是最主要、最稳定的 Linux 发行版之一。优秀的稳定性和较长的支持时间使得 Debian 非常适合用做开发环境。
-不过,Debian 的稳定分支比较保守,很少使用最新的软件包。毕竟全世界都依赖 Debian 的稳定运行,所以维护者在检查、合并软件包时必须十分谨慎。
+不过,Debian 的稳定分支比较保守,很少使用最新的软件包。毕竟全世界(几乎)都依赖 Debian 的稳定运行,所以维护者在检查、合并软件包时必须十分谨慎。
Debian 不仅能够长期稳定运行,而且维护成本较低,是高级用户和系统管理员绝佳的编程环境。
-[下载 Debian Linux][13]
+> **[下载 Debian Linux][13]**
#### 9、Kali Linux
@@ -142,7 +139,7 @@ Kali Linux 由 Offensive Security 开发,服务对象为道德黑客和查找
对技术娴熟的程序员和开发人员来说,Kali Linux 堪称最佳之选。如果你精通 Linux,具备解决错误和依赖问题的经验,推荐选择 Kali Linux。
-[下载 Kali Linux][14]
+> **[下载 Kali Linux][14]**
#### 10、Fedora Labs
@@ -150,7 +147,9 @@ Kali Linux 由 Offensive Security 开发,服务对象为道德黑客和查找
Fedora Labs 为程序员、科学家、学生等各类人群提供各类专业化的 Linux 发行版,内置各类专业软件、包和工具。很多人并没有意识到 Fedora Labs 的优势,只要经过适当的配置,这些版本都是非常优秀的发行版。
-我们来总结一下这些 Fedora Labs。
+我们来总结一下这些 Fedora Labs:
+
+Fedora Scientific:
* 采用 KDE Plasma 桌面,集成科学和数学领域的各种开源工具
* 软件清单如下:
@@ -161,16 +160,20 @@ Fedora Labs 为程序员、科学家、学生等各类人群提供各类专业
* Pandas:用于数据处理的 Python 库
* IPython
* Java 和 R 程序语言相关包
- * 了解更多,请点击 [下载 Fedora Scientific][15]
+> **[下载 Fedora Scientific][15]**
- * 采用 GNOME 桌面环境,预装神经科学领域的各种开源包和应用。了解更多,请点击 [下载 Comp Neuro][25]
+Fedora COMP NEURO:
+ * 采用 GNOME 桌面环境,预装神经科学领域的各种开源包和应用。
+
+> **[下载 Comp Neuro][25]**
+
+Fedora Robotics Suite:
* 集成各种开源机器人技术包和软件,适合初学者、资深计算机科学家和编程人员。
- * 了解更多,[下载 Fedora Robotics][16].
-
+> **[下载 Fedora Robotics][16]**
除了上述版本,还有 [Fedora Security Labs][17]、[Fedora Astronomy][18] 和 [Fedora Python Classroom][19] 可供选择。
@@ -180,9 +183,7 @@ Fedora Labs 为程序员、科学家、学生等各类人群提供各类专业
那么,怎样才能从以上 10 款 最适合程序员的 Linux 发行版中选出自己最喜欢的呢?
-如果你想要一款开发系统,但又不想耗费太多精力,拿不定主意的话,推荐使用 Fedora Workstation 或者 Ubuntu。
-
-If you have spare time or want more control in your system, like experimenting and being comfortable with occasional errors, then go for Arch Linux based systems.
+如果你想要一款开发系统,但又不想耗费太多精力,拿不定主意的话,推荐使用 Fedora 工作站或者 Ubuntu。
如果你的空闲时间比较多或者想要进一步掌控自己的系统,乐于尝试并且能够忍受偶尔发生的错误,推荐选择基于 Arch Linux 的系统。
@@ -192,10 +193,6 @@ If you have spare time or want more control in your system, like experimenting a
祝你好运!
-* * *
-
-我们分享最新的技术、软件等重要新闻资讯,关注我们的 [Telegram][20]、[Twitter][21]、[YouTube][22] 和 [Facebook][23],不要错过最新内容!
-
--------------------------------------------------------------------------------
via: https://www.debugpoint.com/2022/03/top-linux-distributions-programmers-2022/
@@ -203,7 +200,7 @@ via: https://www.debugpoint.com/2022/03/top-linux-distributions-programmers-2022
作者:[Arindam][a]
选题:[lujun9972][b]
译者:[aREversez](https://github.com/aREversez)
-校对:[校对者ID](https://github.com/校对者ID)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/published/20220414 A guide to JVM parameters for Java developers.md b/published/20220414 A guide to JVM parameters for Java developers.md
new file mode 100644
index 0000000000..bc2cceb4e2
--- /dev/null
+++ b/published/20220414 A guide to JVM parameters for Java developers.md
@@ -0,0 +1,224 @@
+[#]: subject: "A guide to JVM parameters for Java developers"
+[#]: via: "https://opensource.com/article/22/4/jvm-parameters-java-developers"
+[#]: author: "Jayashree Huttanagoudar https://opensource.com/users/jayashree-huttanagoudar"
+[#]: collector: "lkxed"
+[#]: translator: "Veryzzj"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14553-1.html"
+
+面向 Java 开发人员的 JVM 参数指南
+======
+
+
+
+> 通过理解和使用 JVM 以及 JVM 参数,开发人员和最终用户都可以诊断故障并且提高 Java 应用程序的性能。
+
+当你在编写源代码时,你是在编写人类可以阅读的代码。在将代码编译成机器语言之前,计算机无法执行它。机器语言是一个通用术语,指的是特定机器所需的任意数量的语言。通常,如果你在 Linux 上编译代码,它只能 Linux 上运行;如果你在 Windows 上编译代码,它就只在 Windows 上运行。但是,Java 是不同的,它并不以真实的机器为目标,而是面向 Java 虚拟机(JVM)。因此,它可以在任何机器上运行。
+
+Java 源代码被编译成字节码,然后由安装在计算机上的 JVM 运行。JVM 是一个执行引擎,但我们通常不会直接与它交互。它在后台静默运行,替我们处理 Java 字节码。大多数人不需要考虑,甚至也不需要知道 JVM。但是,了解它的工作原理是对我们来说是非常有用的,因为这会有助于我们调试和优化 Java 代码。例如:
+
+* 在生产环境中,你发现已经部署的应用程序可能需要提升性能。
+* 如果你写的应用程序出错了,开发人员和最终用户都可以选择对问题进行调试。
+* 如果你想了解关于 JDK(即 Java 开发工具包,用于开发/运行 Java 应用程序)的详细信息,你可以通过查询 JVM 来获取。
+
+本文介绍了一些基础的 JVM 参数,希望在这些场景中可以提供帮助。
+
+![JVM 参数][2]
+
+(图源:Jayashree Huttanagoudar,CC BY-SA 4.0)
+
+### JVM、JDK 和 JRE 有什么不同?
+
+Java 有许多 J 开头的缩略词,包括 JVM、JDK 和 JRE。
+
+* Java 开发工具包(JDK)可供需要在代码中使用开发库的程序员使用。
+* Java 运行时环境(JRE)可供想运行 Java 应用程序的人使用。
+* Java 虚拟机(JVM)是运行 Java 字节码的组件。
+
+JDK 同时包含 JRE 和 JVM,但有些 Java 发行版提供了包含 JRE(包括 JVM)的替代下载。
+
+![JDK][3]
+
+(图源:Jayashree Huttanagoudar,CC BY-SA 4.0)
+
+Java 是开源的,因此,许多不同的公司都会构建和发行他们自己的 JDK 发行版。你可以在系统上安装多个 JDK,这会对你参与或者运行不同的 Java 项目时很有帮助,因为其中一些项目可能使用旧版本的 JDK。
+
+你可以使用 `alternatives` 命令,来查看 Linux 系统上的 JDK 列表:
+
+```
+$ alternatives --config java
+There are 2 programs that provide java.
+Selection Command
+-----------------------------------------------
+*+ 1 java-11-openjdk.x86_64 (/usr/lib/jvm/java-11-openjdk-11.0.13.0.8-2.fc35.x86_64/bin/java)
+2 java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-2.fc35.x86_64/jre/bin/java)
+
+Enter to keep the current selection[+], or type selection number:
+```
+
+如果想要在可用的 JDK 之间进行切换,请再次执行该命令:
+
+```
+$ sudo alternatives --config java
+```
+
+或者可以使用 [SDKMan][4],它可以下载、更新和管理系统中的所有 JDK。
+
+### 什么是 JVM 调优?
+
+JVM 调优指的是,通过调整 JVM 参数,来提高 Java 应用程序性能的过程,它还有助于诊断应用程序的故障。
+
+通常情况下,在调试之前需要考虑以下几点:
+
+* **成本**:有时改进运行代码的硬件可以提高应用程序的性能。这可能看起来像是在“作弊”,但请考虑你愿意花多少时间调整 JVM 参数。有时应用程序需要更多的内存来执行所需的功能,而这点是任何软件技术都无法改变的。
+* **期望结果**:长期来看,稳定性比性能更重要。如果你的调优对稳定性产生了影响,那么谨慎地选择你的调优参数可能会更好。
+* **底层问题**:有时,问题可能是主机操作系统的底层问题。那么,在调整 JVM 之前,请确保 JVM 平台按预期工作。
+* **内存泄漏**:如果你在使用垃圾回收(GC)调优参数,那么,应用程序代码中很可能会存在需要修复的内存泄漏。
+
+### 参数类型
+
+JVM 参数可以分为以下三类:标准参数、非标准参数和高级选项。
+
+#### 标准参数
+
+所有的 JVM 实现都支持标准参数,在终端执行 `java` 命令来查看标准参数列表:
+
+```
+$ java
+Usage: java [options] [args...]
+ (to execute a class)
+ or java [options] -jar [args...]
+ (to execute a jar file)
+
+ where options include:
+
+ -cp
+ -classpath
+ --class-path
+ A : separated list of directories, JAR archives,
+ and ZIP archives to search for class files.
+ --enable-preview
+ allow classes to depend on preview features of this release
+
+To specify an argument for a long option, you can use --= or
+-- .
+```
+
+这些是所有 JVM 都会包含的标准参数,你可以像使用任何 [命令行选项][5] 一样安全地使用它们。例如,要验证配置的命令选项,创建 VM 并加载主类而不执行主类,请使用:
+
+```
+$ java --dry-run
+```
+
+#### 非标准参数
+
+非标准选项以 `-X` 开头。这些是通用的,并且特定于 JVM 的特定实现。要列出这些参数,请输入:
+
+```
+$ java -X
+-Xbatch disable background compilation
+-Xbootclasspath/a:
+append to end of bootstrap class path
+-Xinternalversion
+displays more detailed JVM version information than the
+-version option
+-Xloggc: log GC status to a file with time stamps
+[...]
+```
+
+在这些参数可能会不经通知就发生变化。而且,并非所有 JVM 实现都支持这些参数。
+
+微软构建的 JVM 可能与 RedHat 构建的 JVM 有不同的参数,诸如此类。
+
+要获取详细的 JVM 版本信息,请使用如下命令:
+
+```
+$ java -Xinternalversion --version
+OpenJDK 64-Bit Server VM (11.0.13+8) for linux-amd64 JRE (11.0.13+8), built on Nov 8 2021 00:00:00 by "mockbuild" with gcc 11.2.1 20210728 (Red Hat 11.2.1-1)
+```
+
+要获取这些属性设置,请使用:
+
+```
+$ java -XshowSettings:properties --version
+```
+
+#### 高级选项
+
+这些参数不是随意使用的,而是用于调整 Hotspot VM 的特定区域。这些参数可能会发生变化,并且不能保证得到所有 JVM 实现的支持。
+
+这些参数以 `-XX` 开头。如需列出参数列表,使用如下命令:
+
+```
+$ java -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal -version
+```
+
+例如,需要跟踪类的加载,那么使用下面的命令:
+
+```
+$ java -XX:+TraceClassLoading Hello
+```
+
+在 `Hello.java` 中:
+
+```
+public class Hello {
+ public static void main(String[] args) {
+ System.out.println("Inside Hello World!");
+ }
+}
+```
+
+另一个可能会面临的问题是 OOM(内存超出)错误,它发生的时候可能没有太多的调试信息。为了解决这个问题,使用调试参数 `-XX:+HeapDumpOnOutOfMemoryError`,它可以创建一个带有调试信息的 `.hprof` 文件。
+
+```
+// TestClass.java
+import java.util.ArrayList;
+import java.util.List;
+
+public class TestClass {
+ public static void main(String[] args) {
+ List