-o fonts/Bangers-Regular.ttf
+$ curl -sSL https://github.com/google/fonts/raw/master/ofl/bangers/Bangers-Regular.ttf -o fonts/Bangers-Regular.ttf
```
-### 创建一个 Pi Day 倒计时器
+### 创建一个圆周率日倒计时器
-现在你已经安装好了软件,可以使用带有炫酷字体的 ePaper 显示器了。你可以创建一个有趣的项目:倒计时到下一个 Pi Day !
+现在你已经安装好了软件,可以使用带有炫酷字体的电子纸显示屏了。你可以创建一个有趣的项目:倒计时到下一个圆周率日!
-如果你想,你可以从该项目的 [GitHub repo][13] 直接下载 [countdown.py][12] 这个 Python 文件并跳到文章结尾。
+如果你想,你可以从该项目的 [GitHub 仓库][13] 直接下载 [countdown.py][12] 这个 Python 文件并跳到文章结尾。
为了满足大家的好奇心,我将逐步讲解。
#### 导入一些库
-
```
#!/usr/bin/python3
# -*- coding:utf-8 -*-
@@ -134,11 +130,11 @@ waveshare_base = basedir.joinpath('e-Paper', 'RaspberryPi_JetsonNano', 'python')
libdir = waveshare_base.joinpath('lib')
```
-开始先导入一些标准库之后脚本中用。也需要你添加一些 PIL 的包: `Image`, `ImageDraw` ,和 `ImageFont` ,你会 用到这些包来画一些简单的图形。最后,为包含用于 2.13 英寸显示器的 Waveshare Python 库的本地 `lib` 目录设置一些变量,稍后你可以使用这些变量从本地目录加载库。
+开始先导入一些标准库之后脚本中用。也需要你从 PIL 添加 `Image`、`ImageDraw` 和 `ImageFont`,你会用到这些来画一些简单的图形。最后,为本地 `lib` 目录设置一些变量,该目录包含了用于 2.13 英寸显示屏的 Waveshare Python 库,稍后你可以使用这些变量从本地目录加载库。
#### 字体大小辅助函数
-下一部分是为你选择的字体建立一个修改大小的辅助函数: Bangers-Regular.ttf 。该函数将整型变量作为大小参数并返回一个图形字体对象来用于显示:
+下一部分是为你选择的 Bangers-Regular.ttf 字体建立一个修改大小的辅助函数。该函数将整型变量作为大小参数,并返回一个图形字体对象来用于显示:
```
def set_font_size(font_size):
@@ -148,15 +144,14 @@ def set_font_size(font_size):
#### 倒计时逻辑
-接下来是计算这个项目的一个函数:距下次 Pi Day 还有多久。如果 Pi Day 在一月,那么计算剩余天数将很简单。但是你需要考虑是否今年的 Pi Day 这一天已经过去了。如果是这样的话,那么计算量将会很大:
-
+接下来是计算这个项目的一个函数:距下次圆周率日还有多久。如果是在一月,那么计算剩余天数将很简单。但是你需要考虑是否今年的圆周率日是否已经过去了(允悲)。如果是的话,那么计算在你可以再次庆祝之前还有多少天:
```
def countdown(now):
piday = datetime(now.year, 3, 14)
# 如果错过了就增加一年
- if piday < now:
+ if piday < now:
piday = datetime((now.year + 1), 3, 14)
days = (piday - now).days
@@ -167,8 +162,7 @@ def countdown(now):
#### 主函数
-最后,到了主函数,需要初始化显示器并向它写数据。这时,你应该写一个欢迎语然后再开始倒计时。但是首先,你需要加载 Waveshare 库:
-
+最后,到了主函数,需要初始化显示屏并向它写数据。这时,你应该写一个欢迎语然后再开始倒计时。但是首先,你需要加载 Waveshare 库:
```
def main():
@@ -181,9 +175,9 @@ def main():
sys.exit(1)
```
-上面的代码片段检查以确保该库已下载到倒计时脚本旁边的目录中,然后加载“epd2in13_V2”库。 如果你使用不同的显示器,则需要使用不同的库。 如果你愿意,也可以自己编写。我发现阅读 Waveshare 随显示器提供的 Python 代码很有趣,它比我想象的要简单得多。
+上面的代码片段检查以确保该库已下载到倒计时脚本旁边的目录中,然后加载`epd2in13_V2` 库。如果你使用不同的显示屏,则需要使用不同的库。如果你愿意,也可以自己编写。我发现阅读 Waveshare 随显示屏提供的 Python 代码很有趣,它比我想象的要简单得多。
-下一段代码创建一个 EPD( ePaper 显示器)对象以与显示器交互并初始化硬件:
+下一段代码创建一个 EPD(电子纸显示屏)对象以与显示器交互并初始化硬件:
```
logging.info("Starting...")
@@ -198,11 +192,10 @@ def main():
epd.Clear(0xFF)
```
-关于 ePaper 的一个有趣之处:它仅在将像素从白色变为黑色或从黑色变为白色时才使用电源。这意味着当设备断电或应用程序因任何原因停止时,屏幕上的任何内容都会保留下来。从功耗的角度来看,这很好,但这也意味着您需要在启动时清除显示,否则您的脚本只会覆盖屏幕上已有的内容。 因此,`epd.Clear(0xFF)` 用于在脚本启动时清除显示。
+关于电子纸的一个有趣之处:它仅在将像素从白色变为黑色或从黑色变为白色时才耗电。这意味着当设备断电或应用程序因任何原因停止时,屏幕上的任何内容都会保留下来。从功耗的角度来看,这很好,但这也意味着你需要在启动时清除显示,否则你的脚本只会覆盖屏幕上已有的内容。 因此,`epd.Clear(0xFF)` 用于在脚本启动时清除显示。
接下来,创建一个“画布”来绘制剩余的显示输出:
-
```
# 创建一个图形对象
# 注意:"epd.heigh" 是屏幕的长边
@@ -217,15 +210,12 @@ def main():
#### 欢迎语
-接下来,你将开始画一些画。这涉及在你之前创建的“画布”对象上设置数据。这还没有将它绘制到 ePaper 显示器上——你现在只是在构建你想要的图像。由你为这个项目绘制带有一块馅饼的图像,来创建一个庆祝 Pi Day 的欢迎信息:
+接下来,你将开始画一些画。这涉及在你之前创建的“画布”对象上设置数据。这还没有将它绘制到电子纸显示屏上——你现在只是在构建你想要的图像。由你为这个项目绘制带有一块馅饼的图像,来创建一个庆祝圆周率日的欢迎信息:
![画一块馅饼][14]
-(Chris Collins, [CC BY-SA 4.0][15])
-
很可爱,不是吗?
-
```
logging.info("Set text text...")
bangers64 = set_font_size(64)
@@ -235,20 +225,20 @@ def main():
bmp = Image.open(basedir.joinpath("img", "pie.bmp"))
image.paste(bmp, (150,2))
```
-最后,_最后_,你可以展示你画的图画:
+最后,_真是是最后了_,你可以展示你画的图画:
```
logging.info("Display text and BMP")
epd.display(epd.getbuffer(image))
```
-That bit above updates the display to show the image you drew.
+上面那段话更新了显示屏,以显示你所画的图像。
接下来,准备另一幅图像展示你的倒计时:
-#### Pi Day 倒计时
-首先,创建一个用来展示倒计时的项目。也需要设置数字的字体大小:
+#### 圆周率日倒计时
+首先,创建一个用来展示倒计时的图像对象。也需要设置数字的字体大小:
```
logging.info("Pi Date countdown; press CTRL-C to exit")
@@ -262,15 +252,13 @@ That bit above updates the display to show the image you drew.
为了使它显示的时候更像一个倒计时,更新图像的一部分是更加有效的手段,仅更改已经改变的显示数据部分。下面的代码准备以这样方式运行:
-
```
# 准备更新显示
epd.displayPartBaseImage(epd.getbuffer(piday_image))
epd.init(epd.PART_UPDATE)
```
-最后,需要计时,开始一个无限循环来检查据下次 Pi Day 还有多久并显示在 ePaper上。如果到了 Pi Day ,你可以输出一些庆祝短语:
-
+最后,需要计时,开始一个无限循环来检查据下次圆周率日还有多久,并显示在电子纸上。如果到了圆周率日,你可以输出一些庆祝短语:
```
while (True):
@@ -295,7 +283,7 @@ That bit above updates the display to show the image you drew.
time.sleep(5)
```
-脚本最后做了一些错误处理,包括捕获键盘中断,这样你可以使用 **Ctrl**+**C** 来结束无限循环,以及一个根据计数来打印 'day' 或 'days' 的函数:
+脚本最后做了一些错误处理,包括捕获键盘中断,这样你可以使用 `Ctrl + C` 来结束无限循环,以及一个根据计数来打印 `day` 或 `days` 的函数:
```
except IOError as e:
@@ -319,19 +307,16 @@ if __name__ == "__main__":
main()
```
-现在你已经拥有一个倒计时脚本并显示剩余天数!这是在我的树莓派上的显示(视频经过加速,我没有足够的磁盘空间来保存一整天的视频):
+现在你已经拥有一个倒计时并显示剩余天数的脚本!这是在我的树莓派上的显示(视频经过加速,我没有足够的磁盘空间来保存一整天的视频):
![Pi Day Countdown Timer In Action][16]
-(Chris Collins, [CC BY-SA 4.0][15])
-
#### 安装 systemd 服务(选做)
-如果你希望在系统打开时运行倒计时显示并且无需登录并运行脚本,您可以将可选的 systemd 单元安装为 [systemd 用户服务][17].
+如果你希望在系统打开时运行倒计时显示,并且无需登录并运行脚本,你可以将可选的 systemd 单元安装为 [systemd 用户服务][17]。
将 GitHub 上的 [piday.service][18] 文件复制到 `${HOME}/.config/systemd/user`,如果该目录不存在,请先创建该目录。然后你可以启用该服务并启动它:
-
```
$ mkdir -p ~/.config/systemd/user
$ cp piday.service ~/.config/systemd/user
@@ -345,11 +330,11 @@ $ loginctl enable-linger $USER
该脚本将输出到 systemd 日志,可以使用 `journalctl` 命令查看输出。
-### 它开始看起来很像 Pi Day !
+### 它开始看起来像是圆周率日了!
-现在你拥有了一个树莓派 Zero W 显示在 ePaper显示器上的 Pi Day 倒计时器!并在系统启动时使用 systemd 单元文件启动!现在只有 350 天左右我们才可以再次相聚庆祝奇妙的设备———树莓派。通过我们的小项目,我们可以一目了然地看到确切的天数。
+这就是你的作品!一个显示在电子纸显示屏上的树莓派 Zero W 圆周率日倒计时器!并在系统启动时使用 systemd 单元文件启动!现在距离我们可以再次相聚庆祝圆周率日还有好多天的奇妙设备———树莓派。通过我们的小项目,我们可以一目了然地看到确切的天数。
-但事实上,任何人都可以全年都在心中举行 Pi Day,因此请享受使用自己的树莓派创建一些有趣且具有教育意义的项目吧!
+但实际上,每个人都可以在每一天在心中庆祝圆周率日,因此请使用自己的树莓派创建一些有趣且具有教育意义的项目吧!
--------------------------------------------------------------------------------
@@ -358,7 +343,7 @@ via: https://opensource.com/article/21/3/raspberry-pi-countdown-clock
作者:[Chris Collins][a]
选题:[lujun9972][b]
译者:[Donkey](https://github.com/Donkey-Hao)
-校对:[校对者ID](https://github.com/校对者ID)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/published/20210405 How different programming languages do the same thing.md b/published/202206/20210405 How different programming languages do the same thing.md
similarity index 100%
rename from published/20210405 How different programming languages do the same thing.md
rename to published/202206/20210405 How different programming languages do the same thing.md
diff --git a/translated/tech/20210503 Learn the Lisp programming language in 2021.md b/published/202206/20210503 Learn the Lisp programming language in 2021.md
similarity index 84%
rename from translated/tech/20210503 Learn the Lisp programming language in 2021.md
rename to published/202206/20210503 Learn the Lisp programming language in 2021.md
index 8b6ec6197c..fc5b4e6588 100644
--- a/translated/tech/20210503 Learn the Lisp programming language in 2021.md
+++ b/published/202206/20210503 Learn the Lisp programming language in 2021.md
@@ -3,23 +3,22 @@
[#]: author: "Seth Kenlon https://opensource.com/users/seth"
[#]: collector: "lkxed"
[#]: translator: "lkxed"
-[#]: reviewer: " "
-[#]: publisher: " "
-[#]: url: " "
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14751-1.html"
一起来学习 Lisp 编程语言吧!
======
-许多大型代码库中都有 Lisp 代码的身影,因此,熟悉一下这门语言是一个明智之举。
-![科技和计算领域的女性][1]
+
-图源:kris krüg
+> 许多大型代码库中都有 Lisp 代码的身影,因此,熟悉一下这门语言是一个明智之举。
-Lisp 在 1958 年就被发明出来了,它是世界上第二老的计算机编程语言(LCTT 译注:最老的是 Fortran,诞生于 1957 年)。它有许多现代的衍生品,包括 Common Lisp、Emacs Lisp(Elisp)、Clojure、Racket、Scheme、Fennel 和 GNU Guile 等。
+早在 1958 年,Lisp 就被发明出来了,它是世界上第二古老的计算机编程语言(LCTT 译注:最古老的编程语言是 Fortran,诞生于 1957 年)。它有许多现代的衍生品,包括 Common Lisp、Emacs Lisp(Elisp)、Clojure、Racket、Scheme、Fennel 和 GNU Guile 等。
-那些喜欢思考编程语言设计的人,往往都喜欢 Lisp,因为它的语法和数据有者相同的结构:Lisp 代码实际上是一个列表的列表,它的名字其实是 “列表处理” 的首字母缩写。那些喜欢思考编程语言美学的人,往往都讨厌 Lisp,因为它经常使用括号来定义范围;事实上,编程界也有一个广为流传的笑话:Lisp 代表的其实是 “大量烦人的多余括号”。
+那些喜欢思考编程语言的设计的人,往往都喜欢 Lisp,因为它的语法和数据有着相同的结构:Lisp 代码实际上是一个列表的列表,它的名字其实是 “列表处理” 的简写。而那些喜欢思考编程语言的美学的人,往往都讨厌 Lisp,因为它经常使用括号来定义范围;事实上,编程界也有一个广为流传的笑话:Lisp 代表的其实是 “大量烦人的多余括号”。
-不管你是喜欢还是讨厌 Lisp 的设计哲学,你都不得不承认,它都是一门有趣的语言,过去如此,现在亦然(这得归功于现代方言 Clojure 和 Guile)。你可能会感到惊讶,但事实就是,Lisp 在任何行业的大型代码库中都占有一席之地。因此,现在开始学习 Lisp,至少熟悉一下它,不失为一个好主意。
+不管你是喜欢还是讨厌 Lisp 的设计哲学,你都不得不承认,它都是一门有趣的语言,过去如此,现在亦然(这得归功于现代方言 Clojure 和 Guile)。你可能会惊讶于在任何特定行业的大代码库中潜伏着多少 Lisp 代码,因此,现在开始学习 Lisp,至少熟悉一下它,不失为一个好主意。
### 安装 Lisp
@@ -55,7 +54,7 @@ $ brew install clisp
### 列表处理
-Lisp 源代码的基本单元是 “表达式”,它在形式上是一个列表。举个例子,下面就是一个列表,它由一个操作符(`+`)和两个整数(`1` 和 `2`)组成的:
+Lisp 源代码的基本单元是 “表达式”,它在形式上是一个列表。举个例子,下面就是一个列表,它由一个操作符(`+`)和两个整数(`1` 和 `2`)组成:
```
(+ 1 2)
@@ -85,7 +84,7 @@ $ clisp
### 函数
-在了解了 Lisp 表达式的基本结构后,你可以使用函数来做更多有用的事。譬如,`print` 函数可以接受任意数量的参数,然后把它们都显示在你的终端上,`pprint` 函数还可以实现格式化打印。还有更多不同的打印函数,不过,`pprint` 在 REPL 中的效果还挺好的:
+在了解了 Lisp 表达式的基本结构后,你可以使用函数来做更多有用的事。譬如,`print` 函数可以接受任意数量的参数,然后把它们都显示在你的终端上,`pprint` 函数还可以实现格式化打印。还有更多不同的打印函数,不过,`pprint` 在 REPL 中的效果就挺好的:
```
[1]> (pprint "hello world")
@@ -121,7 +120,7 @@ MYPRINTER
[3]>
```
-你可以往表达式里嵌套表达式(就像使用某种管道一样)。举个例子,你可以先使用 `string-upcase` 函数,把某个字符串的所有字符转换成大写,然后再使用 `pprint` 函数,将它的内容格式化打印到终端上:
+你可以在表达式里嵌套表达式(就像使用某种管道一样)。举个例子,你可以先使用 `string-upcase` 函数,把某个字符串的所有字符转换成大写,然后再使用 `pprint` 函数,将它的内容格式化打印到终端上:
```
[3]> (pprint (string-upcase foo))
@@ -142,7 +141,6 @@ Lisp 是动态类型语言,这意味着,你在给变量赋值时不需要声
如果你想让整数被当作字符串来处理,你可以给它加上引号:
-
```
[4]> (setf foo "2")
"2"
@@ -215,7 +213,7 @@ $
### 编写脚本
-Lisp 可以被编译,也可以作为解释型的脚本语言来使用。在你刚开始学习的时候,后者很可能是最容易的选项,特别是当你已经熟悉 Python 或 [Shell 脚本][9] 时。
+Lisp 可以被编译,也可以作为解释型的脚本语言来使用。在你刚开始学习的时候,后者很可能是最容易的方式,特别是当你已经熟悉 Python 或 [Shell 脚本][9] 时。
下面是一个用 Common Lisp 编写的简单的“掷骰子”脚本:
@@ -231,7 +229,7 @@ Lisp 可以被编译,也可以作为解释型的脚本语言来使用。在你
(roller userput)
```
-脚本的第一行注释告诉了你的 POSIX 终端,该使用什么可执行文件来运行这个脚本。
+脚本的第一行注释(LCTT 译注:称之为“释伴”)告诉了你的 POSIX 终端,该使用什么可执行文件来运行这个脚本。
`roller` 函数使用 `defun` 函数创建,它在内部使用 `random` 函数来打印一个伪随机数,这个伪随机数严格小于 `num` 列表中下标为 0 的元素。在脚本中,这个 `num` 列表还没有被创建,不过没关系,因为只有当脚本被调用时,函数才会执行。
@@ -278,7 +276,7 @@ via: https://opensource.com/article/21/5/learn-lisp
作者:[Seth Kenlon][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/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/translated/tech/20210722 Write your first JavaScript code.md b/published/202206/20210722 Write your first JavaScript code.md
similarity index 79%
rename from translated/tech/20210722 Write your first JavaScript code.md
rename to published/202206/20210722 Write your first JavaScript code.md
index e3a55f94da..1cbb8f9f06 100644
--- a/translated/tech/20210722 Write your first JavaScript code.md
+++ b/published/202206/20210722 Write your first JavaScript code.md
@@ -3,17 +3,16 @@
[#]: author: "Seth Kenlon https://opensource.com/users/seth"
[#]: collector: "lkxed"
[#]: translator: "lkxed"
-[#]: reviewer: " "
-[#]: publisher: " "
-[#]: url: " "
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14740-1.html"
编写你的第一段 JavaScript 代码
======
-JavaScript 是为 Web 而生的,但它可以做的事远不止于此。本文将带领你了解它的基础知识,然后你可以下载我们的备忘清单,以便随时掌握详细信息。
-![开源编程][1]
+> JavaScript 是为 Web 而生的,但它可以做的事远不止于此。本文将带领你了解它的基础知识,然后你可以下载我们的备忘清单,以便随时掌握详细信息。
-图源:Opensource.com
+
JavaScript 是一种充满惊喜的编程语言。许多人第一次遇到 JavaScript 时,它通常是作为一种 Web 语言出现的。所有主流浏览器都有一个 JavaScript 引擎;并且,还有一些流行的框架,如 JQuery、Cash 和 Bootstrap 等,它们可以帮助简化网页设计;甚至还有用 JavaScript 编写的编程环境。它似乎在互联网上无处不在,但事实证明,它对于 [Electron][2] 等项目来说也是一种有用的语言。Electron 是一个构建跨平台桌面应用程序的开源工具包,它使用的语言就是 JavaScript。
@@ -21,11 +20,11 @@ JavaScript 语言的用途多到令人惊讶,它拥有各种各样的库,而
### 安装 JavaScript
-随着你的 JavaScript 水平不断提高,你可能会发现自己需要高级的 JavaScript 库和运行时。不过,刚开始学习的时候,你是根本不需要安装 JavaScript 的。因为所有主流的 Web 浏览器都包含一个 JavaScript 引擎来运行代码。你可以使用自己喜欢的文本编辑器编写 JavaScript,将其加载到 Web 浏览器中,接着你就能看到代码的作用。
+随着你的 JavaScript 水平不断提高,你可能会发现自己需要高级的 JavaScript 库和运行时环境。不过,刚开始学习的时候,你是根本不需要安装 JavaScript 环境的。因为所有主流的 Web 浏览器都包含一个 JavaScript 引擎来运行代码。你可以使用自己喜欢的文本编辑器编写 JavaScript,将其加载到 Web 浏览器中,接着你就能看到代码的作用。
### 上手 JavaScript
-要编写你的第一个 JavaScript 代码,请打开你喜欢的文本编辑器,例如 [Notepad++][3]、[Atom][4] 或 [VSCode][5] 等。因为它是为 Web 开发的,所以 JavaScript 可以很好地与 HTML 配合使用。因此,我们先来尝试一些基本的 HTML:
+要编写你的第一个 JavaScript 代码,请打开你喜欢的文本编辑器,例如 [Atom][4] 或 [VSCode][5] 等。因为它是为 Web 开发的,所以 JavaScript 可以很好地与 HTML 配合使用。因此,我们先来尝试一些基本的 HTML:
```
@@ -66,9 +65,9 @@ JavaScript 语言的用途多到令人惊讶,它拥有各种各样的库,而
![在浏览器中显示带有 JavaScript 的 HTML][7]
-如你所见,`` 标签仍然包含字符串 “Nothing here”,但是当它被渲染时,JavaScript 会改变它,使其包含 “Hello world”。是的,JavaScript 具有重建(或只是帮助构建)网页的能力。
+如你所见,`
` 标签仍然包含字符串 `"Nothing here"`,但是当它被渲染时,JavaScript 会改变它,使其包含 `"Hello world"`。是的,JavaScript 具有重建(或只是帮助构建)网页的能力。
-这个简单脚本中的 JavaScript 做了两件事。首先,它创建一个名为 `myvariable` 的变量,并将字符串 “Hello world!” 放置其中。然后,它会在当前文档(浏览器呈现的网页)中搜索 ID 为 “example” 的所有 HTML 元素。当它找到 `example` 时,它使用了 `innerHTML` 函数将 HTML 元素的内容替换为 `myvariable` 的内容。
+这个简单脚本中的 JavaScript 做了两件事。首先,它创建一个名为 `myvariable` 的变量,并将字符串 `"Hello world!"` 放置其中。然后,它会在当前文档(浏览器呈现的网页)中搜索 ID 为 `example` 的所有 HTML 元素。当它找到 `example` 时,它使用了 `innerHTML` 函数将 HTML 元素的内容替换为 `myvariable` 的内容。(LCTT 译注:这里作者笔误了,`innerHTML` 是“属性”而非“函数”。)
当然,我们也可以不用自定义变量。因为,使用动态创建的内容来填充 HTML 元素也是容易的。例如,你可以使用当前时间戳来填充它:
@@ -94,7 +93,7 @@ JavaScript 语言的用途多到令人惊讶,它拥有各种各样的库,而
在编程中,语法 指的是如何编写句子(或“行”)的规则。在 JavaScript 中,每行代码必须以分号(`;`)结尾,以便运行代码的 JavaScript 引擎知道何时停止阅读。(LCTT 译注:从实用角度看,此处的“必须”其实是不正确的,大多数 JS 引擎都支持不加分号。Vue.js 的作者尤雨溪认为“没有应该不应该,只有你自己喜欢不喜欢”,他同时表示,“Vue.js 的代码全部不带分号”。详情可以查看他在知乎上对于此问题的 [回答][10]。)
-单词(或 “字符串”)必须用引号(`"`)括起来,而数字(或 “整数”)则不用。
+单词(或 字符串)必须用引号(`"`)括起来,而数字(或 整数)则不用。
几乎所有其他东西都是 JavaScript 语言的约定,例如变量、数组、条件语句、对象、函数等等。
@@ -111,7 +110,7 @@ document.getElementById("example").innerHTML = typeof(myvariable);
```
-接着,你就会发现 Web 浏览器中显示出 “string” 字样,因为该变量包含的数据是 “Hello world!”。在 `myvariable` 中存储不同类型的数据(例如整数),浏览器就会把不同的数据类型打印到示例网页上。尝试将 `myvariable` 的内容更改为你喜欢的数字,然后重新加载页面。
+接着,你就会发现 Web 浏览器中显示出 “string” 字样,因为该变量包含的数据是 `"Hello world!"`。在 `myvariable` 中存储不同类型的数据(例如整数),浏览器就会把不同的数据类型打印到示例网页上。尝试将 `myvariable` 的内容更改为你喜欢的数字,然后重新加载页面。
### 在 JavaScript 中创建函数
@@ -160,7 +159,7 @@ document.getElementById("example").innerHTML = typeof(myvariable);
学习 JavaScript 既简单又有趣。网络上有很多网站提供了相关教程,还有超过一百万个 JavaScript 库可帮助你与设备、外围设备、物联网、服务器、文件系统等进行交互。在你学习的过程中,请将我们的 [JavaScript 备忘单][9] 放在身边,以便记住语法和结构的细节。
-正文中的配图来自:Seth Kenlon,CC BY-SA 4.0
+> **[JavaScript 备忘单][9]**
--------------------------------------------------------------------------------
@@ -169,7 +168,7 @@ via: https://opensource.com/article/21/7/javascript-cheat-sheet
作者:[Seth Kenlon][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/20210724 How to Fix yay- error while loading shared libraries- libalpm.so.12.md b/published/202206/20210724 How to Fix yay- error while loading shared libraries- libalpm.so.12.md
similarity index 100%
rename from published/20210724 How to Fix yay- error while loading shared libraries- libalpm.so.12.md
rename to published/202206/20210724 How to Fix yay- error while loading shared libraries- libalpm.so.12.md
diff --git a/published/20210725 How to Recover Arch Linux Install via chroot.md b/published/202206/20210725 How to Recover Arch Linux Install via chroot.md
similarity index 100%
rename from published/20210725 How to Recover Arch Linux Install via chroot.md
rename to published/202206/20210725 How to Recover Arch Linux Install via chroot.md
diff --git a/published/202206/20210809 How to Enable Minimize, Maximize Window Buttons in elementary OS.md b/published/202206/20210809 How to Enable Minimize, Maximize Window Buttons in elementary OS.md
new file mode 100644
index 0000000000..64d7a26557
--- /dev/null
+++ b/published/202206/20210809 How to Enable Minimize, Maximize Window Buttons in elementary OS.md
@@ -0,0 +1,91 @@
+[#]: subject: "How to Enable Minimize, Maximize Window Buttons in elementary OS"
+[#]: via: "https://www.debugpoint.com/2021/08/enable-minimize-maximize-elementary/"
+[#]: author: "Arindam https://www.debugpoint.com/author/admin1/"
+[#]: collector: "lkxed"
+[#]: translator: "geekpi"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14778-1.html"
+
+如何在 elementary OS 中启用最小化、最大化窗口按钮
+======
+
+
+
+> 这是如何在 elementary OS 中启用最小化、最大化窗口按钮的方法。
+
+许多人(大多数是 elementary OS 的新用户)在各种论坛上问这些问题:
+
+1. 我怎样才能在 elementary OS 中启用最小化按钮?
+2. 我如何启用还原、最小化、最大化?
+3. 有可能恢复最小化和最大化按钮吗?
+
+这些都是完全正常的问题,而且问问题也是可以的。对吧?这篇指南可以帮助他们在 elementary OS 中获得这些按钮。
+
+Elementary OS 所使用的 Pantheon 桌面并没有默认的标准窗口按钮。其主要原因是通过 Dock 和应用菜单处理用户行为和活动的不同理念。可以说,这种设计或实现的行为模仿了macOS。
+
+不过,许多用户更喜欢窗口按钮,因为这是一个所谓的“肌肉记忆”,而且有些人是从其他桌面环境(甚至是 Windows)迁移过来的。
+
+尽管 Elementary 没有为你提供这个默认设置,你仍然可以启用它。下面是方法。
+
+### 启用最小化最大化按钮 - elementary OS
+
+打开终端,安装添加 PPA 所需的 `software-properties-common` 软件包。默认情况下,这个包在 elementary OS 中没有安装(不要问我为什么,真的)。
+
+```
+sudo apt install software-properties-common
+```
+
+#### elementary OS 6 Odin
+
+elementary Tweak 工具被重新换了个名字,它现在被称为 [Pantheon Tweaks][1],并正在单独开发中。使用以下命令,你可以安装它:
+
+```
+sudo add-apt-repository -y ppa:philip.scott/pantheon-tweaks
+sudo apt install -y pantheon-tweaks
+```
+
+#### elementary OS 5 Juno 及更低版本
+
+如果你使用的是 elementary OS 5 June 及更低版本,你可以使用相同的 PPA 安装早期的 [elementary-tweaks][2]。在终端按照以下命令进行操作:
+
+```
+sudo add-apt-repository -y ppa:philip.scott/elementary-tweaks
+sudo apt install -y elementary-tweaks
+```
+
+#### 更改设置
+
+* 安装后,点击顶部栏的“应用”,打开“系统设置”。在系统设置窗口中,点击“个人”下的 “Tweaks”。
+* 在 Tweaks 窗口中,进入“外观”。
+* 在窗口控制下,选择布局:“Windows”。
+
+ ![enable minimize maximize buttons elementary OS][3]
+
+* 然后在顶部窗口栏的右侧应该有最小化、最大化和关闭按钮了。
+
+也有其他组合形式,如 Ubuntu、macOS 等。你可以选择任何你觉得合适的:
+
+![Other Options of Window buttons in elementary][4]
+
+这篇指南至此就结束了。系统设置中还有其他选项,你可以尝试使用,但窗口管理器 gala 最近删除了这些选项。因此,它们目前可能无法工作。
+
+我希望这个指南能帮助你启用 elementary OS 的最小化最大化按钮。如果你需要任何帮助,请在下面的评论栏告诉我。
+
+--------------------------------------------------------------------------------
+
+via: https://www.debugpoint.com/2021/08/enable-minimize-maximize-elementary/
+
+作者:[Arindam][a]
+选题:[lkxed][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[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://github.com/pantheon-tweaks/pantheon-tweaks
+[2]: https://github.com/elementary-tweaks/elementary-tweaks
+[3]: https://www.debugpoint.com/wp-content/uploads/2021/08/enable-minimize-maximize-buttons-elementary-OS.png
+[4]: https://www.debugpoint.com/wp-content/uploads/2021/08/Other-Options-of-Window-buttons-in-elementary.jpg
diff --git a/published/202206/20211102 Apache Kafka- Asynchronous Messaging for Seamless Systems.md b/published/202206/20211102 Apache Kafka- Asynchronous Messaging for Seamless Systems.md
new file mode 100644
index 0000000000..3882caa3a3
--- /dev/null
+++ b/published/202206/20211102 Apache Kafka- Asynchronous Messaging for Seamless Systems.md
@@ -0,0 +1,303 @@
+[#]: subject: "Apache Kafka: Asynchronous Messaging for Seamless Systems"
+[#]: via: "https://www.opensourceforu.com/2021/11/apache-kafka-asynchronous-messaging-for-seamless-systems/"
+[#]: 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-14772-1.html"
+
+Apache Kafka:为“无缝系统”提供异步消息支持
+======
+
+> Apache Kafka 是最流行的开源消息代理之一。它已经成为了大数据操作的重要组成部分,你能够在几乎所有的微服务环境中找到它。本文对 Apache Kafka 进行了简要介绍,并提供了一个案例来展示它的使用方式。
+
+
+
+你有没有想过,电子商务平台是如何在处理巨大的流量时,做到不会卡顿的呢?有没有想过,OTT 平台是如何在同时向数百万用户交付内容时,做到平稳运行的呢?其实,关键就在于它们的分布式架构。
+
+采用分布式架构设计的系统由多个功能组件组成。这些功能组件通常分布在多个机器上,它们通过网络,异步地交换消息,从而实现相互协作。正是由于异步消息的存在,组件之间才能实现可伸缩、无阻塞的通信,整个系统才能够平稳运行。
+
+### 异步消息
+
+异步消息的常见特性有:
+
+* 消息的生产者和消费者都不知道彼此的存在。它们在不知道对方的情况下,加入和离开系统。
+* 消息代理充当了生产者和消费者之间的中介。
+* 生产者把每条消息,都与一个“主题”相关联。主题是一个简单的字符串。
+* 生产者可以在多个主题上发送消息,不同的生产者也可以在同一主题上发送消息。
+* 消费者向代理订阅一个或多个主题的消息。
+* 生产者只将消息发送给代理,而不发送给消费者。
+* 代理会把消息发送给订阅该主题的所有消费者。
+* 代理将消息传递给针对该主题注册的所有消费者。
+* 生产者并不期望得到消费者的任何回应。换句话说,生产者和消费者不会相互阻塞。
+
+市场上的消息代理有很多,而 Apache Kafka 是其中最受欢迎的之一。
+
+### Apache Kafka
+
+Apache Kafka 是一个支持流式处理的、开源的分布式消息系统,它由 Apache 软件基金会开发。在架构上,它是多个代理组成的集群,这些代理间通过 Apache ZooKeeper 服务来协调。在接收、持久化和发送消息时,这些代理分担集群上的负载。
+
+#### 分区
+
+Kafka 将消息写入称为“分区”的桶中。一个特定分区只保存一个主题上的消息。例如,Kafka 会把 `heartbeats` 主题上的消息写入名为 `heartbeats-0` 的分区(假设它是个单分区主题),这个过程和生产者无关。
+
+![图 1:异步消息][2]
+
+不过,为了利用 Kafka 集群所提供的并行处理能力,管理员通常会为指定主题创建多个分区。举个例子,假设管理员为 `heartbeats` 主题创建了三个分区,Kafka 会将它们分别命名为 `heartbeats-0`、`heartbeats-1` 和 `heartbeats-2`。Kafka 会以某种方式,把消息分配到这三个分区中,并使它们均匀分布。
+
+还有另一种可能的情况,生产者将每条消息与一个消息键相关联。例如,同样都是在 `heartbeats` 主题上发送消息,有个组件使用 `C1` 作为消息键,另一个则使用 `C2`。在这种情况下,Kafka 会确保,在一个主题中,带有相同消息键的消息,总是会被写入到同一个分区。不过,在一个分区中,消息的消息键却不一定相同。下面的图 2 显示了消息在不同分区中的一种可能分布。
+
+![图 2:消息在不同分区中的分布][3]
+
+#### 领导者和同步副本
+
+Kafka 在(由多个代理组成的)集群中维护了多个分区。其中,负责维护分区的那个代理被称为“领导者”。只有领导者能够在它的分区上接收和发送消息。
+
+可是,万一分区的领导者发生故障了,又该怎么办呢?为了确保业务连续性,每个领导者(代理)都会把它的分区复制到其他代理上。此时,这些其他代理就称为该分区的同步副本(ISR)。一旦分区的领导者发生故障,ZooKeeper 就会发起一次选举,把选中的那个同步副本任命为新的领导者。此后,这个新的领导者将承担该分区的消息接受和发送任务。管理员可以指定分区需要维护的同步副本的大小。
+
+![图 3:生产者命令行工具][4]
+
+#### 消息持久化
+
+代理会将每个分区都映射到一个指定的磁盘文件,从而实现持久化。默认情况下,消息会在磁盘上保留一个星期。当消息写入分区后,它们的内容和顺序就不能更改了。管理员可以配置一些策略,如消息的保留时长、压缩算法等。
+
+![图 4:消费者命令行工具][5]
+
+#### 消费消息
+
+与大多数其他消息系统不同,Kafka 不会主动将消息发送给消费者。相反,消费者应该监听主题,并主动读取消息。一个消费者可以从某个主题的多个分区中读取消息。多个消费者也可以读取来自同一个分区的消息。Kafka 保证了同一条消息不会被同一个消费者重复读取。
+
+Kafka 中的每个消费者都有一个组 ID。那些组 ID 相同的消费者们共同组成了一个消费者组。通常,为了从 N 个主题分区读取消息,管理员会创建一个包含 N 个消费者的消费者组。这样一来,组内的每个消费者都可以从它的指定分区中读取消息。如果组内的消费者比可用分区还要多,那么多出来的消费者就会处于闲置状态。
+
+在任何情况下,Kafka 都保证:不管组内有多少个消费者,同一条消息只会被该消费者组读取一次。这个架构提供了一致性、高性能、高可扩展性、准实时交付和消息持久性,以及零消息丢失。
+
+### 安装、运行 Kafka
+
+尽管在理论上,Kafka 集群可以由任意数量的代理组成,但在生产环境中,大多数集群通常由三个或五个代理组成。
+
+在这里,我们将搭建一个单代理集群,对于生产环境来说,它已经够用了。
+
+在浏览器中访问 [https://kafka.apache.org/downloads][5a],下载 Kafka 的最新版本。在 Linux 终端中,我们也可以使用下面的命令来下载它:
+
+```
+wget https://www.apache.org/dyn/closer.cgi?path=/kafka/2.8.0/kafka_2.12-2.8.0.tgz
+```
+
+如果需要的话,我们也可以把下载来的档案文件 `kafka_2.12-2.8.0.tgz` 移动到另一个目录下。解压这个档案,你会得到一个名为 `kafka_2.12-2.8.0` 的目录,它就是之后我们要设置的 `KAFKA_HOME`。
+
+打开 `KAFKA_HOME/config` 目录下的 `server.properties` 文件,取消注释下面这一行配置:
+
+```
+listeners=PLAINTEXT://:9092
+```
+
+这行配置的作用是让 Kafka 在本机的 `9092` 端口接收普通文本消息。我们也可以配置 Kafka 通过安全通道接收消息,在生产环境中,我们也推荐这么做。
+
+无论集群中有多少个代理,Kafka 都需要 ZooKeeper 来管理和协调它们。即使是单代理集群,也是如此。Kafka 在安装时,会附带安装 ZooKeeper,因此,我们可以在 `KAFKA_HOME` 目录下,在命令行中使用下面的命令来启动它:
+
+```
+./bin/zookeeper-server-start.sh ./config/zookeeper.properties
+```
+
+当 ZooKeeper 运行起来后,我们就可以在另一个终端中启动 Kafka 了,命令如下:
+
+```
+./bin/kafka-server-start.sh ./config/server.properties
+```
+
+到这里,一个单代理的 Kafka 集群就运行起来了。
+
+### 验证 Kafka
+
+让我们在 `topic-1` 主题上尝试下发送和接收消息吧!我们可以使用下面的命令,在创建主题时为它指定分区的个数:
+
+```
+./bin/kafka-topics.sh --create --topic topic-1 --zookeeper localhost:2181 --partitions 3 --replication-factor 1
+```
+
+上述命令还同时指定了复制因子,它的值不能大于集群中代理的数量。我们使用的是单代理集群,因此,复制因子只能设置为 1。
+
+当主题创建完成后,生产者和消费者就可以在上面交换消息了。Kafka 的发行版内附带了生产者和消费者的命令行工具,供测试时用。
+
+打开第三个终端,运行下面的命令,启动生产者:
+
+```
+./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic topic-1
+```
+
+上述命令显示了一个提示符,我们可以在后面输入简单文本消息。由于我们指定的命令选项,生产者会把 `topic-1` 上的消息,发送到运行在本机的 9092 端口的 Kafka 中。
+
+打开第四个终端,运行下面的命令,启动消费者:
+
+```
+./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic topic-1 –-from-beginning
+```
+
+上述命令启动了一个消费者,并指定它连接到本机 9092 端口的 Kafka。它订阅了 `topic-1` 主题,以读取其中的消息。由于命令行的最后一个选项,这个消费者会从最开头的位置,开始读取该主题的所有消息。
+
+我们注意到,生产者和消费者连接的是同一个代理,访问的是同一个主题,因此,消费者在收到消息后会把消息打印到终端上。
+
+下面,让我们在实际应用场景中,尝试使用 Kafka 吧!
+
+### 案例
+
+假设有一家叫做 ABC 的公共汽车运输公司,它拥有一支客运车队,往返于全国不同城市之间。由于 ABC 希望实时跟踪每辆客车,以提高其运营质量,因此,它提出了一个基于 Apache Kafka 的解决方案。
+
+首先,ABC 公司为所有公交车都配备了位置追踪设备。然后,它使用 Kafka 建立了一个操作中心,以接收来自数百辆客车的位置更新。它还开发了一个仪表盘,以显示任一时间点所有客车的当前位置。图 5 展示了上述架构:
+
+![图 5:基于 Kafka 的架构][6]
+
+在这种架构下,客车上的设备扮演了消息生产者的角色。它们会周期性地把当前位置发送到 Kafka 的 `abc-bus-location` 主题上。ABC 公司选择以客车的行程编号作为消息键,以处理来自不同客车的消息。例如,对于从 Bengaluru 到 Hubballi 的客车,它的行程编号就会是 `BLRHL003`,那么在这段旅程中,对于所有来自该客车的消息,它们的消息键都会是 `BLRHL003`。
+
+仪表盘应用扮演了消息消费者的角色。它在代理上注册了同一个主题 `abc-bus-location`。如此,这个主题就成为了生产者(客车)和消费者(仪表盘)之间的虚拟通道。
+
+客车上的设备不会期待得到来自仪表盘应用的任何回复。事实上,它们相互之间都不知道对方的存在。得益于这种架构,数百辆客车和操作中心之间实现了非阻塞通信。
+
+#### 实现
+
+假设 ABC 公司想要创建三个分区来维护位置更新。由于我们的开发环境只有一个代理,因此复制因子应设置为 1。
+
+相应地,以下命令创建了符合需求的主题:
+
+```
+./bin/kafka-topics.sh --create --topic abc-bus-location --zookeeper localhost:2181 --partitions 3 --replication-factor 1
+```
+
+生产者和消费者应用可以用多种语言编写,如 Java、Scala、Python 和 JavaScript 等。下面几节中的代码展示了它们在 Java 中的编写方式,好让我们有一个初步了解。
+
+##### Java 生产者
+
+下面的 `Fleet` 类模拟了在 ABC 公司的 6 辆客车上运行的 Kafka 生产者应用。它会把位置更新发送到指定代理的 `abc-bus-location` 主题上。请注意,简单起见,主题名称、消息键、消息内容和代理地址等,都在代码里硬编码的。
+
+```
+public class Fleet {
+ public static void main(String[] args) throws Exception {
+ String broker = “localhost:9092”;
+ Properties props = new Properties();
+ props.setProperty(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, broker);
+ props.setProperty(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,
+ StringSerializer.class.getName());
+ props.setProperty(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,
+ StringSerializer.class.getName());
+
+ Producer producer = new KafkaProducer(props);
+ String topic = “abc-bus-location”;
+ Map locations = new HashMap<>();
+ locations.put(“BLRHBL001”, “13.071362, 77.461906”);
+ locations.put(“BLRHBL002”, “14.399654, 76.045834”);
+ locations.put(“BLRHBL003”, “15.183959, 75.137622”);
+ locations.put(“BLRHBL004”, “13.659576, 76.944675”);
+ locations.put(“BLRHBL005”, “12.981337, 77.596181”);
+ locations.put(“BLRHBL006”, “13.024843, 77.546983”);
+
+ IntStream.range(0, 10).forEach(i -> {
+ for (String trip : locations.keySet()) {
+ ProducerRecord record
+ = new ProducerRecord(
+ topic, trip, locations.get(trip));
+ producer.send(record);
+ }
+ });
+ producer.flush();
+ producer.close();
+ }
+}
+```
+
+##### Java 消费者
+
+下面的 `Dashboard` 类实现了一个 Kafka 消费者应用,运行在 ABC 公司的操作中心。它会监听 `abc-bus-location` 主题,并且它的消费者组 ID 是 `abc-dashboard`。当收到消息后,它会立即显示来自客车的详细位置信息。我们本该配置这些详细位置信息,但简单起见,它们也是在代码里硬编码的:
+
+```
+public static void main(String[] args) {
+ String broker = “127.0.0.1:9092”;
+ String groupId = “abc-dashboard”;
+ Properties props = new Properties();
+ props.setProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, broker);
+ props.setProperty(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG,
+ StringDeserializer.class.getName());
+ props.setProperty(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,
+ StringDeserializer.class.getName());
+ props.setProperty(ConsumerConfig.GROUP_ID_CONFIG, groupId);
+
+ @SuppressWarnings(“resource”)
+ Consumer consumer = new KafkaConsumer(props);
+ consumer.subscribe(Arrays.asList(“abc-bus-location”));
+ while (true) {
+ ConsumerRecords records
+ = consumer.poll(Duration.ofMillis(1000));
+
+ for (ConsumerRecord record : records) {
+ String topic = record.topic();
+ int partition = record.partition();
+ String key = record.key();
+ String value = record.value();
+ System.out.println(String.format(
+ “Topic=%s, Partition=%d, Key=%s, Value=%s”,
+ topic, partition, key, value));
+ }
+ }
+}
+```
+
+##### 依赖
+
+为了编译和运行这些代码,我们需要 JDK 8 及以上版本。看到下面的 `pom.xml` 文件中的 Maven 依赖了吗?它们会把所需的 Kafka 客户端库下载并添加到类路径中:
+
+```
+
+ org.apache.kafka
+ kafka-clients
+ 2.8.0
+
+
+ org.slf4j
+ slf4j-simple
+ 1.7.25
+
+```
+
+#### 部署
+
+由于 `abc-bus-location` 主题在创建时指定了 3 个分区,我们自然就会想要运行 3 个消费者,来让读取位置更新的过程更快一些。为此,我们需要同时在 3 个不同的终端中运行仪表盘。因为所有这 3 个仪表盘都注册在同一个组 ID 下,它们自然就构成了一个消费者组。Kafka 会为每个仪表盘都分配一个特定的分区(来消费)。
+
+当所有仪表盘实例都运行起来后,在另一个终端中启动 `Fleet` 类。图 6、7、8 展示了仪表盘终端中的控制台示例输出。
+
+![图 6:仪表盘终端之一][7]
+
+仔细看看控制台消息,我们会发现第一个、第二个和第三个终端中的消费者,正在分别从 `partition-2`、`partition-1` 和 `partition-0` 中读取消息。另外,我们还能发现,消息键为 `BLRHBL002`、`BLRHBL004` 和 `BLRHBL006` 的消息写入了 `partition-2`,消息键为 `BLRHBL005` 的消息写入了 `partition-1`,剩下的消息写入了 `partition-0`。
+
+![图 7:仪表盘终端之二][8]
+
+使用 Kafka 的好处在于,只要集群设计得当,它就可以水平扩展,从而支持大量客车和数百万条消息。
+
+![图 8:仪表盘终端之三][9]
+
+### 不止是消息
+
+根据 Kafka 官网上的数据,在《财富》100 强企业中,超过 80% 都在使用 Kafka。它部署在许多垂直行业,如金融服务、娱乐等。虽然 Kafka 起初只是一种简单的消息服务,但它已凭借行业级的流处理能力,成为了大数据生态系统的一环。对于那些喜欢托管解决方案的企业,Confluent 提供了基于云的 Kafka 服务,只需支付订阅费即可。(LCTT 译注:Confluent 是一个基于 Kafka 的商业公司,它提供的 Confluent Kafka 在 Apache Kafka 的基础上,增加了许多企业级特性,被认为是“更完整的 Kafka”。)
+
+--------------------------------------------------------------------------------
+
+via: https://www.opensourceforu.com/2021/11/apache-kafka-asynchronous-messaging-for-seamless-systems/
+
+作者:[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/09/Digital-backgrund-connecting-in-globe.jpg
+[2]: https://www.opensourceforu.com/wp-content/uploads/2021/09/Figure-1-Asynchronous-messaging.jpg
+[3]: https://www.opensourceforu.com/wp-content/uploads/2021/09/Figure-2-Message-distribution-among-the-partitions.jpg
+[4]: https://www.opensourceforu.com/wp-content/uploads/2021/09/Figure-3-Command-line-producer.jpg
+[5]: https://www.opensourceforu.com/wp-content/uploads/2021/09/Figure-4-Command-line-consumer.jpg
+[5a]: https://kafka.apache.org/downloads
+[6]: https://www.opensourceforu.com/wp-content/uploads/2021/09/Figure-5-Kafka-based-architecture.jpg
+[7]: https://www.opensourceforu.com/wp-content/uploads/2021/09/Figure-6-Dashboard-Terminal-1.jpg
+[8]: https://www.opensourceforu.com/wp-content/uploads/2021/09/Figure-7-Dashboard-Terminal-2.jpg
+[9]: https://www.opensourceforu.com/wp-content/uploads/2021/09/Figure-8-Dashboard-Terminal-3.jpg
diff --git a/published/20220510 6 easy ways to make your first open source contribution with LibreOffice.md b/published/202206/20220510 6 easy ways to make your first open source contribution with LibreOffice.md
similarity index 100%
rename from published/20220510 6 easy ways to make your first open source contribution with LibreOffice.md
rename to published/202206/20220510 6 easy ways to make your first open source contribution with LibreOffice.md
diff --git a/published/20220514 Hidden Features! 25 Fun Things You Can Do With DuckDuckGo Search Engine.md b/published/202206/20220514 Hidden Features! 25 Fun Things You Can Do With DuckDuckGo Search Engine.md
similarity index 100%
rename from published/20220514 Hidden Features! 25 Fun Things You Can Do With DuckDuckGo Search Engine.md
rename to published/202206/20220514 Hidden Features! 25 Fun Things You Can Do With DuckDuckGo Search Engine.md
diff --git a/published/20220516 How to Dual Boot Ubuntu 22.04 LTS and Windows 11.md b/published/202206/20220516 How to Dual Boot Ubuntu 22.04 LTS and Windows 11.md
similarity index 100%
rename from published/20220516 How to Dual Boot Ubuntu 22.04 LTS and Windows 11.md
rename to published/202206/20220516 How to Dual Boot Ubuntu 22.04 LTS and Windows 11.md
diff --git a/published/20220518 How To Boot Into Rescue Mode Or Emergency Mode In Ubuntu 22.04 - 20.04 - 18.04.md b/published/202206/20220518 How To Boot Into Rescue Mode Or Emergency Mode In Ubuntu 22.04 - 20.04 - 18.04.md
similarity index 100%
rename from published/20220518 How To Boot Into Rescue Mode Or Emergency Mode In Ubuntu 22.04 - 20.04 - 18.04.md
rename to published/202206/20220518 How To Boot Into Rescue Mode Or Emergency Mode In Ubuntu 22.04 - 20.04 - 18.04.md
diff --git a/published/202206/20220518 Install Specific Package Version With Apt Command in Ubuntu.md b/published/202206/20220518 Install Specific Package Version With Apt Command in Ubuntu.md
new file mode 100644
index 0000000000..3fd0736890
--- /dev/null
+++ b/published/202206/20220518 Install Specific Package Version With Apt Command in Ubuntu.md
@@ -0,0 +1,193 @@
+[#]: subject: "Install Specific Package Version With Apt Command in Ubuntu"
+[#]: via: "https://itsfoss.com/apt-install-specific-version-2/"
+[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/"
+[#]: collector: "lkxed"
+[#]: translator: "robsean"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14760-1.html"
+
+如何在 Ubuntu 中安装具体指定的软件包版本
+======
+
+
+
+在 Ubuntu 中想安装一个软件包的一个特别指定的版本?你可以通过下面的方式来轻松地完成:
+
+```
+sudo apt install package_name=package_version
+```
+
+你如何知道某个软件包有哪些可用的版本?可以使用这个命令:
+
+```
+apt list --all-versions package_name
+```
+
+在下面的屏幕截屏中,你可以看到,我有两个可用的 VLC 版本,我使用命令来安装较旧的版本:
+
+![install specific versions apt ubuntu][1]
+
+听起来像一个简单的任务,对吧?但是事情并非看起来那么简单。这里有一些不确定是否会出现,但是可能会涉及的东西。
+
+这篇教程将涵盖使用 `apt` 或 `apt-get` 命令来安装一个具体指定的程序的版本的所有的重要的方面。
+
+### 安装一个具体指定版本的程序需要知道的事
+
+在基于 Ubuntu 和 Debian 发行版中,你需要知道一些关于 APT 和存储库是如何工作的知识。
+
+#### 同一个软件包源没有较旧的版本
+
+Ubuntu 在其存储库中不保留较旧版本的软件包。在特殊的情况下,你可以暂时性地看到多个版本。例如,你运行 APT 更新(但不升级)时,可能会有一个可用的新版本。在 APT 缓存中,你可以看到同一个软件包的两个版本。但是,一旦软件包被升级到了新的版本,较旧版本的软件包将从 **APT 缓存** 和存储库中移除。
+
+#### 使用多个软件包源来使用不同的版本
+
+为获取同一个的软件包的多个版本,你必须得添加多个软件包源。例如,VLC 是版本 3.x 系列。添加 [VLC 每日构建 PPA][2] 将会提供(不稳定的)版本 4.x 系列。
+
+同样,**你可以下载不同版本的 DEB 文件,并安装它**。
+
+#### 较高版本编号的版本通常有优先权
+
+如果你有来自多个软件包源的相同名称的软件,默认情况下,Ubuntu 将安装可用的最高版本编号的版本。
+
+在前面的示例中,如果我安装 VLC ,那么它将会安装 4.x 系列的版本,而不是 3.x 系列的版本。
+
+#### 较旧版本将升级到可用的较新版本
+
+这是另外一个可能存在的问题。即使你安装较旧版本的软件包,它也会升级到较新的版本(如果存在可用的较新版本)。你必须 [保留该软件包来防止其升级][3] 。
+
+#### 依赖关系也需要安装
+
+如果软件包有依赖关系,你也需要安装必要的依赖关系软件包。
+
+现在,你已经知道一些可能存在的问题,让我们看看如何解决它们。
+
+### 安装一个软件包的具体指定版本
+
+在这篇教程中,我将以 VLC 为例。在 Ubuntu 的存储库中可获得 VLC 版本。我添加了每日构建 PPA ,它将向我提供 VLC 的 4.0 版本的候选版本。
+
+如你所见,在现在的系统中,我有两个可用的 VLC 版本:
+
+![install specific versions apt ubuntu][4]
+
+```
+~$ apt list -a vlc
+Listing... Done
+vlc/jammy 4.0.0~rc1~~git20220516+r92284+296~ubuntu22.04.1 amd64
+vlc/jammy 3.0.16-1build7 amd64
+vlc/jammy 3.0.16-1build7 i386
+```
+
+因为较高版本编号版本有优先权,使用 `apt install vlc` 命令将会导致安装 VLC 的 4.0 版本。但是,因为这篇教程的缘由,我想安装较旧的版本 3.0.16 。
+
+```
+sudo apt install vlc=3.0.16-1build7
+```
+
+但是,这里会有这样的事。VLC 软件包有一些依赖关系,并且这些依赖关系也需要具体指定的版本。因此,在 Ubuntu 为其尝试安装最新的版本时,你将会遇到经典的 [你已保留残缺软件包][5] 错误。
+
+![problem installing specific version apt ubuntu][6]
+
+为修复这个错误,你需要为其提供它所投诉的所有依赖关系的软件包的具体指定版本。因此,该命令会变成这样:
+
+```
+sudo apt install vlc=3.0.16-1build7 \
+ vlc-bin=3.0.16-1build7 \
+ vlc-plugin-base=3.0.16-1build7 \
+ vlc-plugin-qt=3.0.16-1build7 \
+ vlc-plugin-video-output=3.0.16-1build7 \
+ vlc-l10n=3.0.16-1build7 \
+ vlc-plugin-access-extra=3.0.16-1build7 \
+ vlc-plugin-notify=3.0.16-1build7 \
+ vlc-plugin-samba=3.0.16-1build7 \
+ vlc-plugin-skins2=3.0.16-1build7 \
+ vlc-plugin-video-splitter=3.0.16-1build7 \
+ vlc-plugin-visualization=3.0.16-1build7
+```
+
+说明一下,每行结尾处的 `\` 只是用来将多行命令来写入同一个命令的一种方式。
+
+**它有作用吗?在很多情况下,它是有作用的。** 但是,我选择了一个复杂的 VLC 示例,它有很多依赖关系。甚至这些所涉及的依赖关系也依赖于其它的软件包。所以,它就变得令人难以处理。
+
+一种替代的方法是在安装时指定软件包源。
+
+#### 替代方式,指定存储库
+
+你已经添加多个软件包源,因此,你应该对这些软件包的来源有一些了解。
+
+使用下面的命令来搜索存储库:
+
+```
+apt-cache policy | less
+```
+
+注意存储库名称后面的行:
+
+```
+500 http://security.ubuntu.com/ubuntu jammy-security/multiverse i386 Packages
+ release v=22.04,o=Ubuntu,a=jammy-security,n=jammy,l=Ubuntu,c=multiverse,b=i386
+ origin security.ubuntu.com
+```
+
+你可以具体指定 `o`、`l`、`a` 等参数。
+
+在我原来的示例中,我想安装来自 Ubuntu 存储库的 VLC(获取版本 3.16),而不是安装来 PPA 的版本(它将向我提供版本 4)。
+
+因此,下面的命令将安装 VLC 版本 3.16 及其所有的依赖关系:
+
+```
+sudo apt install -t "o=ubuntu" vlc
+```
+
+![install from repository source][7]
+
+看起来令人满意?但是,当你必须更新系统时,问题就来了。它接下来会控诉找不到指定的软件包版本。
+
+**还能做什么?**
+
+为安装较旧的软件包版本,从你的系统中移除较新版本的软件包源(如果可能的话)。它将有助于逃脱这些依赖关系地狱。
+
+如果不能这么做,检查你是否可以从其它一些软件包的打包格式来获取,像 Snap、Flatpak、AppImage 等等。事实上,Snap 和 Flatpak 也允许你从可用的版本中选择和安装。因为这些应用程序是沙盒模式的,所以它很容易管理不同版本的依赖关系。
+
+#### 保留软件包,防止升级
+
+如果你完成安装一个指定的程序版本,你可能想避免意外地升级到较新的版本。实现这一点并不太复杂。
+
+```
+sudo apt-mark hold package_name
+```
+
+你可以免除保留软件包,以便它能稍后升级:
+
+```
+sudo apt-mark unhold package_name
+```
+
+注意,软件包的依赖关系不会自动地保留。它们需要单独地指明。
+
+### 结论
+
+如你所见,安装选定软件包版本有一定之规。只有当软件包有依赖关系时,那么事情就会变得复杂,然后,你就会进入依赖关系地狱。
+
+我希望你在这篇教程中学到一些新的东西。如果你有问题或建议来改善它,请在评论区告诉我。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/apt-install-specific-version-2/
+
+作者:[Abhishek Prakash][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://itsfoss.com/author/abhishek/
+[b]: https://github.com/lkxed
+[1]: https://itsfoss.com/wp-content/uploads/2022/05/install-specific-versions-apt-ubuntu.png
+[2]: https://launchpad.net/~videolan/+archive/ubuntu/master-daily
+[3]: https://itsfoss.com/prevent-package-update-ubuntu/
+[4]: https://itsfoss.com/wp-content/uploads/2022/05/install-specific-versions-apt-ubuntu.png
+[5]: https://itsfoss.com/held-broken-packages-error/
+[6]: https://itsfoss.com/wp-content/uploads/2022/05/problem-installing-specific-version-apt-ubuntu-800x365.png
+[7]: https://itsfoss.com/wp-content/uploads/2022/05/install-from-repository-source-800x578.png
diff --git a/published/20220519 Use this open source screen reader on Windows.md b/published/202206/20220519 Use this open source screen reader on Windows.md
similarity index 100%
rename from published/20220519 Use this open source screen reader on Windows.md
rename to published/202206/20220519 Use this open source screen reader on Windows.md
diff --git a/published/20220523 7 pieces of Linux advice for beginners.md b/published/202206/20220523 7 pieces of Linux advice for beginners.md
similarity index 100%
rename from published/20220523 7 pieces of Linux advice for beginners.md
rename to published/202206/20220523 7 pieces of Linux advice for beginners.md
diff --git a/published/20220524 Collision- Linux App to Verify ISO and Other Files.md b/published/202206/20220524 Collision- Linux App to Verify ISO and Other Files.md
similarity index 100%
rename from published/20220524 Collision- Linux App to Verify ISO and Other Files.md
rename to published/202206/20220524 Collision- Linux App to Verify ISO and Other Files.md
diff --git a/published/20220524 How to Install KVM on Ubuntu 22.04 -Jammy Jellyfish-.md b/published/202206/20220524 How to Install KVM on Ubuntu 22.04 -Jammy Jellyfish-.md
similarity index 100%
rename from published/20220524 How to Install KVM on Ubuntu 22.04 -Jammy Jellyfish-.md
rename to published/202206/20220524 How to Install KVM on Ubuntu 22.04 -Jammy Jellyfish-.md
diff --git a/published/20220525 Machine Learning- Classification Using Python.md b/published/202206/20220525 Machine Learning- Classification Using Python.md
similarity index 100%
rename from published/20220525 Machine Learning- Classification Using Python.md
rename to published/202206/20220525 Machine Learning- Classification Using Python.md
diff --git a/published/20220525 Package is -set to manually installed-- What does it Mean-.md b/published/202206/20220525 Package is -set to manually installed-- What does it Mean-.md
similarity index 100%
rename from published/20220525 Package is -set to manually installed-- What does it Mean-.md
rename to published/202206/20220525 Package is -set to manually installed-- What does it Mean-.md
diff --git a/published/20220527 TypeScript Based Headless CMS -Payload- Becomes Open Source.md b/published/202206/20220527 TypeScript Based Headless CMS -Payload- Becomes Open Source.md
similarity index 100%
rename from published/20220527 TypeScript Based Headless CMS -Payload- Becomes Open Source.md
rename to published/202206/20220527 TypeScript Based Headless CMS -Payload- Becomes Open Source.md
diff --git a/published/20220529 Compile GNOME Shell and Apps From Source [Beginner-s Guide].md b/published/202206/20220529 Compile GNOME Shell and Apps From Source [Beginner-s Guide].md
similarity index 100%
rename from published/20220529 Compile GNOME Shell and Apps From Source [Beginner-s Guide].md
rename to published/202206/20220529 Compile GNOME Shell and Apps From Source [Beginner-s Guide].md
diff --git a/published/20220530 Dynamically linking libraries while compiling code.md b/published/202206/20220530 Dynamically linking libraries while compiling code.md
similarity index 100%
rename from published/20220530 Dynamically linking libraries while compiling code.md
rename to published/202206/20220530 Dynamically linking libraries while compiling code.md
diff --git a/published/20220530 Using a Machine Learning Model to Make Predictions.md b/published/202206/20220530 Using a Machine Learning Model to Make Predictions.md
similarity index 100%
rename from published/20220530 Using a Machine Learning Model to Make Predictions.md
rename to published/202206/20220530 Using a Machine Learning Model to Make Predictions.md
diff --git a/published/20220601 GNOME Shell for Mobile- A Promising Start with Huge Expectations [Opinion].md b/published/202206/20220601 GNOME Shell for Mobile- A Promising Start with Huge Expectations [Opinion].md
similarity index 100%
rename from published/20220601 GNOME Shell for Mobile- A Promising Start with Huge Expectations [Opinion].md
rename to published/202206/20220601 GNOME Shell for Mobile- A Promising Start with Huge Expectations [Opinion].md
diff --git a/published/20220601 How to Create Local Yum-DNF Repository on RHEL 9.md b/published/202206/20220601 How to Create Local Yum-DNF Repository on RHEL 9.md
similarity index 100%
rename from published/20220601 How to Create Local Yum-DNF Repository on RHEL 9.md
rename to published/202206/20220601 How to Create Local Yum-DNF Repository on RHEL 9.md
diff --git a/published/20220601 Linux Lite 6.0 Ditches Firefox to Favor Google Chrome as the Default Browser.md b/published/202206/20220601 Linux Lite 6.0 Ditches Firefox to Favor Google Chrome as the Default Browser.md
similarity index 100%
rename from published/20220601 Linux Lite 6.0 Ditches Firefox to Favor Google Chrome as the Default Browser.md
rename to published/202206/20220601 Linux Lite 6.0 Ditches Firefox to Favor Google Chrome as the Default Browser.md
diff --git a/published/20220601 de-Googled -e-OS v1 Released Along with a New Brand -Murena- for Smartphone and Cloud Services.md b/published/202206/20220601 de-Googled -e-OS v1 Released Along with a New Brand -Murena- for Smartphone and Cloud Services.md
similarity index 100%
rename from published/20220601 de-Googled -e-OS v1 Released Along with a New Brand -Murena- for Smartphone and Cloud Services.md
rename to published/202206/20220601 de-Googled -e-OS v1 Released Along with a New Brand -Murena- for Smartphone and Cloud Services.md
diff --git a/published/20220602 Linux Mint to Maintain Timeshift Backup Tool as an XApp.md b/published/202206/20220602 Linux Mint to Maintain Timeshift Backup Tool as an XApp.md
similarity index 100%
rename from published/20220602 Linux Mint to Maintain Timeshift Backup Tool as an XApp.md
rename to published/202206/20220602 Linux Mint to Maintain Timeshift Backup Tool as an XApp.md
diff --git a/translated/talk/20220602 Why Do Enterprises Use and Contribute to Open Source Software.md b/published/202206/20220602 Why Do Enterprises Use and Contribute to Open Source Software.md
similarity index 50%
rename from translated/talk/20220602 Why Do Enterprises Use and Contribute to Open Source Software.md
rename to published/202206/20220602 Why Do Enterprises Use and Contribute to Open Source Software.md
index 4a429461a0..e0feb992ca 100644
--- a/translated/talk/20220602 Why Do Enterprises Use and Contribute to Open Source Software.md
+++ b/published/202206/20220602 Why Do Enterprises Use and Contribute to Open Source Software.md
@@ -3,27 +3,32 @@
[#]: author: "Dan Whiting https://www.linuxfoundation.org/blog/why-do-enterprises-use-and-contribute-to-open-source-software/"
[#]: collector: "lkxed"
[#]: translator: "aREversez"
-[#]: reviewer: " "
-[#]: publisher: " "
-[#]: url: " "
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14725-1.html"
企业为何使用开源软件,又为何推动开源软件的发展
======
-每当人们知道我在 Linux 基金会 工作,他们总是会问我们的工作具体是做什么的。有时候,他们会一直问我是不是开发 Linux 操作系统的。我只能回答说,我们做的是开源软件,并试图在他们失去兴趣之前,将对世界的重大影响赌在短短的 20 秒上。如果他们的兴趣还在,想要进一步了解,我就会给他们深入分析一番:企业为何想参与到开源软件项目之中?它们为何会使用开源软件?没错,企业确实会这样做,无论它们有没有意识到这一点。此外,成千上万的企业会将企业内部代码捐给开源项目,为推动开源软件的进一步开发和优化投入大量的时间和资源。
+
+
+
+每当人们知道我在 Linux 基金会 工作,他们总是会问我们的工作具体是做什么的。有时候,他们会一直问我是不是开发 Linux 操作系统的。我只能回答说,我们做的是开源软件,并试图在他们失去兴趣之前,在短短的 20 秒钟内介绍它对世界的影响力。如果他们的兴趣还在,想要进一步了解,我就会给他们深入分析一番:企业为何想参与到开源软件项目之中?它们为何会使用开源软件?没错,企业确实会这样做,无论它们有没有意识到这一点。此外,成千上万的企业会将企业内部代码捐给开源项目,为推动开源软件的进一步开发和优化投入大量的时间和资源。
### 开源软件的使用范围有多广
-引用我们基金会最近发表的一项报告 《企业开源指南》,“开源软件(OSS)改变了世界,是数字经济的支柱,数字世界的基石。从我们日常使用的互联网和移动应用到开拓未来的操作系统和程序语言,开源软件无不发挥着重要的作用,可谓是科技行业的命脉。在今天,开源软件驱动数字经济发展,推进科学技术取得突破,不断改善人们的生活水平。手机、汽车和飞机等设备,家庭、企业和政府等群体都在使用着开源软件。但就在 20 年前,开源软件还仅仅为少数人所知,为少数热心爱好者们组成的群体所用。”
+引用我们最近发表的一项报告《企业开源指南》:“开源软件(OSS)改变了世界,是数字经济的支柱,数字世界的基石。从我们日常使用的互联网和移动应用到开拓未来的操作系统和编程语言,开源软件无不发挥着重要的作用,可谓是科技行业的命脉。在今天,开源软件驱动数字经济发展,推进科学技术取得突破,不断改善人们的生活水平。手机、汽车和飞机等设备,家庭、企业和政府等群体都在使用着开源软件。但就在 20 年前,开源软件还仅仅为少数人所知,它的使用也仅限于一小部分专门的爱好者。”
-如今,情况可大不相同了:
+开源软件(OSS)已经改变了我们的世界,成为我们数字经济的支柱和数字世界的基础。
-* 在各行业的 垂类软件栈 中,开源软件的占比达到了 20%-85%。
+而它实际上:
+
+* 在各行业的 垂类软件栈 中,开源软件的占比达到了 20% - 85%。
* 超过 90% 的网站服务器和联网设备都依靠 Linux 来运行。
* 安卓手机系统也是基于 Linux 内核。
* 用于应用程序开发的 AMP、Appium、Dojo、jQuery、Marko、Node.js 等 [主流的库和工具][1] 均属于开源项目。
* 世界上排名位列前 100 名的超级计算机都在使用 Linux。
* 大型机客户均在使用 Linux。
-* AWS、Google 以及 Microsoft 三大云服务供应商都在使用开源软件运行服务,策划并在云端发起开源解决方案。
+* 亚马逊、谷歌以及微软三大云服务供应商都在使用开源软件运行服务,并在云端托管开源解决方案。
### 企业为何想参与到开源软件项目之中
@@ -35,7 +40,7 @@
人们经常会问,为什么这些企业愿意放弃自家软件的所有权?为什么它们不让员工专攻自家软件的开发呢?
-从整体上来看,这一问题的答案就是,企业和组织聚集起来,合力解决共同的难题,如此一来,他们就可以各自专注于在这基础上的各类难题。这些企业明白,将资源聚集在一起,能够更好地解决基础问题。有时,这种现象被叫做“竞合”,大概的意思是企业在一些领域可能互为竞争对手,但是它们在另一些领域则会互相合作。
+从整体上来看,这一问题的答案就是,企业和组织聚集起来,合力解决共同的难题,如此一来,他们就可以各自专注于在这基础上的各类难题。这些企业明白,将资源聚集在一起,能够更好地解决基础问题。有时,这种现象被叫做“竞合”,大概的意思是企业在一些领域可能互为竞争对手,但是它们在另一些领域则会互相合作。
“竞合”现象的一些典型例子:
@@ -45,25 +50,19 @@
如今,企业、组织以及个体在合力解决难题的同时,也在不断地改进自身的产品与业务。
-[来此加密][2] 是一个免费开放的自动化证书颁发机构,旨在通过简化安装程序,减低安装费用,快速扩大安全网络协议的应用范围。该机构为超过 2.25 亿个网站提供服务,每天平均发放证书约 150 万张。
+* [来此加密][2](LCTT译注:Let’s Encrypt 官网并没有用“来此加密”这样的称呼,但是在一些场合有这样的译名。我们认为此翻译很贴切。) 是一个免费的、开放的自动化证书颁发机构,旨在通过简化安装程序,减低安装费用,快速扩大安全网络协议的应用范围。该机构为超过 2.25 亿个网站提供服务,每天平均发放证书约 150 万张。
+* 好莱坞成立的 [学院软件基金会][3] 通过共同开发软件,推动娱乐、游戏和媒体等产业的增长,为产业发展提供开放标准,在电影行业内 [创造了巨大的价值][4]。
+* 超级账本 基金会管理多个企业级区块链软件项目。众所周知,这些项目 [消耗的能源远比其他解决方案要少][5]。
+* [LF 能源基金会][6] 推动 [电网朝着更加模块化、互操作和可拓展的方向发展][7],助力提升可再生能源的利用率。
+* [无人机代码基金会][8] 致力于无人机软件的开发,促进企业在无人机领域进一步开拓创新。
+* [开源软件软件安全基金会][9] 聚集了顶尖的科技企业,共同强化开源软件的安全与韧性。
+* [Kubernetes][10] 是 Google 捐赠给 Linux 基金会下属的云原生计算基金会(CNCF)的一个项目,是管理基于云计算软件的首选方案。
-好莱坞成立的 [学院软件基金会][3] 通过共同开发软件,推动娱乐、游戏和媒体等产业的增长,为产业发展提供开放标准,在电影行业内 [创造了巨大的价值][4]。
-
-超级账本 基金会发起了多个企业级区块链软件项目。众所周知,这些项目 [消耗的能源远比其他解决方案要少][5]。
-
-[LF Energy 基金会][6] 推动 [电网朝着更加模块化、互操作和可拓展的方向发展][7],助力提升可再生能源的利用率。
-
-[Dronecode 基金会][8] 致力于无人机软件的开发,促进企业在无人机领域进一步开拓创新。
-
-[开源软件软件安全基金会][9] 聚集了顶尖的科技企业,共同强化开源软件的安全与韧性。
-
-[Kubernetes][10] 是 Google 捐赠给 Linux 基金会下属的云原生计算基金会(CNCF)的一个项目,是管理基于云计算软件的首选方案。
-
-上述只是企业参与的一小部分开源软件项目,点击[此处][11],在 Linux 基金会官网浏览全部项目列表。
+上述只是企业参与的一小部分开源软件项目,点击 [此处][11],可以在 Linux 基金会官网浏览全部项目列表。
### 企业如何有效利用和参与开源软件项目?
-若想要更好地利用开源项目,更有效地参与开源项目,企业可以向 Linux 基金会寻求帮助。我们最新发布的报告 [《企业开源指南》][12] 提供了企业与组织需要了解的大部分信息。这份报告凝聚了来自多家顶级企业、具有几十年丰富经验的开源领袖的知识与智慧,报告主要分为以下六个章节:
+若想要更好地利用开源项目,更有效地参与开源项目,企业可以向 Linux 基金会寻求帮助。我们最新发布的报告 《[企业开源指南][12]》 提供了企业与组织需要了解的大部分信息。这份报告凝聚了来自多家顶级企业、具有几十年丰富经验的开源领袖的知识与智慧,报告主要分为以下六个章节:
* 使用开源软件
* 准备参与开源
@@ -74,19 +73,16 @@
此外,Linux 基金会还提供了许多开源 [培训课程][13]、全年 [活动][14]、[LFX 平台][15],发起开源项目,协助企业与组织利用和参与开源项目,比如:
-[TODO 工作组][16] 为开源项目办公室的建立和运作提供资源,包括其自身 [丰富的指导意见][17]。
+* [TODO 工作组][16] 为开源项目办公室的建立和运作提供资源,包括其自身 [丰富的指导意见][17]。
+* [Openchain 项目][18] 旨在提供和维护国际开源许可标准,包括各种许可规定的相关信息。依赖于此,企业可以确保自身行为符合法律规定。
+* [FinOps 基金会][19] 目前正在将自身打造为“不断发展的云财务管理和文化实践平台,通过促进工程、财务、技术以及商业团队之间在数据驱动支出决策方面的合作,确保企业能够最大化实现商业价值”。
+* [软件数据包交换标准][20](SPDX)是一个用于交流 软件物料清单(SBOM)的开放标准。在该标准下,每个用户都能清楚了解整个软件包中包括哪些软件。
-[Openchain 项目][18] 旨在提供和维护国际开源许可标准,包括各种许可规定的相关信息。依赖于此,企业可以确保自身行为符合法律规定。
-
-[FinOps 基金会][19] 目前正在将自身打造为“不断发展的云财务管理和文化实践平台,通过促进工程、财务、技术以及商业团队之间在数据驱动支出决策方面的合作,确保企业能够最大化实现商业价值”。
-
-[Software Data Package Exchange (SPDX)][20] 是一个用于交流 软件构成清单(SBOMs)的开放标准。在该标准下,每个用户都能清楚了解整个软件包中包括哪些软件。
-
-重复一遍,上述这些只是 Linux 基金会所有项目中的一小部分。所有这些项目都致力于帮助企业接受和使用开源项目,引导企业为开源项目做出贡献、提供捐赠。
+同样,上述这些只是 Linux 基金会所有项目中的一小部分。所有这些项目都致力于帮助企业接受和使用开源项目,引导企业为开源项目做出贡献、提供捐赠。
总而言之,目前,企业正在迅速投向开源软件项目,借此解决共同的难题,并探索进一步的创新发展,而 Linux 基金会将为它们提供帮助。
-该文 [《企业为何使用开源软件,又为何推动开源软件的发展》][21] 首发于 [Linux 基金会][22] 官网。
+*该文 [《企业为何使用开源软件,又为何推动开源软件的发展》][21] 首发于 [Linux 基金会][22] 官网。*
--------------------------------------------------------------------------------
@@ -95,7 +91,7 @@ via: https://www.linux.com/news/why-do-enterprises-use-and-contribute-to-open-so
作者:[Dan Whiting][a]
选题:[lkxed][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/20220603 How to Install FFmpeg in Ubuntu and Other Linux.md b/published/202206/20220603 How to Install FFmpeg in Ubuntu and Other Linux.md
similarity index 100%
rename from published/20220603 How to Install FFmpeg in Ubuntu and Other Linux.md
rename to published/202206/20220603 How to Install FFmpeg in Ubuntu and Other Linux.md
diff --git a/published/20220605 Contribute at the Fedora Linux 37 Test Week for Kernel 5.18.md b/published/202206/20220605 Contribute at the Fedora Linux 37 Test Week for Kernel 5.18.md
similarity index 100%
rename from published/20220605 Contribute at the Fedora Linux 37 Test Week for Kernel 5.18.md
rename to published/202206/20220605 Contribute at the Fedora Linux 37 Test Week for Kernel 5.18.md
diff --git a/published/20220606 6 Linux word processors you need to try.md b/published/202206/20220606 6 Linux word processors you need to try.md
similarity index 100%
rename from published/20220606 6 Linux word processors you need to try.md
rename to published/202206/20220606 6 Linux word processors you need to try.md
diff --git a/published/20220606 Amberol is a Stunning Looking Music Player for Linux That Just Plays Music and Nothing Else.md b/published/202206/20220606 Amberol is a Stunning Looking Music Player for Linux That Just Plays Music and Nothing Else.md
similarity index 100%
rename from published/20220606 Amberol is a Stunning Looking Music Player for Linux That Just Plays Music and Nothing Else.md
rename to published/202206/20220606 Amberol is a Stunning Looking Music Player for Linux That Just Plays Music and Nothing Else.md
diff --git a/translated/tech/20220607 How Garbage Collection works inside a Java Virtual Machine.md b/published/202206/20220607 How Garbage Collection works inside a Java Virtual Machine.md
similarity index 68%
rename from translated/tech/20220607 How Garbage Collection works inside a Java Virtual Machine.md
rename to published/202206/20220607 How Garbage Collection works inside a Java Virtual Machine.md
index e102895b7c..cd4ed74084 100644
--- a/translated/tech/20220607 How Garbage Collection works inside a Java Virtual Machine.md
+++ b/published/202206/20220607 How Garbage Collection works inside a Java Virtual Machine.md
@@ -3,17 +3,16 @@
[#]: author: "Jayashree Huttanagoudar https://opensource.com/users/jayashree-huttanagoudar"
[#]: collector: "lkxed"
[#]: translator: "lkxed"
-[#]: reviewer: " "
-[#]: publisher: " "
-[#]: url: " "
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14742-1.html"
JVM 垃圾回收的工作原理
======
-对于程序员来说,掌握 Java 的内存管理机制并不是必须的,但它能够帮助你更好地理解 JVM 是如何处理程序中的变量和类实例的。
-![咖啡豆][1]
+
-图源:Pixabay. CC0.
+> 对于程序员来说,掌握 Java 的内存管理机制并不是必须的,但它能够帮助你更好地理解 JVM 是如何处理程序中的变量和类实例的。
Java 之所以能够如此流行,自动 垃圾回收(GC)功不可没,它也是 Java 最重要的几个特性之一。在这篇文章中,我将说明为什么垃圾回收如此重要。本文的主要内容为:自动的分代垃圾回收、JVM 划分内存的依据,以及 JVM 垃圾回收的工作原理。
@@ -21,10 +20,10 @@ Java 之所以能够如此流行,自动 垃圾回收
` 标签之后的图片)。
--------------------------------------------------------------------------------
@@ -135,7 +134,7 @@ via: https://opensource.com/article/22/6/analyze-web-pages-python-requests-beaut
作者:[Seth Kenlon][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/translated/news/20220616 Mattermost Extends workflow platform with 7.0 release.md b/published/202206/20220616 Mattermost Extends workflow platform with 7.0 release.md
similarity index 77%
rename from translated/news/20220616 Mattermost Extends workflow platform with 7.0 release.md
rename to published/202206/20220616 Mattermost Extends workflow platform with 7.0 release.md
index 9544f28d66..042d200389 100644
--- a/translated/news/20220616 Mattermost Extends workflow platform with 7.0 release.md
+++ b/published/202206/20220616 Mattermost Extends workflow platform with 7.0 release.md
@@ -3,12 +3,13 @@
[#]: author: "Laveesh Kocher https://www.opensourceforu.com/author/laveesh-kocher/"
[#]: collector: "lkxed"
[#]: translator: "lkxed"
-[#]: reviewer: " "
-[#]: publisher: " "
-[#]: url: " "
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14738-1.html"
Mattermost 7.0 发布,扩展了工作流平台
======
+
![Mattermost][1]
自 2016 年开源以来,Mattermost 一直在开发一个具有不断增加的用例的消息传递平台。6 月 16 日,Mattermost 7.0 平台发布,其中包括了新的语音呼叫、工作流模板和用于开源技术的应用框架。新版本扩展了 2021 年 10 月发布的 6.0 版本引入的功能。一直以来,Mattermost 都在与包括 Slack、Atlassian 和 Asana 在内的几家大公司,竞争不断增长的协作工具市场。另一方面,Mattermost 侧重于对开发者的支持,尽管该平台也可用于安全和 IT 运营。
@@ -17,11 +18,11 @@ Mattermost 的软件同时提供有商业版和开源版,目前它们都升级
Tien 认为开源也关乎社区贡献。Mattermost 开源项目有超过 4000 名个人贡献者,他们贡献了超过 30000 行代码。
-以前,Mattermost 依赖集成第三方呼叫服务(例如 Zoom)来启用语音呼叫功能。在 7.0 版本中,它通过开源 WebRTC 协议引入了呼叫功能的直接集成,所有现代 Web 浏览器都支持该协议。直接集成呼叫功能的目标是为写作提供单一平台,这符合 Tien 对该平台的总体愿景。现在,除了提供集成工具以实现协作之外,该平台还会增加“工作流模板”功能,以帮助(用户)组织构建可重复的流程。
+以前,Mattermost 依赖集成第三方呼叫服务(例如 Zoom)来启用语音呼叫功能。在 7.0 版本中,它通过开源 WebRTC 协议引入了呼叫功能的直接集成,所有现代 Web 浏览器都支持该协议。直接集成呼叫功能的目标是为协作提供单一平台,这符合 Tien 对该平台的总体愿景。现在,除了提供集成工具以实现协作之外,该平台还会增加“工作流模板”功能,以帮助(用户)组织构建可重复的流程。
-工作流概念采用了 剧本playbooks,其中包含了为“特定类型的操作”所执行的动作和操作的清单。例如,在发生服务故障或网络安全事件时,公司可以为事件响应创建工作流模板。
+工作流概念采用了 剧本playbook,其中包含了为“特定类型的操作”所执行的动作和操作的清单。例如,在发生服务故障或网络安全事件时,公司可以为事件响应创建工作流模板。
-这个清单可以链接到 Mattermost 操作,例如让特定用户发起呼叫,并协助生成报告。Tien 表示,Mattermost 还与常见的开发者工具集成,并且工作流模板的功能将随着时间的推移而扩展,以便使用第三方工具来实现更多自动化。
+这个清单可以链接到 Mattermost 操作operation,例如让特定用户发起呼叫,并协助生成报告。Tien 表示,Mattermost 还与常见的开发者工具集成,并且工作流模板的功能将随着时间的推移而扩展,以便使用第三方工具来实现更多自动化。
--------------------------------------------------------------------------------
@@ -30,7 +31,7 @@ via: https://www.opensourceforu.com/2022/06/mattermost-extends-workflow-platform
作者:[Laveesh Kocher][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/translated/news/20220616 The Travis CI Vulnerability Exposes Sensitive Open Source Project Credentials.md b/published/202206/20220616 The Travis CI Vulnerability Exposes Sensitive Open Source Project Credentials.md
similarity index 79%
rename from translated/news/20220616 The Travis CI Vulnerability Exposes Sensitive Open Source Project Credentials.md
rename to published/202206/20220616 The Travis CI Vulnerability Exposes Sensitive Open Source Project Credentials.md
index 607aa17ec8..396d198271 100644
--- a/translated/news/20220616 The Travis CI Vulnerability Exposes Sensitive Open Source Project Credentials.md
+++ b/published/202206/20220616 The Travis CI Vulnerability Exposes Sensitive Open Source Project Credentials.md
@@ -3,13 +3,14 @@
[#]: author: "Laveesh Kocher https://www.opensourceforu.com/author/laveesh-kocher/"
[#]: collector: "lkxed"
[#]: translator: "lkxed"
-[#]: reviewer: " "
-[#]: publisher: " "
-[#]: url: " "
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14724-1.html"
Travis CI 漏洞暴露了敏感的开源项目凭证
======
-![Travis CI][1]
+
+
Travis CI 持续集成工具中的一个缺陷暴露了来自数千个在线开源项目的敏感数据。这并不是该软件第一次遇到此类安全问题。
@@ -17,9 +18,9 @@ Travis CI 是一个持续集成工具,它帮助软件开发者实现自动化
攻击者可以从这些明文存储的日志中,提取出用于登录 GitHub、Docker Hub 和 AWS 等云服务的用户身份验证令牌。研究人员在 800 万份日志样本中,发现了 70000 多个敏感令牌和其他机密凭证。Aqua 团队认为“所有 Travis CI 免费用户都有可能暴露”。根据 2019 年的数据,Travis CI 被超过 60 万名独立用户,用于超过 932977 个开源项目。
-这种对高级用户凭证的访问,会给使用该产品的软件开发者及其客户带来风险。“趋势科技”英国和爱尔兰安全技术总监 Bharat Mistry 解释道:“如果攻击者获得了这些凭据,就没有什么能阻止他们将恶意代码引入库或构建过程。这个缺陷无疑会导致数字供应链攻击。”
+这种对高级用户凭证的访问,会给使用该产品的软件开发者及其客户带来风险。趋势科技英国和爱尔兰安全技术总监 Bharat Mistry 解释道:“如果攻击者获得了这些凭据,就没有什么能阻止他们将恶意代码引入库或构建过程。这个缺陷无疑会导致数字供应链攻击。”
-供应链攻击可能极具破坏性。2020 年的 太阳风Solar Winds 攻击,使国家资助的俄罗斯黑客能够访问数千家企业和政府组织的系统。2021 年的 Kaseya 供应链攻击,使犯罪分子可以同时加密 1500 多家公司的数据,将他们全部扣为人质。
+供应链攻击可能极具破坏性。2020 年的 太阳风Solar Winds 攻击,使国家资助的俄罗斯黑客能够访问数千家企业和政府组织的系统。2021 年的 Kaseya 供应链攻击,使犯罪分子可以同时加密 1500 多家公司的数据,将它们全部扣为人质。
--------------------------------------------------------------------------------
@@ -28,7 +29,7 @@ via: https://www.opensourceforu.com/2022/06/the-travis-ci-vulnerability-exposes-
作者:[Laveesh Kocher][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/translated/news/20220616 Ubuntu Core 22 is Here for IoT and Edge Devices.md b/published/202206/20220616 Ubuntu Core 22 is Here for IoT and Edge Devices.md
similarity index 84%
rename from translated/news/20220616 Ubuntu Core 22 is Here for IoT and Edge Devices.md
rename to published/202206/20220616 Ubuntu Core 22 is Here for IoT and Edge Devices.md
index 22c6d65cd1..8d55013527 100644
--- a/translated/news/20220616 Ubuntu Core 22 is Here for IoT and Edge Devices.md
+++ b/published/202206/20220616 Ubuntu Core 22 is Here for IoT and Edge Devices.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-14730-1.html"
Ubuntu Core 22 来了,适用于物联网和边缘设备
======
-Ubuntu Core 22 基于 Ubuntu 22.04 LTS,为物联网和嵌入式设备带来了最佳的安全性和性能。
+
+> Ubuntu Core 22 基于 Ubuntu 22.04 LTS,为物联网和嵌入式设备带来了最佳的安全性和性能。
![Ubuntu][1]
@@ -19,7 +20,7 @@ Ubuntu Core 22 是一个容器化的 Ubuntu 22.04 LTS 变体,针对嵌入式
在发布 Ubuntu Core 22 时,Canonical 的 CEO **Mark Shuttleworth** 说:
-> “Canonical 的目标是在任何地方提供安全、可靠的开源技术,从开发环境到云,再到边缘和设备。”
+> “Canonical 的目标是在从开发环境到云、再到边缘和设备的任何地方提供安全、可靠的开源技术。”
### Ubuntu Core 22 更新介绍
@@ -31,11 +32,11 @@ Ubuntu Core 22 版本带来了针对安全性和可靠性的改进。其中包
正如公告中提到的,Ubuntu 22.04 LTS 提供了一个实时内核(测试版可用),它能为那些时间敏感的工业、汽车和机器人用例,提供高性能、超低延迟和工作负载可预测性。
-此外,如果你有 Ubuntu 认证的硬件,你还能充分利用高级的实时功能。
+此外,如果你有 Ubuntu 认证的硬件,你还能充分利用先进的实时功能。
#### Snapcraft 框架
-整个 Ubuntu 映像分解为许多个包(快照),使得内核、操作系统和应用程序隔离在一个沙箱中。
+整个 Ubuntu 镜像分解为许多个包(Snap),使得内核、操作系统和应用程序隔离在一个沙箱中。
这可以让你轻松地安装应用程序,而无需担心来自专用 物联网应用商店IoT App Store 的依赖。对于企业而言,通过软件商店进行的软件管理解决方案,应该能够带来一系列内部部署的机会。
@@ -64,7 +65,7 @@ via: https://news.itsfoss.com/ubuntu-core-22-release/
作者:[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/202206/20220617 Ubuntu Runs on a Google Nest Hub, Wait, What-.md b/published/202206/20220617 Ubuntu Runs on a Google Nest Hub, Wait, What-.md
new file mode 100644
index 0000000000..922e3169ab
--- /dev/null
+++ b/published/202206/20220617 Ubuntu Runs on a Google Nest Hub, Wait, What-.md
@@ -0,0 +1,89 @@
+[#]: subject: "Ubuntu Runs on a Google Nest Hub, Wait, What?"
+[#]: via: "https://news.itsfoss.com/ubuntu-google-nest/"
+[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/"
+[#]: collector: "lkxed"
+[#]: translator: "lkxed"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14746-1.html"
+
+Ubuntu 可以运行在谷歌 Nest Hub 上了?!
+======
+
+> 一名安全专家成功地在谷歌 Nest Hub(第 2 代)上运行了 Ubuntu,嗯,然后呢?
+
+![Ubuntu Google][1]
+
+我刚刚看到了一个关于在谷歌 Nest Hub(第 2 代)上运行的 Ubuntu 的消息。
+
+嗯,这实在是让人兴奋!
+
+所以,让我在这里分享更多关于它的信息吧。
+
+### 破解谷歌 Nest Hub 以安装 Ubuntu
+
+是的,破解使得这成为可能。
+
+网络安全专家 Frédéric Basse 破解了谷歌 Nest Hub(第 2 代)的安全启动,并成功运行 Ubuntu。
+
+当然,谷歌 Nest Hub 并没有正式支持启动一个自定义操作系统。但是,Fred 使用了一个安全漏洞,从而成功运行了 Ubuntu。
+
+虽然这很有趣,但对于始终在线的谷歌智能家居显示器来说,这也是一个严重的安全问题。
+
+
+
+正如这位安全专家在 [博客文章][2] 中所解释的,他使用了树莓派 Pico 微控制器,利用引导加载程序中的 USB 漏洞,从而破坏了安全启动链。
+
+这位安全专家得出结论:
+
+> 因此,攻击者可以通过插入恶意 USB 设备并按下两个按钮,从而在早期启动阶段(内核执行之前)执行任意代码。
+
+如果你想进行实验(适合安全研究人员),他还在 [GitHub][3] 上提供了相关代码(关于如何利用这个引导加载程序漏洞)。
+
+### 让 Ubuntu 在 Google Nest 上运行
+
+![][4]
+
+该漏洞允许攻击者启动未签名的操作系统。但是,在那之前,攻击者必须对为树莓派(64 位 ARM 版)量身定制的预装 Ubuntu 镜像进行一些修改。
+
+这位安全专家还提到了以下内容:
+
+> 我们构建了一个自定义 U-Boot 引导加载程序,禁用了安全引导,并更改了引导流程以从 USB 闪存驱动器加载环境。我们还为 elaine 构建了一个自定义 Linux 内核,其中包括包括了一些 [额外驱动,例如 USB 鼠标][5] 。重新打包了来自 Ubuntu 的初始 ramdisk(initrd),以集成触摸屏所需的固件二进制文件。引导镜像是基于自定义 Linux 内核和修改的 initrd 创建的。
+
+因此,很明显,你不会获得完整的 Ubuntu 体验,但由于该漏洞,我们现在知道,如果你愿意破解 谷歌 Nest 进行测试的话(真心不建议!),Ubuntu 是可以在谷歌 Nest 上作运行的。
+
+### 智能家居安全担忧 + Linux
+
+网络安全专家指出,该漏洞已在上游(两次)修复。
+
+但是,研究人员也指出,缺乏分配的 CVE 编号可能会导致修复程序无法向下游传播。
+
+毫无疑问,看到有人在不受支持的设备上运行 Linux 真是太棒了。这让我思考,我们是否应该也制造一些 **由 Linux 驱动的商业智能家居设备?**
+
+*或者说,已经有类似的东西了吗?*
+
+然而,智能家居设备容易受到简单攻击,也同样令人担忧。
+
+你怎么看?在下面的评论中分享你的想法吧。
+
+**本文最初发布于** [Liliputing][6]
+
+--------------------------------------------------------------------------------
+
+via: https://news.itsfoss.com/ubuntu-google-nest/
+
+作者:[Ankush Das][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://news.itsfoss.com/author/ankush/
+[b]: https://github.com/lkxed
+[1]: https://news.itsfoss.com/wp-content/uploads/2022/06/hacker-installs-ubuntu-on-google-nest-hub.jpg
+[2]: https://fredericb.info/2022/06/breaking-secure-boot-on-google-nest-hub-2nd-gen-to-run-ubuntu.html
+[3]: https://github.com/frederic/chipicopwn
+[4]: https://news.itsfoss.com/wp-content/uploads/2022/06/ubuntu-google-nest.jpg
+[5]: https://github.com/frederic/elaine-linux/commit/11068237d9178e77d79e3a5d27fc4f8f9b923c51
+[6]: https://liliputing.com/2022/06/hacker-installs-ubuntu-on-a-google-nest-hub-2nd-gen-smart-display.html
diff --git a/published/202206/20220620 Compress Images in Linux Easily With Curtail GUI App.md b/published/202206/20220620 Compress Images in Linux Easily With Curtail GUI App.md
new file mode 100644
index 0000000000..46b8ad5ca9
--- /dev/null
+++ b/published/202206/20220620 Compress Images in Linux Easily With Curtail GUI App.md
@@ -0,0 +1,108 @@
+[#]: subject: "Compress Images in Linux Easily With Curtail GUI App"
+[#]: via: "https://itsfoss.com/curtail-image-compress/"
+[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/"
+[#]: collector: "lkxed"
+[#]: translator: "geekpi"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14748-1.html"
+
+用 Curtail GUI 应用轻松压缩 Linux 中的图像
+======
+
+
+
+有一大堆文件尺寸巨大的图片占用了太多的磁盘空间?或者你必须将图片上传到有文件大小限制的门户网站?
+
+你可能有很多原因想要压缩图片。有大量的工具可以帮助你,我在这里说的不是命令行的工具。
+
+你可以使用一个成熟的图像编辑器,如 GIMP。你也可以使用像 [Squoosh][1] 这样的网络工具,这是谷歌的一个开源项目。它甚至可以让你比较每个压缩级别的文件。
+
+然而,所有这些工具都是针对单个图像工作的。如果你想批量压缩照片怎么办?Curtail 是一个能帮助你的应用。
+
+### Curtail: Linux 中用于图像压缩的灵巧工具
+
+使用 Python 和 GTK3 构建的 Curtail 是一个简单的 GUI 应用,使用 OptiPNG、[jpegoptim][2] 等开源库来提供图像压缩功能。
+
+它有一个 [Flatpak 应用][3]。请确保你的系统已启用 [Flatpak 支持][4]。
+
+首先添加 Flathub 仓库:
+
+```
+flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
+```
+
+然后使用下面的命令来安装 Curtail:
+
+```
+flatpak install flathub com.github.huluti.Curtail
+```
+
+安装后,在你的 Linux 系统的菜单中寻找它,并从那里启动它。
+
+![curtail app][5]
+
+界面朴素而简单。你可以选择你想要无损压缩还是有损压缩。
+
+有损压缩会有质量差的图像,但尺寸较小。无损压缩会有更好的质量,但尺寸可能不会比原来的小很多。
+
+![curtail app interface][6]
+
+你可以浏览图片,或者把它们拖到应用中。
+
+是的,你可以用 Curtail 一键压缩多张图片。
+
+事实上,你甚至不需要点击。只要你选择图片或拖放它们,它们就会被压缩,你会看到压缩过程的摘要。
+
+![curtail image compression summary][7]
+
+正如你在上面的图片中看到的,我的一张图片的尺寸减少了 35%,另外两张图片的尺寸减少了 3% 和 8%。这是在无损压缩的情况下。
+
+这些图片以 `-min` 为后缀(默认),保存在与原始图片相同的目录中。
+
+虽然它看起来很简约,但有几个选项可以配置 Curtail。点击菜单,你会看到一些设置选项。
+
+![curtail configuration options][8]
+
+你可以选择是将压缩文件保存为新文件还是替换现有文件。如果你选择新文件(默认行为),你也可以为压缩后的图像提供一个不同的后缀。保留文件属性的选项也在这里。
+
+在下一个选项卡中,你可以配置有损压缩的设置。默认情况下,压缩级别为 90%。
+
+![curtail compression options][9]
+
+高级选项卡让你可以选择配置 PNG 和 WebP 文件的无损压缩级别。
+
+![curtain advanced options][10]
+
+### 总结
+
+正如我前面所说,这不是一个突破性的工具。你可以用其他工具如 GIMP 做同样的事情。它只是使图像压缩的任务更简单,特别是对于批量图像压缩。
+
+我很想看到在压缩时有[转换图像文件格式][11]的选项,就像我们在 Converseen 等工具中所拥有的那样。
+
+总的来说,对于图像压缩的具体目的来说,这是一个不错的小工具。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/curtail-image-compress/
+
+作者:[Abhishek Prakash][a]
+选题:[lkxed][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/abhishek/
+[b]: https://github.com/lkxed
+[1]: https://squoosh.app/
+[2]: https://github.com/tjko/jpegoptim
+[3]: https://itsfoss.com/what-is-flatpak/
+[4]: https://itsfoss.com/flatpak-guide/
+[5]: https://itsfoss.com/wp-content/uploads/2022/06/curtail-app.png
+[6]: https://itsfoss.com/wp-content/uploads/2022/06/curtail-app-interface.png
+[7]: https://itsfoss.com/wp-content/uploads/2022/06/curtail-image-compression-summary.png
+[8]: https://itsfoss.com/wp-content/uploads/2022/06/curtail-configuration-options.png
+[9]: https://itsfoss.com/wp-content/uploads/2022/06/curtail-compression-options.png
+[10]: https://itsfoss.com/wp-content/uploads/2022/06/curtain-advanced-options.png
+[11]: https://itsfoss.com/converseen/
diff --git a/published/202206/20220620 Manjaro 21.3.0 -Ruah- Release Adds Latest Calmares 3.2, GNOME 42, and More Upgrades.md b/published/202206/20220620 Manjaro 21.3.0 -Ruah- Release Adds Latest Calmares 3.2, GNOME 42, and More Upgrades.md
new file mode 100644
index 0000000000..d5f49184e2
--- /dev/null
+++ b/published/202206/20220620 Manjaro 21.3.0 -Ruah- Release Adds Latest Calmares 3.2, GNOME 42, and More Upgrades.md
@@ -0,0 +1,92 @@
+[#]: subject: "Manjaro 21.3.0 ‘Ruah’ Release Adds Latest Calmares 3.2, GNOME 42, and More Upgrades"
+[#]: via: "https://news.itsfoss.com/manjaro-21-3-0-release/"
+[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/"
+[#]: collector: "lkxed"
+[#]: translator: "lkxed"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14754-1.html"
+
+Manjaro 21.3.0 Ruah 发布:增加了最新的 Calmares 3.2、GNOME 42 和更多升级
+======
+
+> Manjaro Linux 21.3.0 发行包包含一些最新和最强大的更新,包括改进的安装程序。
+
+
+
+Manjaro Linux 是一个滚动发布的发行版。因此,从技术上讲,如果你定期更新系统的话,你一直都会使用最新版本。
+
+升级到 Manjaro 21.3.0 应该没什么大不了的,考虑到我已经在正式发布前几天就已经在稳定运行它了,毫无问题。
+
+**另外**,你可能想阅读一下我 [从 Ubuntu 切换到 Manjaro][2] 的初步体验(如果你对于升级仍然犹豫不决的话)。
+
+那么,Manjaro 21.3.0 带来了什么更新呢?
+
+### Manjaro 21.3.0 更新内容
+
+![][3]
+
+桌面环境升级到了最新的稳定版本,而内核版本仍然是 [Linux 内核 5.15 LTS][4]。
+
+此外,这个版本还包括最终的 Clamares v3.2 版本。让我们来看看它有哪些变化吧。
+
+#### Calamares v3.2.59
+
+Calamares v3.2.59 安装程序是 3.2 系列的最终版本,它有许多有意义的改进。这次,分区模块包含了对 LUKS 分区的支持和更多改进,以避免那些可能会弄乱 Manjaro 安装的设置。
+
+Calamares 3.2 的所有未来版本都将仅是错误修复。
+
+#### GNOME 42 + Libadwaita
+
+最初的版本包含了 GNOME 42,而最新的版本包含了 GNOME 42.2(附带最新的更新)。
+
+总体而言,你将获得 [GNOME 42][5] 引入的所有优点,包括系统范围的深色模式、基于 GTK 4 的 GNOME 应用的现代用户界面、升级的应用程序以及其他一些重大变化。
+
+![][6]
+
+#### KDE Plasma 5.24
+
+不幸的是,考虑到它差不多是在同一周发布的,因此该版本无法包含 [KDE Plasma 5.25][7]。
+
+[KDE Plasma 5.24][8] 是一个不错的升级,具有更新的主题和概览效果。
+
+#### XFCE 4.16
+
+在 Xfce 4.16 中,窗口管理器得到了许多更新和改进,以支持小数倍数的缩放和更多功能。
+
+### 下载 Manjaro 21.3.0
+
+到目前为止,我在 Manjaro 21.3.0 GNOME 版本中没有遇到任何问题。一切看起来都不错,升级也很顺利。
+
+但是,如果你不想重新安装或丢失重要文件,则应始终进行备份。
+
+你可以从 [Manjaro 的下载页面][9] 下载最新版本。你也应该可以通过 pamac 包管理器获得更新。
+
+无论哪种情况,你都可以在终端中输入以下命令进行升级:
+
+```
+sudo pacmane -Syu
+```
+
+--------------------------------------------------------------------------------
+
+via: https://news.itsfoss.com/manjaro-21-3-0-release/
+
+作者:[Ankush Das][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://news.itsfoss.com/author/ankush/
+[b]: https://github.com/lkxed
+[1]: https://news.itsfoss.com/wp-content/uploads/2022/06/manjaro-21-3-0-ruah-release.jpg
+[2]: https://news.itsfoss.com/manjaro-linux-experience/
+[3]: https://news.itsfoss.com/wp-content/uploads/2022/06/manjaro-gnome-42-2-1024x576.jpg
+[4]: https://news.itsfoss.com/linux-kernel-5-15-release/
+[5]: https://news.itsfoss.com/gnome-42-release/
+[6]: https://news.itsfoss.com/wp-content/uploads/2022/06/manjaro-21-3-neofetch.png
+[7]: https://news.itsfoss.com/kde-plasma-5-25-release/
+[8]: https://news.itsfoss.com/kde-plasma-5-24-lts-release/
+[9]: https://manjaro.org/download/
diff --git a/published/202206/20220620 Microsoft To Charge For Available Open Source Software In Microsoft Store.md b/published/202206/20220620 Microsoft To Charge For Available Open Source Software In Microsoft Store.md
new file mode 100644
index 0000000000..81622add51
--- /dev/null
+++ b/published/202206/20220620 Microsoft To Charge For Available Open Source Software In Microsoft Store.md
@@ -0,0 +1,40 @@
+[#]: subject: "Microsoft To Charge For Available Open Source Software In Microsoft Store"
+[#]: via: "https://www.opensourceforu.com/2022/06/microsoft-to-charge-for-available-open-source-software-in-microsoft-store/"
+[#]: author: "Laveesh Kocher https://www.opensourceforu.com/author/laveesh-kocher/"
+[#]: collector: "lkxed"
+[#]: translator: "lkxed"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14755-1.html"
+
+微软将对应用商店中开源软件的收费进行限制
+======
+
+
+
+2022 年 6 月 16 日,微软更新了其应用商店的策略。其中一项禁止了发布者对开源或免费的软件收取费用,另一项则针对的是商店使用的不合理高价。如果你在过去几年中访问过微软应用商店,你可能已经注意到,它正在成为越来越多的开源和免费产品的所在地。如果原始开发者将应用程序和游戏上传到商店,这将是有益的,但情况并非如此,因为它们是由第三方上传的。
+
+更糟糕的是,其中许多程序仅作为付费应用提供,而不是免费下载。换句话说,微软的客户必须付费才能购买应用商店的版本,而它们在其他地方是免费的!在应用商店中,免费版和付费版有时并存。为免费应用付费已经够糟糕的了,但这并不是用户在购买时可能遇到的唯一问题。更新也可能是一个问题,因为山寨应用可能不会像源头应用程序那样频繁或快速地更新。
+
+在更新的微软商店政策中,微软在 10.8.7 节下指出:
+
+> 在您决定产品或应用内购买的定价时,您的数字产品或服务的所有定价(包括销售或折扣)必须:
+>
+> 遵守所有适用的法律、法规和监管要求,包括联邦贸易委员会的《反欺骗性定价指南》。您不得试图从开源软件或其他可免费获得的软件中获利,您的产品也不应提供一个(与它提供的特性和功能相比)过高的不合理定价。
+
+这个新策略在更新部分中得到了确认。如果开源和免费产品普遍免费提供,则它们不得在微软应用商店上出售,发布者也不得对其产品收取不合理的高价。开源和免费应用的开发者可以在微软应用商店上为其产品收费。例如,Paint.net 的开发者就是这样做的。如果微软强制执行这些策略,许多应用将从应用商店中删除。以前,开发者可以向微软报告应用程序,但在新策略下,微软可以直接控制应用的列出和提交。
+
+--------------------------------------------------------------------------------
+
+via: https://www.opensourceforu.com/2022/06/microsoft-to-charge-for-available-open-source-software-in-microsoft-store/
+
+作者:[Laveesh Kocher][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/laveesh-kocher/
+[b]: https://github.com/lkxed
+[1]: https://www.opensourceforu.com/wp-content/uploads/2022/06/microsoft-e1655714723942.jpg
diff --git a/published/202206/20220621 Mysterious GeckoLinux Creator Reveals a New Debian Remix Distro.md b/published/202206/20220621 Mysterious GeckoLinux Creator Reveals a New Debian Remix Distro.md
new file mode 100644
index 0000000000..ac911d1337
--- /dev/null
+++ b/published/202206/20220621 Mysterious GeckoLinux Creator Reveals a New Debian Remix Distro.md
@@ -0,0 +1,76 @@
+[#]: subject: "Mysterious GeckoLinux Creator Reveals a New Debian Remix Distro"
+[#]: via: "https://news.itsfoss.com/debian-remix-spiral-linux/"
+[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/"
+[#]: collector: "lkxed"
+[#]: translator: "lkxed"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14758-1.html"
+
+神秘的 GeckoLinux 创建者推出了一个新的 Debian 合成发行版
+======
+
+> GeckoLinux 创建者推出了一个基于 Debian 的新 Linux 发行版,专注于简单性和可用性。
+
+![Linux 螺旋][1]
+
+GeckoLinux 改进了的 openSUSE 体验,它的创建者一直保持匿名。
+
+我不会评论这是好事还是坏事,但现在,开发者又带着另一个基于 Debian 的类似项目回来了。
+
+**SpiralLinux**,这是一个基于 Debian 的发行版,旨在使 Debian 适合最终用户使用。
+
+### SpiralLinux:基于 Debian 构建的发行版
+
+![SpiralLinux][2]
+
+毫不奇怪,大多数用户友好的 Linux 发行版都将 Debian 作为其原始基础。Ubuntu 就是在此基础上进行了大量改进,从而提供了良好的桌面体验,即使对于没有 Linux 经验的用户也是如此。
+
+那么,这个发行版有什么不同呢?
+
+嗯,它的创建者说,这个项目旨在帮助你获得 Debian 的所有核心优势,而无需定制很多东西。
+
+如果你想在桌面上使用 Debian,SpiralLinux 是一种接近原版的体验。你还可以根据需要升级到最新的稳定 Debian 版本(或不稳定/测试版),而不会丢失方便易用的自定义设置。
+
+换句话说,SpiralLinux 使 Debian 适合桌面使用,而最终用户只需付出最小的努力。
+
+为了实现这一点,SpiralLinux 使用了 Debian 官方软件包存储库,并提供了现场安装方式,让你能够定制自己的 Debian 系统。
+
+此外,SpiralLinux 还具有以下功能:
+
+* 开箱即用的 VirtualBox 支持
+* 预装了专有的媒体编解码器和非自由软件包存储库
+* 预装了专有固件
+* 打印机支持
+* 通过 GUI(软件中心)支持 Flatpak
+* 默认启用 zRAM 交换
+* 多种桌面环境(Cinnamon、XFCE、Gnome、Plasma、MATE、Budgie、LXQt)
+
+Debian 始终坚持使用开源和自由软件包,最终用户必须自己搞定编解码器、驱动程序和其他软件包,才能使许多功能正常工作,获得令他们满意的桌面体验。
+
+而 SpiralLinux 似乎可以作为 Debian 的一个有用的替代品,就像 GeckoLinux 之于 openSUSE 一样。
+
+### 下载 SpiralLinux
+
+如果你一直想尝试 Debian,但又不想在初始配置上费尽心思,你可以尝试 SpiralLinux。
+
+你可以前往其托管在 GitHub 上的官网以了解更多信息,链接如下:
+
+> **[SpiralLinux][3]**
+
+--------------------------------------------------------------------------------
+
+via: https://news.itsfoss.com/debian-remix-spiral-linux/
+
+作者:[Ankush Das][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://news.itsfoss.com/author/ankush/
+[b]: https://github.com/lkxed
+[1]: https://news.itsfoss.com/wp-content/uploads/2022/06/spiral-linux-debian-remix-distro.jpg
+[2]: https://news.itsfoss.com/wp-content/uploads/2022/06/spirallinux.jpg
+[3]: https://spirallinux.github.io/
diff --git a/published/202206/20220621 The Final Version Of 7-Zip 22.00 Is Now Available.md b/published/202206/20220621 The Final Version Of 7-Zip 22.00 Is Now Available.md
new file mode 100644
index 0000000000..15e9c3d03e
--- /dev/null
+++ b/published/202206/20220621 The Final Version Of 7-Zip 22.00 Is Now Available.md
@@ -0,0 +1,45 @@
+[#]: subject: "The Final Version Of 7-Zip 22.00 Is Now Available"
+[#]: via: "https://www.opensourceforu.com/2022/06/the-final-version-of-7-zip-22-00-is-now-available/"
+[#]: author: "Laveesh Kocher https://www.opensourceforu.com/author/laveesh-kocher/"
+[#]: collector: "lkxed"
+[#]: translator: "lkxed"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14764-1.html"
+
+7-Zip 22.00 最终版现已推出
+======
+
+
+
+7-Zip 是用于 Windows、Mac 和 Linux 的知名开源文件归档器。它的最新版本 22.00 现已推出。它是 2022 年的第一个稳定版本。上一个版本是 21.07,于 2021 年 12 月发布。7-Zip 的用户可以从官方网站获取该应用的最新版本,下载适用于 Windows 64 位、32 位和 ARM 版本。该应用仍然与过时的 Windows 版本兼容,例如 XP 和 Vista。它还支持所有官方支持的 Windows 版本,包括服务器版本。适用于 Linux 的 7-Zip 22.00 已经可以下载,但 Mac OS 版本还不可用。
+
+7-Zip 22.00 包含一些增强了应用功能的新特性。这个归档器现在支持提取苹果文件系统Apple File System(APFS)镜像。几年前,苹果公司在 Mac OS 10.13 和 iOS 中引入了苹果文件系统。该文件系统在设计时就考虑到了闪存(Flash)和固态硬盘(SSD)存储。
+
+7-Zip 22.00 包括了对其 TAR 存档支持的多项增强。使用选项 `-ttar -mm=pax` 或 `-ttar -mm=posix`,7-Zip 现在可以创建符合 POSIX 标准的 tar 格式的 TAR 档案。此外,使用选项 `ttar -mm=pax -mtp=3 -mtc -mta`,7-Zip 可以在 tar/pax 存档中存储高精度的文件时间戳。
+
+最后,Linux 用户可以在 TAR 归档文件中使用以下两个新选项:
+
+* `snoi`:将所有者/组 ID 保存在存档中,或将所有者/组 ID 从存档复制到提取的文件中。
+* `snon`:在存档中保留所有者/组的名称。
+
+适用于 Windows 的 7-Zip 22.00 添加了对 `-snz` 选项的支持,该选项用于传播区识别符(LCTT 译注:区标识符是微软在 2013 年为 IE 设计的安全功能,它会标记那些用户自网络上所下载的文件,并在用户准备打开时跳出警告)。
+
+要提取文件,请使用标识符流。出于安全目的,Windows 使用了该流,它可用于确定文件是在本地创建的还是从互联网下载的。
+
+在“添加到存档add to archive”配置对话框中,7-Zip 22.00 包含一个新的选项窗口。它包括用于更改时间戳精度、更改其他与时间相关的配置选项,以及防止更改源文件的最后访问时间等选项。
+
+--------------------------------------------------------------------------------
+
+via: https://www.opensourceforu.com/2022/06/the-final-version-of-7-zip-22-00-is-now-available/
+
+作者:[Laveesh Kocher][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/laveesh-kocher/
+[b]: https://github.com/lkxed
+[1]: https://www.opensourceforu.com/wp-content/uploads/2022/06/7-zip-2200-500x312-1.jpg
diff --git a/published/202206/20220621 This Open-Source Project Proves Chrome Extensions Can Track You.md b/published/202206/20220621 This Open-Source Project Proves Chrome Extensions Can Track You.md
new file mode 100644
index 0000000000..ae5ea206e5
--- /dev/null
+++ b/published/202206/20220621 This Open-Source Project Proves Chrome Extensions Can Track You.md
@@ -0,0 +1,70 @@
+[#]: subject: "This Open-Source Project Proves Chrome Extensions Can Track You"
+[#]: via: "https://news.itsfoss.com/chrome-extension-tracking/"
+[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/"
+[#]: collector: "lkxed"
+[#]: translator: "lkxed"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14768-1.html"
+
+你安装的 Chrome 扩展的组合可以跟踪你
+======
+
+> 这会成为放弃基于 Chromium 的浏览器并开始使用 Firefox 的一个理由吗?也许吧,决定权在你。
+
+![Chrome 扩展追踪器][1]
+
+即使你有了所有的隐私扩展和各种保护功能,别人仍然有方法可以识别你或跟踪你。
+
+请注意,并非所有浏览器都是如此,本文中,我们主要关注基于 Chromium 的浏览器,并将谷歌 Chrome 作为“主要嫌疑人”。
+
+以前,在 Chromium 浏览器上,尽管别人已经能够检测到你已安装的扩展程序,但许多扩展程序都实施了某些保护措施来防止这种检测。
+
+然而,一位名为 “**z0ccc**” 的安全研究人员发现了一种检测已安装 Chrome 浏览器扩展程序的新方法,该方法可进一步用于**通过“浏览器指纹识别”来跟踪你**。
+
+如果你还不知道的话:浏览器指纹识别Browser Fingerprinting是指收集有关你的设备/浏览器的各种信息,以创建唯一的指纹 ID(哈希),从而在互联网上识别你的一种跟踪方法。“各种信息”包括:浏览器名称、版本、操作系统、已安装的扩展程序、屏幕分辨率和类似的技术数据。
+
+这听起来像是一种无害的数据收集技术,但可以使用这种跟踪方法在线跟踪你。
+
+### 检测谷歌 Chrome 扩展
+
+研究人员发布了一个开源项目 “**Extension Fingerprints**”,你可以使用它来测试你安装的 Chrome 扩展是否能被检测到。
+
+新技术涉及一种“时间差”方法,该工具比较了扩展程序获取资源的时间。与浏览器上未安装的其他扩展相比,受保护的扩展需要更多时间来获取资源。因此,这有助于从 1000 多个扩展列表中识别出一些扩展。
+
+关键是:即使有了各种新的进步和技术来防止跟踪,Chrome 网上应用店的扩展也可以被检测到。
+
+![][2]
+
+并且,在检测到已安装的扩展程序后,别人可以就使用浏览器指纹识别,对你进行在线跟踪。
+
+令人惊讶的是,即使你安装有 uBlocker、AdBlocker、或 Privacy Badger(一些流行的以隐私为重点的扩展程序)之类的扩展程序,使用了这种方法,它们也都可以被检测到。
+
+你可以在它的 [GitHub 页面][3] 上查看所有技术细节。如果你想自己测试它,请前往它的 [扩展指纹识别网站][4] 自行检查。
+
+### 拯救 Firefox?
+
+嗯,似乎是的,毕竟我出于各种原因,[不断回到 Firefox][5]。
+
+这个新发现的(跟踪)方法应该适用于所有基于 Chromium 的浏览器。我在 Brave 和谷歌 Chrome 上都测试了这个方法。研究人员还提到,该工具不能在使用微软应用商店中的扩展的微软 Edge 上工作。但是,相同的跟踪方法仍然有效。
+
+正如研究人员指出,Mozilla Firefox 可以避免这种情况,因为每个浏览器实例的扩展 ID 都是唯一的。
+
+--------------------------------------------------------------------------------
+
+via: https://news.itsfoss.com/chrome-extension-tracking/
+
+作者:[Ankush Das][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://news.itsfoss.com/author/ankush/
+[b]: https://github.com/lkxed
+[1]: https://news.itsfoss.com/wp-content/uploads/2022/06/opensource-project-tracker-chrome-extensions.jpg
+[2]: https://news.itsfoss.com/wp-content/uploads/2022/06/extension-fingerprints.jpg
+[3]: https://github.com/z0ccc/extension-fingerprints
+[4]: https://z0ccc.github.io/extension-fingerprints/
+[5]: https://news.itsfoss.com/why-mozilla-firefox/
diff --git a/published/202206/20220622 Manage your Rust toolchain using rustup.md b/published/202206/20220622 Manage your Rust toolchain using rustup.md
new file mode 100644
index 0000000000..b60c13fec5
--- /dev/null
+++ b/published/202206/20220622 Manage your Rust toolchain using rustup.md
@@ -0,0 +1,142 @@
+[#]: subject: "Manage your Rust toolchain using rustup"
+[#]: via: "https://opensource.com/article/22/6/rust-toolchain-rustup"
+[#]: author: "Gaurav Kamathe https://opensource.com/users/gkamathe"
+[#]: collector: "lkxed"
+[#]: translator: "geekpi"
+[#]: reviewer: "turbokernel"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14779-1.html"
+
+使用 rustup 管理你的 Rust 工具链
+======
+
+
+
+> rustup 可用于 Rust 安装与更新。它还能够在稳定版、测试版和每日更新版之间无缝切换 Rust 编译器及其工具。
+
+[Rust 编程语言][2] 如今变得越来越流行,受到爱好者和公司的一致好评。它受欢迎的原因之一是 Rust 提供的令人惊叹的工具,使其成为开发人员使用的乐趣。[rustup][3] 是管理 Rust 工具的官方工具。它不仅可以安装和更新 Rust ,它还能够在稳定版、测试版和每日更新版之间无缝切换 Rust 编译器及其工具。本文将向你介绍 `rustup` 及其一些常用命令。
+
+### 默认 Rust 安装方式
+
+如果你想在 Linux 上安装 Rust,你可以使用你的包管理器。在 Fedora 或 CentOS Stream 上,你可以这样:
+
+```
+$ sudo dnf install rust cargo
+```
+
+这提供了一个稳定版的 Rust 工具链,如果你是 Rust 的初学者,并想尝试编译和运行简单的程序,它会非常有用。但是,由于 Rust 是一种新的编程语言,它变化很快,并且经常添加许多新功能。这些功能是 Rust 工具链的每日更新版和之后测试版的一部分。要试用这些功能,你需要安装这些较新版本的工具链,而不会影响系统上的稳定版本。不幸的是,你的发行版的包管理器在这里无法做到。
+
+### 使用 rustup 安装 Rust 工具链
+
+要解决上述问题,你可以下载安装脚本:
+
+```
+$ curl --proto '=https' --tlsv1.2 \
+ -sSf https://sh.rustup.rs > sh.rustup.rs
+```
+
+检查它,然后运行它。它不需要 root 权限,并根据你的本地用户权限安装 Rust:
+
+```
+$ file sh.rustup.rs
+sh.rustup.rs: POSIX shell script, ASCII text executable
+$ less sh.rustup.rs
+$ bash sh.rustup.rs
+```
+
+出现提示时选择选项 `1`:
+
+```
+1) Proceed with installation (default)
+2) Customize installation
+3) Cancel installation
+> 1
+```
+
+安装后,你必须获取环境变量以确保 `rustup` 命令立即可供你运行:
+
+```
+$ source $HOME/.cargo/env
+```
+
+验证是否安装了 Rust 编译器(`rustc`)和 Rust 包管理器(`cargo`):
+
+```
+$ rustc --version
+$ cargo --version
+```
+
+### 查看已安装和可用的工具链
+
+你可以使用以下命令查看已安装的不同工具链以及哪个工具链是可用的:
+
+```
+$ rustup show
+```
+
+### 在工具链之间切换
+
+你可以查看默认工具链并根据需要进行更改。如果你当前使用的是稳定版工具链,并希望尝试每日更新版中提供的新功能,你可以轻松切换到每日更新版工具链:
+
+```
+$ rustup default
+$ rustup default nightly
+```
+
+要查看 Rust 的编译器和包管理器的完整路径:
+
+```
+$ rustup which rustc
+$ rustup which cargo
+```
+
+### 检查和更新工具链
+
+要检查是否有新的 Rust 工具链可用:
+
+```
+$ rustup check
+```
+
+假设一个新版本的 Rust 发布了,其中包含一些有趣的特性,并且你想要获取最新版本的 Rust。你可以使用 `update` 子命令来做到这一点:
+
+```
+$ rustup update
+```
+
+### 帮助和文档
+
+以上命令对于日常使用来说绰绰有余。尽管如此,`rustup` 有多种命令,你可以参考帮助部分了解更多详细信息:
+
+```
+$ rustup --help
+```
+
+`rustup` 在 GitHub 上有完整的 [参考手册][4],你可以用作参考。所有 Rust 文档都安装在你的本地系统上,不需要你连接到互联网。你可以访问包括书籍、标准库等在内的本地文档:
+
+```
+$ rustup doc
+$ rustup doc --book
+$ rustup doc --std
+$ rustup doc --cargo
+```
+
+Rust 是一种正在积极开发中的令人兴奋的语言。如果你对编程的发展方向感兴趣,请关注 Rust!
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/22/6/rust-toolchain-rustup
+
+作者:[Gaurav Kamathe][a]
+选题:[lkxed][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[turbokernel](https://github.com/turbokernel)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/gkamathe
+[b]: https://github.com/lkxed
+[1]: https://opensource.com/sites/default/files/lead-images/tools_hardware_purple.png
+[2]: https://www.rust-lang.org/
+[3]: https://github.com/rust-lang/rustup
+[4]: https://rust-lang.github.io/rustup/
diff --git a/published/202206/20220623 Minetest, an Open Source Minecraft Alternative.md b/published/202206/20220623 Minetest, an Open Source Minecraft Alternative.md
new file mode 100644
index 0000000000..5c7b6eef20
--- /dev/null
+++ b/published/202206/20220623 Minetest, an Open Source Minecraft Alternative.md
@@ -0,0 +1,131 @@
+[#]: subject: "Minetest, an Open Source Minecraft Alternative"
+[#]: via: "https://itsfoss.com/minetest/"
+[#]: author: "John Paul https://itsfoss.com/author/john/"
+[#]: collector: "lkxed"
+[#]: translator: "geekpi"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14774-1.html"
+
+Minetest:一个开源的 Minecraft 替代品
+======
+
+早在 2009 年,Minecraft 就来到了这个世界。从那时起,它已经成为一种文化现象。在这段时间里,一些开发者发布了具有类似想法和机制的开源游戏。今天,我们将看看其中最大的一个:Minetest。
+
+### 什么是 Minetest?
+
+
+
+[Minetest][2],简单地说,是一个基于体素voxel的沙盒游戏,与 Minecraft 非常相似。与 Minecraft 不同的是,Minetest 是用 C++ 编写的,并被设计成可以在大多数系统上原生运行。它也有一个非常大的地图区域。地图大小为 “62,000 × 62,000 × 62,000 块”,“你可以向下开采 31,000 块,或向上建造 31,000 块”。
+
+有趣的是,Minetest 最初是以专有许可证发布的,但后来被重新授权为 GPL。此后,它又被重新授权为 LGPL。
+
+Minetest 有几种模式。你可以建造并发挥创意,或者你可以尝试在各种元素中生存。你并不局限于这些模式。Minetest 有大量的 [额外内容][3],包括 模组mod、纹理包和在 Minetest 中建立的游戏。这主要是通过 Minetest 的 [模组 API][4] 和 Lua 完成的。
+
+![minetest packages][5]
+
+对于那些玩过 Minecraft 的人来说,你会发现 Minetest 中的体验非常相似。你可以挖掘资源,建造结构,并结合材料来制作工具。我在 Minetest 中没有注意到的一件事是怪物。我认为 Minetest 中没有任何生物,但话说回来,我只在创意模式中玩过。我还没有玩过生存模式。
+
+Minetest 也被用于 [教育][6]。例如,瑞士 CERN 的人用 Minetest 创造了一个游戏,以 [展示互联网是如何工作的][7] 以及它是如何被创造出来的。Minetest 还被用于 [教授][8] 编程、地球科学以及微积分和三角学。
+
+![minetes map1][9]
+
+### 如何安装 Minetest?
+
+Minetest 几乎在每个系统上都可以使用。下面是一个命令列表,你可以用它来在一些最流行的 Linux 发行版中安装 Minetest。
+
+#### Ubuntu 或者 Debian
+
+如果你有一个基于 Ubuntu 或 Debian 的发行版,只要在终端输入这个命令:
+
+```
+sudo apt install mintest
+```
+
+#### Arch 或者 Manjaro
+
+对于基于 Arch 的系统(如 Manjaro),使用:
+
+```
+sudo pacman -S minetest
+```
+
+#### Fedora
+
+你可以从 Fedora 服务器中输入以下命令安装 Mintest:
+
+```
+sudo dnf install mintest
+```
+
+#### openSUSE
+
+openSUSE 用户可以用这个命令安装 Minetest:
+
+```
+sudo zypper in mintest
+```
+
+#### FreeBSD
+
+FreeBSD 用户很幸运。他们可以用这个命令安装 Mintest:
+
+```
+pkg install minetest minetest_game
+```
+
+#### Snap
+
+要安装 Minetest 的 Snap 包,请在终端输入以下命令:
+
+```
+sudo snap install minetest
+```
+
+#### Flathub
+
+要安装,请输入:
+
+```
+flatpak install flathub net.minetest.Minetest
+```
+
+你可以在 [这里][11] 下载 Windows 的可移植执行文件。你也可以在 Android 上安装 Minetest,可以通过 [Google Play][12] 或 [下载 APK][13]。
+
+### 总结
+
+![minetest about][14]
+
+我已经在 Minetest 中花了几个小时在我的本地系统上进行构建和探索。它非常有趣。我还没来得及尝试任何额外的内容,因为我对我玩过的相对较少的游戏部分非常满意。我遇到的唯一麻烦是,由于某种原因,它在 Fedora 上运行缓慢。我可能存在一些配置上的错误。
+
+如果你曾经认为 Minecraft 看起来很有趣,但不想花钱,那就去看看 Minetest。你会很高兴你这么做。
+
+如果你玩过 Minetest,在评论中告诉我们你的体验如何。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/minetest/
+
+作者:[John Paul][a]
+选题:[lkxed][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/john/
+[b]: https://github.com/lkxed
+[1]: https://itsfoss.com/wp-content/uploads/2022/03/minetest-start-800x411.jpg
+[2]: https://www.minetest.net/
+[3]: https://content.minetest.net/
+[4]: https://dev.minetest.net/Modding_Intro
+[5]: https://itsfoss.com/wp-content/uploads/2022/03/minetest-packages-800x411.jpg
+[6]: https://www.minetest.net/education/
+[7]: https://forum.minetest.net/viewtopic.php?t=22871
+[8]: https://en.wikipedia.org/wiki/Minetest#Usage_in_education
+[9]: https://itsfoss.com/wp-content/uploads/2022/03/minetes-map1-800x411.png
+[10]: https://itsfoss.com/wp-content/uploads/2022/03/minetest-map2-800x413.png
+[11]: https://www.minetest.net/downloads/
+[12]: https://play.google.com/store/apps/details?id=net.minetest.minetest&utm_source=website&pcampaignid=MKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1
+[13]: https://github.com/minetest/minetest/releases/download/5.5.0/app-armeabi-v7a-release.apk
+[14]: https://itsfoss.com/wp-content/uploads/2022/03/minetest-about-800x407.jpg
diff --git a/published/202206/20220624 GitHub Copilot is Now Available for All and Not Everyone Likes It.md b/published/202206/20220624 GitHub Copilot is Now Available for All and Not Everyone Likes It.md
new file mode 100644
index 0000000000..345b934ec0
--- /dev/null
+++ b/published/202206/20220624 GitHub Copilot is Now Available for All and Not Everyone Likes It.md
@@ -0,0 +1,91 @@
+[#]: subject: "GitHub Copilot is Now Available for All and Not Everyone Likes It"
+[#]: via: "https://news.itsfoss.com/github-copilot/"
+[#]: author: "Jacob Crume https://news.itsfoss.com/author/jacob/"
+[#]: collector: "lkxed"
+[#]: translator: "lkxed"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14759-1.html"
+
+GitHub Copilot 现已可供所有人使用,但并非所有人都喜欢它
+======
+
+> GitHub Copilot 来了,它能帮助程序员,为他们提供人工智能的编码建议,不过,它是否会让事情变得更糟呢?
+
+![GitHub][1]
+
+在 2021 年,我曾花了好几个小时来翻阅 GitHub Copilot 文档,试图弄清楚如何能够加入它的技术预览计划。还好,这一切都得到了回报,我成功加入了预览计划。
+
+而现在,它终于可供所有人使用啦!
+
+如果你还不知道的话,[GitHub Copilot][2] 是一个 AI 助手,可帮助你更快、更高效地编写代码。
+
+我能想到的最类似的东西,就是你手机上的(输入法的)自动完成功能。不过,与自动完成功能不同,GitHub Copilot 编写代码,就相当于是在完成整段的句子。
+
+### Copilot 现已可供大众使用
+
+正如我在前面提到的,Copilot 已经处于技术预览阶段将近一年了。这意味着,GitHub 只允许非常有限数量的开发者免费使用它,以换取同意 GitHub 监控他们的使用情况,从而改进程序的最终版本。
+
+看起来 GitHub 终于满意地向公众发布了它。现在,任何拥有 GitHub 帐户的人都应该能够使用它,尽管需要付出一定的代价(我很快就会在下面提到)。
+
+[公告][3] 中提到:
+
+> 直到不久前,人工智能都没有能够帮助改进代码,开发软件的过程几乎完全是手动的。现在,这种情况正在改变。今天,我很高兴地宣布,我们正在向所有个人开发者提供 [GitHub Copilot][4]。你的 AI 配对程序员来啦。
+>
+> —— [Thomas Dohmke][5],GitHub CEO
+
+Copilot 作为免费的编辑器扩展,已经帮助数百万开发者加快了他们的编程速度。然而,它确实是有代价的,无论是直接的还是间接的。
+
+### GitHub Copilot 定价
+
+与几乎所有令人兴奋的新技术一样,Copilot 对某些人来说可能过于昂贵。它将花费你 10 美元/月或 100 美元/年。
+
+如果你是开源项目维护者或经过验证的学生,那么你可以免费使用它。
+
+### GitHub Copilot 不道德吗?
+
+围绕 GitHub Copilot 产品的争议巨大且令人担忧。从技术上讲,这个人工智能是使用大家托管在 GitHub 上的代码来进行训练的。
+
+因此,基本上,GitHub 是通过使用你的代码来提供一个新产品(如果你愿意的话,还可以加点料)。而且,关于 Copilot,可别忘了,自由软件基金会(FSF)也 [建议][6] 不要在 GitHub 上托管代码。
+
+我们知道,企业总是喜欢利用事物,但有些人认为这应该不会直接损害托管在 GitHub 上的项目/代码。
+
+**但是,是这样吗?**
+
+简而言之,在 Copilot 发布后,许多开发者都分享说,他们发现 GitHub Copilot 生成了受版权保护的代码:
+
+> 我试了下 GitHub Copilot,这是一项付费服务,来看看它是否会使用带有限制性许可证的存储库的代码。我检查了它,看看它是否有我在之前雇主那里编写的代码,该代码有一个许可证,只允许其用于免费游戏,并且需要附加许可证。是的,它确实有。
+
+![图源:推特上的 Chris Green][7]
+
+当然,如果我们查看 GitHub Copilot 的常见问题解答(FAQ),其中提到:
+
+> GitHub 不拥有 GitHub Copilot 生成的建议。您在 GitHub Copilot 的帮助下编写的代码属于您自己,由您自己负责。
+
+所以说,你为一项服务付了费,最终却为你的项目增加了不便和更多的工作?
+
+在我看来,就简化开发者的任务而言,这听起来一点儿也不令人兴奋。
+
+*你对此有什么想法?请在下面的评论区中分享一下吧!*
+
+--------------------------------------------------------------------------------
+
+via: https://news.itsfoss.com/github-copilot/
+
+作者:[Jacob Crume][a]
+选题:[lkxed][b]
+译者:[lkxed](https://github.com/lkxed)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://news.itsfoss.com/author/jacob/
+[b]: https://github.com/lkxed
+[1]: https://news.itsfoss.com/wp-content/uploads/2022/06/github-copilot.jpg
+[2]: https://copilot.github.com/
+[3]: https://github.blog/2022-06-21-github-copilot-is-generally-available-to-all-developers/
+[4]: http://copilot.github.com
+[5]: https://github.blog/author/ashtom/
+[6]: https://www.fsf.org/blogs/licensing/fsf-funded-call-for-white-papers-on-philosophical-and-legal-questions-around-copilot
+[7]: https://pbs.twimg.com/media/FV45qM_VEAALLv6?format=png&name=medium
+[8]: https://twitter.com/ChrisGr93091552/status/1539731632931803137?ref_src=twsrc%5Etfw
diff --git a/published/202206/20220624 Linus Torvalds Expects to See Rust Support in the Kernel Soon.md b/published/202206/20220624 Linus Torvalds Expects to See Rust Support in the Kernel Soon.md
new file mode 100644
index 0000000000..84501ed7fa
--- /dev/null
+++ b/published/202206/20220624 Linus Torvalds Expects to See Rust Support in the Kernel Soon.md
@@ -0,0 +1,64 @@
+[#]: subject: "Linus Torvalds Expects to See Rust Support in the Kernel Soon"
+[#]: via: "https://news.itsfoss.com/linux-kernel-rust/"
+[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/"
+[#]: collector: "lkxed"
+[#]: translator: "lkxed"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-14763-1.html"
+
+Linus Torvalds 暗示很快就可以在内核中看到对 Rust 的支持
+======
+
+> 正如 Linus Torvalds 所暗示,Linux Kernel 5.20 发布时可能会提供对 Rust 的支持。你怎么看?
+
+![Linus][1]
+
+市面上已经有许多用 Rust 重写的开源项目。因此,如今 Rust 被认为是 Linux 内核的第二语言,也就不足为奇了。
+
+几天前,在 [Linux 基金会开源峰会][2] 上,Linus Torvals 提到他们预计将在下一个内核版本(即 Linux 内核 5.20)中对 Rust 进行试验。
+
+或许你不知道,正如 [Phoronix][3] 率先报道的那样,Linux 已经有了 Rust 内核补丁,包含了少量的示例驱动程序,以及基本的基础设施的启用代码。
+
+因此,Linus Torvalds 对可能合并 Rust 支持的暗示,也不足为奇。但是,这无疑是令人兴奋的!
+
+### 用于 Linux 内核的 Rust
+
+这么做的最终目标是让 Linux 内核变得更好,但它现在仍然处于试运行阶段。
+
+凭借其各种优势,Rust 正日益成为一种流行的编程语言。还记得吗,[System76 也在开发一个用 Rust 编写的新桌面环境][4]。
+
+然而,并不是所有参与维护 Linux 内核的人都熟悉这种编程语言。
+
+那么,这会是一个问题吗?
+
+Linus Torvalds 并不认为这是一个大问题,因为内核中也有其他语言。他还提到希望看到 Rust 成为新的一份子。
+
+[The Register][5] 报道称,Linus Torvalds 表示会信任维护者,除非他们犯了错误。
+
+### Linux 5.20:何时发布?
+
+Linux 内核 5.19 版本将于 7 月底左右发布。因此,5.20 版本的合并窗口应该会在其稳定版发布后开启(假设没有意外延迟的话)。
+
+除了 Rust 以外,Linux 内核 5.20 应该也是对包括 RDNA3 在内的下一代硬件支持的重要更新,它同时提供了更多功能。
+
+*你如何看待 Rust 将在不久的将来进入 Linux 呢?你感到兴奋吗?欢迎在下方评论区告诉我们~*
+
+--------------------------------------------------------------------------------
+
+via: https://news.itsfoss.com/linux-kernel-rust/
+
+作者:[Ankush Das][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://news.itsfoss.com/author/ankush/
+[b]: https://github.com/lkxed
+[1]: https://news.itsfoss.com/wp-content/uploads/2022/06/linus-expects-rust-support-in-linux-kernel-soon.jpg
+[2]: https://events.linuxfoundation.org/open-source-summit-north-america/
+[3]: https://www.phoronix.com/scan.php?page=news_item&px=Rust-Linux-v7-Plus-New-Uutils
+[4]: https://news.itsfoss.com/system76-rust-cosmic-desktop/
+[5]: https://www.theregister.com/2022/06/23/linus_torvalds_rust_linux_kernel/
diff --git a/published/202207/20210101 Djinn- A Code Generator and Templating Language Inspired by Jinja2.md b/published/202207/20210101 Djinn- A Code Generator and Templating Language Inspired by Jinja2.md
new file mode 100644
index 0000000000..e4fac67c25
--- /dev/null
+++ b/published/202207/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 的作者有不同的想法,而我想要类似于 列表推导list comprehensions 或 D 语言的 可组合范围composable range 算法之类的东西。
+
+我决定制作一个类似于 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 列的拉丁方格Latin square)。相邻单元格中的数字还必须满足所有 `>` 大于号表示的不等式。
+
+[几个月前我使用了 线性规划linear programming(LP)][11]。线性规划问题是具有线性约束的连续变量系统。这次我将使用混合整数线性规划mixed integer linear programming(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/202207/20210107 A hands-on tutorial for using the GNU Project Debugger.md b/published/202207/20210107 A hands-on tutorial for using the GNU Project Debugger.md
new file mode 100644
index 0000000000..d4efbf9e65
--- /dev/null
+++ b/published/202207/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 调试器GNU Project Debugger([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]
+
+返回结果显示没有找到调试符号。
+
+调试信息是目标文件object file(可执行文件)的组成部分,调试信息包括数据类型、函数签名、源代码和操作码之间的关系。此时,你有两种选择:
+
+* 继续调试汇编代码(参见下文“无符号调试”)
+* 使用调试信息进行编译,参见下一节内容
+
+### 使用调试信息进行编译
+
+为了在二进制文件中包含调试信息,你必须重新编译。打开 `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/202207/20210120 Highlighted Text Not Visible in gedit in Dark Mode- Here-s What You Can Do.md b/published/202207/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/202207/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 后,点击汉堡菜单然后选择“首选项Preferences”。
+
+![Go to Preferences][5]
+
+在查看选项卡,你应该看到在 “高亮Highlighting” 区域的下方的 “高亮当前行Highlight current line” 选项。取消勾选这个选项,马上就可以看到效果。
+
+![Disable highlighting current line][6]
+
+“高亮当前行”是一个有用的功能,如果你想继续使用它,请选择第二个选项。
+
+#### 选项2: 更改编辑器的颜色主题
+
+在“首选项Preferences”窗口,找到 “字体与颜色Font & Colors