Merge branch 'LCTT:master' into master

This commit is contained in:
Hans zhao 2022-06-05 15:50:53 +08:00 committed by GitHub
commit 8abce64e97
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
180 changed files with 12748 additions and 2154 deletions

View File

@ -0,0 +1,214 @@
[#]: subject: "An introduction to Go arrays and slices"
[#]: via: "https://opensource.com/article/18/7/introduction-go-arrays-and-slices"
[#]: author: "Mihalis Tsoukalos https://opensource.com/users/mtsouk"
[#]: collector: "lkxed"
[#]: translator: "lkxed"
[#]: reviewer: "wxy"
[#]: publisher: "wxy"
[#]: url: "https://linux.cn/article-14665-1.html"
Go 数组和切片的介绍
======
![](https://img.linux.net.cn/data/attachment/album/202206/02/105657zahhco3612vv1bbo.jpg)
> 了解使用数组和切片在 Go 中存储数据的优缺点,以及为什么其中一个更好。
在本系列的第四篇文章中,我将解释 [Go][5] 数组和切片,包括如何使用它们,以及为什么你通常要选择其中一个而不是另一个。
### 数组
数组是编程语言中最流行的数据结构之一,主要原因有两个:一是简单易懂,二是可以存储许多不同类型的数据。
你可以声明一个名为 `anArray` 的 Go 数组,该数组存储四个整数,如下所示:
```
anArray := [4]int{-1, 2, 0, -4}
```
数组的大小应该在它的类型之前声明,而类型应该在声明元素之前定义。`len()` 函数可以帮助你得到任何数组的长度。上面数组的大小是 4。
如果你熟悉其他编程语言,你可能会尝试使用 `for` 循环来遍历数组。Go 当然也支持 `for` 循环不过正如你将在下面看到的Go 的 `range` 关键字可以让你更优雅地遍历数组或切片。
最后,你也可以定义一个二维数组,如下:
```
twoD := [3][3]int{
{1, 2, 3},
{6, 7, 8},
{10, 11, 12}}
```
`arrays.go` 源文件中包含了 Go 数组的示例代码。其中最重要的部分是:
```
for i := 0; i < len(twoD); i++ {
k := twoD[i]
for j := 0; j < len(k); j++ {
fmt.Print(k[j], " ")
}
fmt.Println()
}
for _, a := range twoD {
for _, j := range a {
fmt.Print(j, " ")
}
fmt.Println()
}
```
通过上述代码,我们知道了如何使用 `for` 循环和 `range` 关键字迭代数组的元素。`arrays.go` 的其余代码则展示了如何将数组作为参数传递给函数。
以下是 `arrays.go` 的输出:
```
$ go run arrays.go
Before change(): [-1 2 0 -4]
After change(): [-1 2 0 -4]
1 2 3
6 7 8
10 11 12
1 2 3
6 7 8
10 11 12
```
这个输出告诉我们:对函数内的数组所做的更改,会在函数退出后丢失。
### 数组的缺点
Go 数组有很多缺点,你应该重新考虑是否要在 Go 项目中使用它们。
首先,数组定义之后,大小就无法改变,这意味着 Go 数组不是动态的。简而言之,如果你需要将一个元素添加到一个没有剩余空间的数组中,你将需要创建一个更大的数组,并将旧数组的所有元素复制到新数组中。
其次,当你将数组作为参数传递给函数时,实际上是传递了数组的副本,这意味着你对函数内部的数组所做的任何更改,都将在函数退出后丢失。
最后,将大数组传递给函数可能会很慢,主要是因为 Go 必须创建数组的副本。
以上这些问题的解决方案,就是使用 Go 切片。
### 切片
Go 切片与 Go 数组类似,但是它没有后者的缺点。
首先,你可以使用 `append()` 函数将元素添加到现有切片中。此外Go 切片在内部使用数组实现,这意味着 Go 中每个切片都有一个底层数组。
切片具有 `capacity` 属性和 `length` 属性,它们并不总是相同的。切片的长度与元素个数相同的数组的长度相同,可以使用 `len()` 函数得到。切片的容量是当前为切片分配的空间,可以使用 `cap()` 函数得到。
由于切片的大小是动态的如果切片空间不足也就是说当你尝试再向切片中添加一个元素时底层数组的长度恰好与容量相等Go 会自动将它的当前容量加倍,使其空间能够容纳更多元素,然后将请求的元素添加到底层数组中。
此外,切片是通过引用传递给函数的,这意味着实际传递给函数的是切片变量的内存地址,这样一来,你对函数内部的切片所做的任何修改,都不会在函数退出后丢失。因此,将大切片传递给函数,要比将具有相同数量元素的数组传递给同一函数快得多。这是因为 Go 不必拷贝切片 —— 它只需传递切片变量的内存地址。
`slice.go` 源文件中有 Go 切片的代码示例,其中包含以下代码:
```
package main
import (
"fmt"
)
func negative(x []int) {
for i, k := range x {
x[i] = -k
}
}
func printSlice(x []int) {
for _, number := range x {
fmt.Printf("%d ", number)
}
fmt.Println()
}
func main() {
s := []int{0, 14, 5, 0, 7, 19}
printSlice(s)
negative(s)
printSlice(s)
fmt.Printf("Before. Cap: %d, length: %d\n", cap(s), len(s))
s = append(s, -100)
fmt.Printf("After. Cap: %d, length: %d\n", cap(s), len(s))
printSlice(s)
anotherSlice := make([]int, 4)
fmt.Printf("A new slice with 4 elements: ")
printSlice(anotherSlice)
}
```
切片和数组在定义方式上的最大区别就在于:你不需要指定切片的大小。实际上,切片的大小取决于你要放入其中的元素数量。此外,`append()` 函数允许你将元素添加到现有切片 —— 请注意,即使切片的容量允许你将元素添加到该切片,它的长度也不会被修改,除非你调用 `append()`。上述代码中的 `printSlice()` 函数是一个辅助函数,用于打印切片中的所有元素,而 `negative()` 函数将切片中的每个元素都变为各自的相反数。
运行 `slice.go` 将得到以下输出:
```
$ go run slice.go
0 14 5 0 7 19
0 -14 -5 0 -7 -19
Before. Cap: 6, length: 6
After. Cap: 12, length: 7
0 -14 -5 0 -7 -19 -100
A new slice with 4 elements: 0 0 0 0
```
请注意当你创建一个新切片并为给定数量的元素分配内存空间时Go 会自动地将所有元素都初始化为其类型的零值,在本例中为 0`int` 类型的零值)。
### 使用切片来引用数组
Go 允许你使用 `[:]` 语法,使用切片来引用现有的数组。在这种情况下,你对切片所做的任何更改都将传播到数组中 —— 详见 `refArray.go`。请记住,使用 `[:]` 不会创建数组的副本,它只是对数组的引用。
`refArray.go` 中最有趣的部分是:
```
func main() {
anArray := [5]int{-1, 2, -3, 4, -5}
refAnArray := anArray[:]
fmt.Println("Array:", anArray)
printSlice(refAnArray)
negative(refAnArray)
fmt.Println("Array:", anArray)
}
```
运行 `refArray.go`,输出如下:
```
$ go run refArray.go
Array: [-1 2 -3 4 -5]
-1 2 -3 4 -5
Array: [1 -2 3 -4 5]
```
我们可以发现:对 `anArray` 数组的切片引用进行了操作后,它本身也被改变了。
### 总结
尽管 Go 提供了数组和切片两种类型,你很可能还是会使用切片,因为它们比 Go 数组更加通用、强大。只有少数情况需要使用数组而不是切片,特别是当你完全确定元素的数量固定不变时。
你可以在 [GitHub][6] 上找到 `arrays.go`、`slice.go` 和 `refArray.go` 的源代码。
如果你有任何问题或反馈,请在下方发表评论或在 [Twitter][7] 上与我联系。
--------------------------------------------------------------------------------
via: https://opensource.com/article/18/7/introduction-go-arrays-and-slices
作者:[Mihalis Tsoukalos][a]
选题:[lkxed][b]
译者:[lkxed](https://github.com/lkxed)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/mtsouk
[b]: https://github.com/lkxed
[1]: https://opensource.com/sites/default/files/lead-images/traffic-light-go.png
[2]: https://opensource.com/article/18/5/creating-random-secure-passwords-go
[3]: https://opensource.com/article/18/5/building-concurrent-tcp-server-go
[4]: https://opensource.com/article/18/6/copying-files-go
[5]: https://golang.org/
[6]: https://github.com/mactsouk/opensource.com
[7]: https://twitter.com/mactsouk

View File

@ -0,0 +1,200 @@
[#]: collector: (lujun9972)
[#]: translator: (FYJNEVERFOLLOWS)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-14668-1.html)
[#]: subject: (Learn awk by coding a "guess the number" game)
[#]: via: (https://opensource.com/article/21/1/learn-awk)
[#]: author: (Chris Hermansen https://opensource.com/users/clhermansen)
通过编写“猜数字”游戏来学习 Awk
======
> 编程语言往往具有许多共同特征。学习一门新语言的好方法是去写一个熟悉的程序。在本文中,我将会使用 Awk 编写一个“猜数字”程序来展示熟悉的概念。
![](https://img.linux.net.cn/data/attachment/album/202206/03/130545jthh1vtoadahwahd.jpg)
当你学习一门新的编程语言时,最好把重点放在大多数编程语言都有的共同点上:
* 变量 —— 存储信息的地方
* 表达式 —— 计算的方法
* 语句 —— 在程序中表示状态变化的方法
这些概念是大多是编程语言的基础。
一旦你理解了这些概念,你就可以开始把其他的弄清楚。例如,大多数语言都有由其设计所支持的“处理方式”,这些方式在不同语言之间可能有很大的不同。这些方法包括模块化(将相关功能分组在一起)、声明式与命令式、面向对象、低级与高级语法特性等等。许多程序员比较熟悉的是编程“仪式”,即,在处理问题之前设置场景所需花费的工作。据说 Java 编程语言有一个源于其设计的重要仪式要求,就是所有代码都在一个类中定义。
但从根本上讲,编程语言通常有相似之处。一旦你掌握了一种编程语言,就可以从学习另一种语言的基本知识开始,品味这种新语言的不同之处。
一个好方法是创建一组基本的测试程序。有了这些,就可以从这些相似之处开始学习。
你可以选择创建的一个测试程序是“猜数字”程序。电脑从 1 到 100 之间选择一个数字,让你猜这个数字。程序一直循环,直到你猜对为止。
“猜数字”程序练习了编程语言中的几个概念:
* 变量
* 输入
* 输出
* 条件判断
* 循环
这是学习一门新的编程语言的一个很好的实践实验。
**注**:本文改编自 Moshe Zadka 在 [Julia][2] 中使用这种方法和 Jim Hall在 [Bash][3] 中使用这种方法的文章。
### 在 awk 程序中猜数
让我们编写一个实现“猜数字”游戏的 Awk 程序。
Awk 是动态类型的这是一种面向数据转换的脚本语言并且对交互使用有着令人惊讶的良好支持。Awk 出现于 20 世纪 70 年代,最初是 Unix 操作系统的一部分。如果你不了解 Awk但是喜欢电子表格这就是一个你可以 [去学习 Awk][4] 的信号!
您可以通过编写一个“猜数字”游戏版本来开始对 Awk 的探索。
以下是我的实现(带有行号,以便我们可以查看一些特定功能):
```
     1    BEGIN {
     2        srand(42)
     3        randomNumber = int(rand() * 100) + 1
     4        print "random number is",randomNumber
     5        printf "guess a number between 1 and 100\n"
     6    }
     7    {
     8        guess = int($0)
     9        if (guess &lt; randomNumber) {
    10            printf "too low, try again:"
    11        } else if (guess &gt; randomNumber) {
    12            printf "too high, try again:"
    13        } else {
    14            printf "that's right\n"
    15            exit
    16        }
    17    }
```
我们可以立即看到 Awk 控制结构与 C 或 Java 的相似之处,但与 Python 不同。
在像 `if-then-else`、`while` 这样的语句中,`then`、`else` 和 `while` 部分接受一个语句或一组被 `{``}` 包围的语句。然而Awk 有一个很大的区别需要从一开始就了解:
根据设计Awk 是围绕数据管道构建的。
这是什么意思呢?大多数 Awk 程序都是一些代码片段它们接收一行输入对数据做一些处理然后将其写入输出。认识到这种转换管道的需要Awk 默认情况下提供了所有的转换管道。让我们通过关于上面程序的一个基本问题来探索:“从控制台读取数据”的结构在哪里?
答案是——“内置的”。特别的,第 7-17 行告诉 Awk 如何处理被读取的每一行。在这种情况下,很容易看到第 1-6 行是在读取任何内容之前被执行的。
更具体地说,第 1 行上的 `BEGIN` 关键字是一种“模式”,在本例中,它指示 Awk 在读取任何数据之前,应该先执行 `{ ... }``BEGIN` 后面的内容。另一个类似的关键字 `END`,在这个程序中没有被使用,它指示 Awk 在读取完所有内容后要做什么。
回到第 7-17 行,我们看到它们创建了一个类似代码块 `{ ... }` 的片段,但前面没有关键字。因为在 `{` 之前没有任何东西可以让 Awk 匹配,所以它将把这一行用于接收每一行输入。每一行的输入都将由用户输入作为猜测。
让我们看看正在执行的代码。首先,是在读取任何输入之前发生的序言部分。
在第 2 行,我们用数字 42 初始化随机数生成器(如果不提供参数,则使用系统时钟)。为什么要用 42[当然要选 42][5] 第 3 行计算 1 到 100 之间的随机数,第 4 行输出该随机数以供调试使用。第 5 行邀请用户猜一个数字。注意这一行使用的是 `printf`,而不是 `print`。和 C 语言一样,`printf` 的第一个参数是一个用于格式化输出的模板。
既然用户知道程序需要输入她就可以在控制台上键入猜测。如前所述Awk 将这种猜测提供给第 7-17 行的代码。第 18 行将输入记录转换为整数;`$0` 表示整个输入记录,而 `$1` 表示输入记录的第一个字段,`$2` 表示第二个字段以此类推。是的Awk 使用预定义的分隔符(默认为空格)将输入行分割为组成字段。第 9-15 行将猜测结果与随机数进行比较,打印适当的响应。如果猜对了,第 15 行就会从输入行处理管道中提前退出。
就这么简单!
考虑到 Awk 程序不同寻常的结构,代码片段会对特定的输入行配置做出反应,并处理数据,让我们看看另一种结构,看看过滤部分是如何工作的:
```
     1    BEGIN {
     2        srand(42)
     3        randomNumber = int(rand() * 100) + 1
     4        print "random number is",randomNumber
     5        printf "guess a number between 1 and 100\n"
     6    }
     7    int($0) &lt; randomNumber {
     8        printf "too low, try again: "
     9    }
    10    int($0) &gt; randomNumber {
    11        printf "too high, try again: "
    12    }
    13    int($0) == randomNumber {
    14        printf "that's right\n"
    15        exit
    16    }
```
第 16 行代码没有改变。但是现在我们看到第 7-9 行是当输入整数值小于随机数时执行的代码,第 10-12 行是当输入整数值大于随机数时执行的代码,第 13-16 行是两者相等时执行的代码。
这看起来“很酷但很奇怪” —— 例如,为什么我们会重复计算 `int($0)`?可以肯定的是,用这种方法来解决问题会很奇怪。但这些模式确实是分离条件处理的非常好的方式,因为它们可以使用正则表达式或 Awk 支持的任何其他结构。
为了完整起见,我们可以使用这些模式将普通的计算与只适用于特定环境的计算分离开来。下面是第三个版本:
```
     1    BEGIN {
     2        srand(42)
     3        randomNumber = int(rand() * 100) + 1
     4        print "random number is",randomNumber
     5        printf "guess a number between 1 and 100\n"
     6    }
     7    {
     8        guess = int($0)
     9    }
    10    guess &lt; randomNumber {
    11        printf "too low, try again: "
    12    }
    13    guess &gt; randomNumber {
    14        printf "too high, try again: "
    15    }
    16    guess == randomNumber {
    17        printf "that's right\n"
    18        exit
    19    }
```
认识到这一点,无论输入的是什么值,都需要将其转换为整数,因此我们创建了第 7-9 行来完成这一任务。现在第 10-12、13-15 和 16-19 行这三组代码,都是指已经定义好的变量 guess而不是每次都对输入行进行转换。
让我们回到我们想要学习的东西列表:
* 变量 —— 是的Awk 有这些;我们可以推断出,输入数据以字符串形式输入,但在需要时可以转换为数值
* 输入 —— Awk 只是通过它的“数据转换管道”的方式发送输入来读取数据
* 输出 —— 我们已经使用了 Awk 的 `print``printf` 函数来将内容写入输出
* 条件判断 —— 我们已经学习了 Awk 的 `if-then-else` 和对应特定输入行配置的输入过滤器
* 循环 —— 嗯,想象一下!我们在这里不需要循环,这还是多亏了 Awk 采用的“数据转换管道”方法;循环“就这么发生了”。注意,用户可以通过向 Awk 发送一个文件结束信号(当使用 Linux 终端窗口时可通过快捷键 `CTRL-D`)来提前退出管道。
不需要循环来处理输入的重要性是非常值得的。Awk 能够长期保持存在的一个原因是 Awk 程序是紧凑的,而它们紧凑的一个原因是不需要从控制台或文件中读取的那些格式代码。
让我们运行下面这个程序:
```
$ awk -f guess.awk
random number is 25
guess a number between 1 and 100: 50
too high, try again: 30
too high, try again: 10
too low, try again: 25
that's right
$
```
我们没有涉及的一件事是注释。Awk 注释以 `#` 开头,以行尾结束。
### 总结
Awk 非常强大,这种“猜数字”游戏是入门的好方法。但这不应该是你探索 Awk 的终点。你可以看看 [Awk 和 GawkGNU Awk的历史][6]Gawk 是 Awk 的扩展版本,如果你在电脑上运行 Linux可能会有这个。或者从它的原始开发者那里阅读关于 [最初版本][7] 的各种信息。
你还可以 [下载我们的备忘单][8] 来帮你记录下你所学的一切。
> **[Awk 备忘单][8]**
--------------------------------------------------------------------------------
via: https://opensource.com/article/21/1/learn-awk
作者:[Chris Hermansen][a]
选题:[lujun9972][b]
译者:[FYJNEVERFOLLOWS](https://github.com/FYJNEVERFOLLOWS)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/clhermansen
[b]: https://github.com/lujun9972
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/question-mark_chalkboard.jpg?itok=DaG4tje9 (question mark in chalk)
[2]: https://opensource.com/article/20/12/julia
[3]: https://opensource.com/article/20/12/learn-bash
[4]: https://opensource.com/article/20/9/awk-ebook
[5]: https://en.wikipedia.org/wiki/42_(number)#The_Hitchhiker's_Guide_to_the_Galaxy
[6]: https://www.gnu.org/software/gawk/manual/html_node/History.html
[7]: https://archive.org/details/pdfy-MgN0H1joIoDVoIC7
[8]: https://opensource.com/downloads/cheat-sheet-awk-features

View File

@ -0,0 +1,124 @@
[#]: subject: "Creating random, secure passwords in Go"
[#]: via: "https://opensource.com/article/18/5/creating-random-secure-passwords-go"
[#]: author: "Mihalis Tsoukalos https://opensource.com/users/mtsouk"
[#]: collector: "lkxed"
[#]: translator: "lkxed"
[#]: reviewer: "wxy"
[#]: publisher: "wxy"
[#]: url: "https://linux.cn/article-14621-1.html"
在 Go 中生成随机的安全密码
======
> Go 的随机数生成器是生成难以猜测的密码的好方法。
![](https://img.linux.net.cn/data/attachment/album/202205/21/152534k13a1wly39fuywu2.jpg)
你可以使用 [Go 编程语言][2] 提供的随机数生成器来生成由 ASCII 字符组成的难以猜测的密码。尽管本文中提供的代码很容易阅读,但是你仍需要了解 Go 的基础知识,才能更好地理解它。如果你是对 Go 还不熟悉,请阅读 [Go 语言之旅][3] 来了解更多信息,然后返回此处。
在介绍实用程序和它的代码之前,让我们先来看看这个 ASCII 表的子集,它可以在 `man ascii` 命令的输出中找到:
```
30 40 50 60 70 80 90 100 110 120
 ---------------------------------
0:    (  2  <  F  P  Z  d   n   x
1:    )  3  =  G  Q  [  e   o   y
2:    *  4  >  H  R  \  f   p   z
3: !  +  5  ?  I  S  ]  g   q   {
4: "  ,  6  @  J  T  ^  h   r   |
5: #  -  7  A  K  U  _  i   s   }
6: $  .  8  B  L  V  `  j   t   ~
7: %  /  9  C  M  W  a  k   u  DEL
8: &  0  :  D  N  X  b  l   v
9: '  1  ;  E  O  Y  c  m   w
```
在所有 ASCII 字符中,可打印字符的十进制值范围为 33 到 126其他的 ASCII 值都不适合用于密码。因此,本文介绍的实用程序将生成该范围内的 ASCII 字符。
### 生成随机整数
第一个实用程序名为 `random.go`,它生成指定数量的随机整数,这些整数位于给定范围内。`random.go` 最重要的部分是这个函数:
```
func random(min, max int) int {
return rand.Intn(max-min) + min
}
```
此函数使用了 `rand.Intn()` 函数来生成一个属于给定范围的随机整数。请注意,`rand.Intn()` 返回一个属于 `[0,n)` 的非负随机整数。如果它的参数是一个负数,这个函数将会抛出异常,异常消息是:`panic: invalid argument to Intn`。你可以在 [math/rand 文档][4] 中找到 `math/rand` 包的使用说明。
`random.go` 实用程序接受三个命令行参数:生成的整数的最小值、最大值和个数。
编译和执行 `random.go` 会产生这样的输出:
```
$ go build random.go
$ ./random
Usage: ./random MIX MAX TOTAL
$ ./random 1 3 10
2 2 1 2 2 1 1 2 2 1
```
如果你希望在 Go 中生成更安全的随机数,请使用 Go 库中的 `crypto/rand` 包。
### 生成随机密码
第二个实用程序 `randomPass.go` 用于生成随机密码。`randomPass.go` 使用 `random()` 函数来生成随机整数,它们随后被以下 Go 代码转换为 ASCII 字符:
```
for {
myRand := random(MIN, MAX)
newChar := string(startChar[0] + byte(myRand))
fmt.Print(newChar)
if i == LENGTH {
break
}
i++
}
```
`MIN` 的值为 `0``MAX` 的值为 `94`,而 `startChar` 的值为 `!`,它是 ASCII 表中第一个可打印的字符(十进制 ASCII 码为 `33`)。因此,所有生成的 ASCII 字符都位于 `!``~` 之间,后者的十进制 ASCII 码为 `126`
因此,生成的每个随机数都大于 `MIN`,小于 `MAX`,并转换为 ASCII 字符。该过程继续进行,直到生成的密码达到指定的长度。
`randomPass.go` 实用程序接受单个(可选)命令行参数,以定义生成密码的长度,默认值为 8这是一个非常常见的密码长度。执行 `randomPass.go` 会得到类似下面的输出:
```
$ go run randomPass.go 1
Z
$ go run randomPass.go 10
#Cw^a#IwkT
$ go run randomPass.go
Using default values!
[PP8@'Ci
```
最后一个细节:不要忘记调用 `rand.Seed()`,并提供一个<ruby>种子<rt>seed</rt></ruby>值,以初始化随机数生成器。如果你始终使用相同的种子值,随机数生成器将生成相同的随机整数序列。
![随机数生成代码][5]
你可以在 [GitHub][6] 找到 `random.go``randomPass.go` 的源码。你也可以直接在 [play.golang.org][7] 上执行它们。
我希望这篇文章对你有所帮助。如有任何问题,请在下方发表评论或在 [Twitter][8] 上与我联系。
--------------------------------------------------------------------------------
via: https://opensource.com/article/18/5/creating-random-secure-passwords-go
作者:[Mihalis Tsoukalos][a]
选题:[lkxed][b]
译者:[lkxed](https://github.com/lkxed)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/mtsouk
[b]: https://github.com/lkxed
[1]: https://opensource.com/sites/default/files/lead-images/laptop-password.jpg
[2]: https://golang.org/
[3]: https://tour.golang.org/welcome/1
[4]: https://golang.org/pkg/math/rand/
[5]: https://opensource.com/sites/default/files/styles/panopoly_image_original/public/uploads/random.png?itok=DG0QPUGX
[6]: https://github.com/mactsouk/opensource.com
[7]: https://play.golang.org/
[8]: https://twitter.com/mactsouk

View File

@ -3,16 +3,16 @@
[#]: author: "Mihalis Tsoukalos https://opensource.com/users/mtsouk"
[#]: collector: "lkxed"
[#]: translator: "lkxed"
[#]: reviewer: " "
[#]: publisher: " "
[#]: url: " "
[#]: reviewer: "wxy"
[#]: publisher: "wxy"
[#]: url: "https://linux.cn/article-14623-1.html"
在 Go 中实现一个支持并发的 TCP 服务端
======
仅用大约 65 行代码,开发一个用于生成随机数、支持并发的 TCP 服务端。
![土拨鼠插图][1]
图源Renee French, CC BY 3.0
![](https://img.linux.net.cn/data/attachment/album/202205/22/115536nkfuuf4dklgg7fsx.jpg)
> 仅用大约 65 行代码,开发一个用于生成随机数、支持并发的 TCP 服务端。
TCP 和 UDP 服务端随处可见,它们基于 TCP/IP 协议栈,通过网络为客户端提供服务。在这篇文章中,我将介绍如何使用 [Go 语言][2] 开发一个用于返回随机数、支持并发的 TCP 服务端。对于每一个来自 TCP 客户端的连接,它都会启动一个新的 goroutine轻量级线程来处理相应的请求。
@ -22,7 +22,7 @@ TCP 和 UDP 服务端随处可见,它们基于 TCP/IP 协议栈,通过网络
这个程序的主要逻辑在 `handleConnection()` 函数中,具体实现如下:
```go
```
func handleConnection(c net.Conn) {
        fmt.Printf("Serving %s\n", c.RemoteAddr().String())
        for {
@ -44,14 +44,14 @@ func handleConnection(c net.Conn) {
}
```
如果 TCP 客户端发送了一个“STOP”字符串为它提供服务的 goroutine 就会终止否则TCP 服务端就会返回一个随机数给它。只要客户端不主动终止,服务端就会一直提供服务,这是由 `for` 循环保证的。具体来说,`for` 循环中的代码使用了 `bufio.NewReader(c).ReadString('\n')` 来逐行读取客户端发来的数据,并使用 `c.Write([]byte(string(result)))` 来返回数据(生成的随机数)。你可以在 Go 的 net 标准包 [文档][4] 中了解更多。
如果 TCP 客户端发送了一个 “STOP” 字符串,为它提供服务的 goroutine 就会终止否则TCP 服务端就会返回一个随机数给它。只要客户端不主动终止,服务端就会一直提供服务,这是由 `for` 循环保证的。具体来说,`for` 循环中的代码使用了 `bufio.NewReader(c).ReadString('\n')` 来逐行读取客户端发来的数据,并使用 `c.Write([]byte(string(result)))` 来返回数据(生成的随机数)。你可以在 Go 的 net 标准包 [文档][4] 中了解更多。
### 支持并发
`main()` 函数的实现部分,每当 TCP 服务端收到 TCP 客户端的连接请求,它都会启动一个新的 goroutine 来为这个请求提供服务。
```go
```
func main() {
        arguments := os.Args
        if len(arguments) == 1 {
@ -138,7 +138,7 @@ via: https://opensource.com/article/18/5/building-concurrent-tcp-server-go
作者:[Mihalis Tsoukalos][a]
选题:[lkxed][b]
译者:[lkxed](https://github.com/lkxed)
校对:[校对者ID](https://github.com/校对者ID)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出

View File

@ -0,0 +1,216 @@
[#]: subject: "3 ways to copy files in Go"
[#]: via: "https://opensource.com/article/18/6/copying-files-go"
[#]: author: "Mihalis Tsoukalos https://opensource.com/users/mtsouk"
[#]: collector: "lkxed"
[#]: translator: "lkxed"
[#]: reviewer: "wxy"
[#]: publisher: "wxy"
[#]: url: "https://linux.cn/article-14658-1.html"
在 Go 中复制文件的三种方法
======
![](https://img.linux.net.cn/data/attachment/album/202205/31/153413kcrth9v8c93r5u8e.jpg)
> 本文是 Go 系列的第三篇文章,我将介绍三种最流行的复制文件的方法。
本文将介绍展示如何使用 [Go 编程语言][3] 来复制文件。在 Go 中复制文件的方法有很多,我只介绍三种最常见的:使用 Go 库中的 `io.Copy()` 函数调用、一次读取输入文件并将其写入另一个文件,以及使用缓冲区一块块地复制文件。
### 方法一:使用 io.Copy()
第一种方法就是使用 Go 标准库的 `io.Copy()` 函数。你可以在 `copy()` 函数的代码中找到它的实现逻辑,如下所示:
```
func copy(src, dst string) (int64, error) {
sourceFileStat, err := os.Stat(src)
if err != nil {
return 0, err
}
if !sourceFileStat.Mode().IsRegular() {
return 0, fmt.Errorf("%s is not a regular file", src)
}
source, err := os.Open(src)
if err != nil {
return 0, err
}
defer source.Close()
destination, err := os.Create(dst)
if err != nil {
return 0, err
}
defer destination.Close()
nBytes, err := io.Copy(destination, source)
return nBytes, err
}
```
首先,上述代码做了两个判断,以便确定它可以被打开读取:一是判断将要复制的文件是否存在(`os.Stat(src)`),二是判断它是否为常规文件(`sourceFileStat.Mode().IsRegular()`)。剩下的所有工作都由 `io.Copy(destination, source)` 这行代码来完成。`io.Copy()` 函数执行结束后,会返回复制的字节数和复制过程中发生的第一条错误消息。在 Go 中,如果没有错误消息,错误变量的值就为 `nil`
你可以在 [io 包][4] 的文档页面了解有关 `io.Copy()` 函数的更多信息。
运行 `cp1.go` 将产生以下输出:
```
$ go run cp1.go
Please provide two command line arguments!
$ go run cp1.go fileCP.txt /tmp/fileCPCOPY
Copied 3826 bytes!
$ diff fileCP.txt /tmp/fileCPCOPY
```
这个方法已经非常简单了,不过它没有为开发者提供灵活性。这并不总是一件坏事,但是,有些时候,开发者可能会需要/想要告诉程序该如何读取文件。
### 方法二:使用 ioutil.WriteFile() 和 ioutil.ReadFile()
复制文件的第二种方法是使用 `ioutil.ReadFile()``ioutil.WriteFile()` 函数。第一个函数用于将整个文件的内容,一次性地读入到某个内存中的字节切片里;第二个函数则用于将字节切片的内容写入到一个磁盘文件中。
实现代码如下:
```
input, err := ioutil.ReadFile(sourceFile)
if err != nil {
fmt.Println(err)
return
}
err = ioutil.WriteFile(destinationFile, input, 0644)
if err != nil {
fmt.Println("Error creating", destinationFile)
fmt.Println(err)
return
}
```
上述代码包括了两个 `if` 代码块(嗯,用 Go 写程序就是这样的),程序的实际功能其实体现在 `ioutil.ReadFile()``ioutil.WriteFile()` 这两行代码中。
运行 `cp2.go`,你会得到下面的输出:
```
$ go run cp2.go
Please provide two command line arguments!
$ go run cp2.go fileCP.txt /tmp/copyFileCP
$ diff fileCP.txt /tmp/copyFileCP
```
请注意,虽然这种方法能够实现文件复制,但它在复制大文件时的效率可能不高。这是因为当文件很大时,`ioutil.ReadFile()` 返回的字节切片会很大。
### 方法三:使用 os.Read() 和 os.Write()
在 Go 中复制文件的第三种方法就是下面要介绍的 `cp3.go`。它接受三个参数:输入文件名、输出文件名和缓冲区大小。
`cp3.go` 最重要的部分位于以下 `for` 循环中,你可以在 `copy()` 函数中找到它,如下所示:
```
buf := make([]byte, BUFFERSIZE)
for {
n, err := source.Read(buf)
if err != nil && err != io.EOF {
return err
}
if n == 0 {
break
}
if _, err := destination.Write(buf[:n]); err != nil {
return err
}
}
```
该方法使用 `os.Read()` 将输入文件的一小部分读入名为 `buf` 的缓冲区,然后使用 `os.Write()` 将该缓冲区的内容写入文件。当读取出错或到达文件末尾(`io.EOF`)时,复制过程将停止。
运行 `cp3.go`,你会得到下面的输出:
```
$ go run cp3.go
usage: cp3 source destination BUFFERSIZE
$ go run cp3.go fileCP.txt /tmp/buf10 10
Copying fileCP.txt to /tmp/buf10
$ go run cp3.go fileCP.txt /tmp/buf20 20
Copying fileCP.txt to /tmp/buf20
```
在接下来的基准测试中,你会发现,缓冲区的大小极大地影响了 `cp3.go` 的性能。
### 运行基准测试
在本文的最后一部分,我将尝试比较这三个程序以及 `cp3.go` 在不同缓冲区大小下的性能(使用 `time(1)` 命令行工具)。
以下输出显示了复制 500MB 大小的文件时,`cp1.go`、`cp2.go` 和 `cp3.go` 的性能对比:
```
$ ls -l INPUT
-rw-r--r--  1 mtsouk  staff  512000000 Jun  5 09:39 INPUT
$ time go run cp1.go INPUT /tmp/cp1
Copied 512000000 bytes!
real    0m0.980s
user    0m0.219s
sys     0m0.719s
$ time go run cp2.go INPUT /tmp/cp2
real    0m1.139s
user    0m0.196s
sys     0m0.654s
$ time go run cp3.go INPUT /tmp/cp3 1000000
Copying INPUT to /tmp/cp3
real    0m1.025s
user    0m0.195s
sys     0m0.486s
```
我们可以看出,这三个程序的性能非常接近,这意味着 Go 标准库函数的实现非常聪明、经过了充分优化。
现在,让我们测试一下缓冲区大小对 `cp3.go` 的性能有什么影响吧!执行 `cp3.go`,并分别指定缓冲区大小为 10、20 和 1000 字节,在一台运行很快的机器上复制 500MB 文件,得到的结果如下:
```
$ ls -l INPUT
-rw-r--r--  1 mtsouk  staff  512000000 Jun  5 09:39 INPUT
$ time go run cp3.go INPUT /tmp/buf10 10
Copying INPUT to /tmp/buf10
real    6m39.721s
user    1m18.457s
sys 5m19.186s
$ time go run cp3.go INPUT /tmp/buf20 20
Copying INPUT to /tmp/buf20
real    3m20.819s
user    0m39.444s
sys 2m40.380s
$ time go run cp3.go INPUT /tmp/buf1000 1000
Copying INPUT to /tmp/buf1000
real    0m4.916s
user    0m1.001s
sys     0m3.986s
```
我们可以发现,缓冲区越大,`cp3.go` 运行得就越快,这或多或少是符合预期的。此外,使用小于 20 字节的缓冲区来复制大文件会非常缓慢,应该避免。
你可以在 [GitHub][5] 找到 `cp1.go`、`cp2.go` 和 `cp3.go` 的 Go 代码。
如果你有任何问题或反馈,请在(原文)下方发表评论或在 [Twitter][6] 上与我(原作者)联系。
--------------------------------------------------------------------------------
via: https://opensource.com/article/18/6/copying-files-go
作者:[Mihalis Tsoukalos][a]
选题:[lkxed][b]
译者:[lkxed](https://github.com/lkxed)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/mtsouk
[b]: https://github.com/lkxed
[1]: https://opensource.com/sites/default/files/lead-images/LIFE_cat.png
[3]: https://golang.org/
[4]: https://golang.org/pkg/io/
[5]: https://github.com/mactsouk/opensource.com
[6]: https://twitter.com/mactsouk

View File

@ -0,0 +1,163 @@
[#]: collector: (lujun9972)
[#]: translator: (CoWave-Fall)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-14632-1.html)
[#]: subject: (31 open source text editors you need to try)
[#]: via: (https://opensource.com/article/21/2/open-source-text-editors)
[#]: author: (Seth Kenlon https://opensource.com/users/seth)
值得尝试的 30 个开源文本编辑器
======
> 正在寻找新的文本编辑器?这里有 31 个编辑器可供尝试。
![](https://img.linux.net.cn/data/attachment/album/202205/24/184603krbzynnnikz8b0nc.jpg)
计算机是基于文本的,因此你使用它们做的事情越多,你可能就越需要文本编辑应用程序。你在文本编辑器上花费的时间越多,你就越有可能对你使用的编辑器提出更多的要求。
如果你正在寻找一个好的文本编辑器,你会发现 Linux 可以提供很多。无论你是想在终端、桌面还是在云端工作,你都可以试一试。你可以每天一款编辑器,连续着试一个月(或每月试一个,能够试三年)。坚持不懈,你终将找到适合你的完美的编辑器。
### Vim 类编辑器
![][2]
* [Vi][3] 通常随着 Linux 各发行版、BSD、Solaris 和 macOS 一起安装。它是典型的 Unix 文本编辑器,具有编辑模式和超高效的单键快捷键的独特组合。最初的 Vi 编辑器由 Bill Joy 编写(他也是 C shell 的作者。Vi 的现代版本,尤其是 Vim增加了许多特性包括多级撤消、在插入模式下更好的导航、行折叠、语法高亮、插件支持等等。但它需要学习如何使用它甚至有自己的教程程序`vimtutor`)。
* [Kakoune][4] 是一个受 Vim 启发的应用程序,它具有熟悉的简约界面、短键盘快捷键以及独立的编辑和插入模式。乍一看,它的外观和感觉很像 Vi但它在设计和功能上有自己独特的风格。 它有一个小彩蛋:具有 Clippy 界面的实现。
### emacs 编辑器
![][5]
* 从最初的免费 emacs 开始,发展到发起了自由软件运动的 GNU 项目的第一批官方应用程序,[GNU Emacs][6] 是一个广受欢迎的文本编辑器。它非常适合系统管理员、开发人员和日常用户的使用,具有大量功能和近乎无穷无尽的扩展。一旦你开始使用 emacs你可能会发现很难想出一个理由来关闭它因为它能做的事情非常多
* 如果你喜欢 emacs但觉得 GNU Emacs 过于臃肿,那么你可以试试 [Jove][7]。Jove 是一个基于终端的 emacs 编辑器。它很容易使用,但是如果你是使用 emacs 编辑器家族的新手,那么 Jove 也是很容易学习的,这要归功于 `teajove` 命令。
* 另一个轻量级的 emacs 编辑器是 [Jed][8]。它的工作流程基于宏。它与其他编辑器的不同之处在于它使用了 [S-Lang][9],这是一种类似 C 的脚本语言,它为使用 C 而不是使用 Lisp 的开发人员提供了扩展的机会。
### 交互式编辑器
![][10]
* [GNU nano][11] 对基于终端的文本编辑采取了大胆的立场:它提供了一个菜单。是的,这个不起眼的编辑器从 GUI 编辑器那里得到了提示,它告诉用户他们需要按哪个键来执行特定的功能。这是一种令人耳目一新的用户体验,所以难怪 nano 被设置为“用户友好”发行版的默认编辑器,而不是 Vi。
* [JOE][12] 基于一个名为 WordStar 的旧文本编辑应用程序。如果你不熟悉 WordstarJOE 也可以模仿 Emacs 或 GNU nano。默认情况下它是介于 Emacs 或 Vi 等相对神秘的编辑器和 GNU Nano 永远显示的冗长信息之间的一个很好的折衷方案(例如,它告诉你如何激活屏幕帮助显示,但默认情况下不启用)。
* [e3][13] 是一个优秀的小型文本编辑器,具有五个内置的键盘快捷键方案,用来模拟 Emacs、Vi、nano、NEdit 和 WordStar。换句话说无论你习惯使用哪种基于终端的编辑器你都可能对 e3 感到宾至如归。
### ed 及像 ed 一样的编辑器
* [POSIX][15] 和 Open Group 定义了基于 Unix 的操作系统的标准,[ed][14] 行编辑器是它的一部分。它安装在你遇到的几乎所有 Linux 或 Unix 系统上。它小巧、简洁、一流。
* 基于 ed[Sed][16] 流编辑器因其功能和语法而广受欢迎。大多数 Linux 用户在搜索如何最简单、最快捷的更新配置文件中的行的方法时,至少会遇到一个 `sed` 命令但它值得仔细研究一下。Sed 是一个强大的命令,包含许多有用的子命令。更好地了解了它,你可能会发现自己打开文本编辑器应用程序的频率要低得多。
* 你并不总是需要文本编辑器来编辑文本。[heredoc][17](或 Here Doc系统可在任何 POSIX 终端中使用,允许你直接在打开的终端中输入文本,然后将输入的内容通过管道传输到文本文件中。这不是最强大的编辑体验,但它用途广泛且始终可用。
### 极简风格的编辑器
![][18]
如果你认为一个好的文本编辑器就是一个文字处理器除了没有所有的处理功能的话你可能正在寻找这些经典编辑器。这些编辑器可让你以最少的干扰和最少的帮助写作和编辑文本。它们提供的功能通常以标记文本、Markdown 或代码为中心。有些名称遵循某种模式:
* [Gedit][19] 来自 GNOME 团队;
* [medit][20] 有经典的 GNOME 手感;
* [Xedit][21] 仅使用最基本的 X11 库;
* [jEdit][22] 适用于 Java 爱好者。
KDE 用户也有类似的:
* [Kate][23] 是一款低调的编辑器,拥有你需要的几乎所有功能;
* [KWrite][24] 在看似简单易用的界面中隐藏了大量有用的功能。
还有一些适用于其他平台:
* [Pe][26] 适用于 Haiku OS90 年代那个古怪的孩子 BeOS 的转世);
* [FeatherPad][27] 是适用于 Linux 的基本编辑器,但对 macOS 和 Haiku 有一些支持。如果你是一名希望移植代码的 Qt 黑客,请务必看一看!
### 集成开发环境IDE
![][28]
文本编辑器和集成开发环境IDE有很多相同之处。后者实际上只是前者加上许多为特定代码而添加的功能。如果你经常使用 IDE你可能会在扩展管理器中发现一个 XML 或 Markdown 编辑器:
* [NetBeans][29] 是一个方便 Java 用户的文本编辑器。
* [Eclipse][30] 提供了一个强大的编辑套件,其中包含许多扩展,可为你提供所需的工具。
### 云端编辑器
![][31]
在云端工作?当然,你也可以在那里进行编辑。
* [Etherpad][32] 是在网上运行的文本编辑器应用程序。有独立免费的实例供你使用,或者你也可以设置自己的实例。
* [Nextcloud][33] 拥有蓬勃发展的应用场景,包括内置文本编辑器和具有实时预览功能的第三方 Markdown 编辑器。
### 较新的编辑器
![][34]
每个人都会有让文本编辑器变得更完美的想法。因此,几乎每年都会发布新的编辑器。有些以一种新的、令人兴奋的方式重新实现经典的旧想法,有些对用户体验有独特的看法,还有些则专注于特定的需求。
* [Atom][35] 是来自 GitHub 的多功能的现代文本编辑器,具有许多扩展和 Git 集成。
* [Brackets][36] 是 Adobe 为 Web 开发人员提供的编辑器。
* [Focuswriter][37] 旨在通过无干扰的全屏模式、可选的打字机音效和精美的配置选项等有用功能帮助你专注于写作。
* [Howl][38] 是一个基于 Lua 和 Moonscript 的渐进式动态编辑器。
* [Norka][39] 和 [KJots][40] 模仿笔记本,每个文档代表“活页夹”中的“页面”。你可以通过导出功能从笔记本中取出单个页面。
### 自己制作编辑器
![][41]
俗话说得好:既然可以编写自己的应用程序,为什么要使用别人的(虽然其实没有这句俗语)?虽然 Linux 有超过 30 个常用的文本编辑器,但是再说一次,开源的一部分乐趣在于能够亲手进行实验。
如果你正在寻找学习编程的理由,那么制作自己的文本编辑器是一个很好的入门方法。你可以在大约 100 行代码中实现基础功能,并且你使用它的次数越多,你可能就越会受到启发,进而去学习更多知识,从而进行改进。准备好开始了吗?来吧,去 [创建你自己的文本编辑器][42]。
--------------------------------------------------------------------------------
via: https://opensource.com/article/21/2/open-source-text-editors
作者:[Seth Kenlon][a]
选题:[lujun9972][b]
译者:[CoWave-Fall](https://github.com/CoWave-Fall)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/seth
[b]: https://github.com/lujun9972
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/button_push_open_keyboard_file_organize.png?itok=KlAsk1gx (open source button on keyboard)
[2]: https://opensource.com/sites/default/files/kakoune-screenshot.png
[3]: https://opensource.com/article/20/12/vi-text-editor
[4]: https://opensource.com/article/20/12/kakoune
[5]: https://opensource.com/sites/default/files/jed.png
[6]: https://opensource.com/article/20/12/emacs
[7]: https://opensource.com/article/20/12/jove-emacs
[8]: https://opensource.com/article/20/12/jed
[9]: https://www.jedsoft.org/slang
[10]: https://opensource.com/sites/default/files/uploads/nano-31_days-nano-opensource.png
[11]: https://opensource.com/article/20/12/gnu-nano
[12]: https://opensource.com/article/20/12/31-days-text-editors-joe
[13]: https://opensource.com/article/20/12/e3-linux
[14]: https://opensource.com/article/20/12/gnu-ed
[15]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains
[16]: https://opensource.com/article/20/12/sed
[17]: https://opensource.com/article/20/12/heredoc
[18]: https://opensource.com/sites/default/files/uploads/gedit-31_days_gedit-opensource.jpg
[19]: https://opensource.com/article/20/12/gedit
[20]: https://opensource.com/article/20/12/medit
[21]: https://opensource.com/article/20/12/xedit
[22]: https://opensource.com/article/20/12/jedit
[23]: https://opensource.com/article/20/12/kate-text-editor
[24]: https://opensource.com/article/20/12/kwrite-kde-plasma
[25]: https://opensource.com/article/20/12/notepad-text-editor
[26]: https://opensource.com/article/20/12/31-days-text-editors-pe
[27]: https://opensource.com/article/20/12/featherpad
[28]: https://opensource.com/sites/default/files/uploads/eclipse-31_days-eclipse-opensource.png
[29]: https://opensource.com/article/20/12/netbeans
[30]: https://opensource.com/article/20/12/eclipse
[31]: https://opensource.com/sites/default/files/uploads/etherpad_0.jpg
[32]: https://opensource.com/article/20/12/etherpad
[33]: https://opensource.com/article/20/12/31-days-text-editors-nextcloud-markdown-editor
[34]: https://opensource.com/sites/default/files/uploads/atom-31_days-atom-opensource.png
[35]: https://opensource.com/article/20/12/atom
[36]: https://opensource.com/article/20/12/brackets
[37]: https://opensource.com/article/20/12/focuswriter
[38]: https://opensource.com/article/20/12/howl
[39]: https://opensource.com/article/20/12/norka
[40]: https://opensource.com/article/20/12/kjots
[41]: https://opensource.com/sites/default/files/uploads/this-time-its-personal-31_days_yourself-opensource.png
[42]: https://opensource.com/article/20/12/31-days-text-editors-one-you-write-yourself

View File

@ -0,0 +1,255 @@
[#]: subject: (Build a printer UI for Raspberry Pi with XML and Java)
[#]: via: (https://opensource.com/article/21/3/raspberry-pi-totalcross)
[#]: author: (Edson Holanda Teixeira Junior https://opensource.com/users/edsonhtj)
[#]: collector: (lujun9972)
[#]: translator: (CoWave-Fall)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-14620-1.html)
用 XML 和 Java 构建树莓派打印机的用户界面
======
> 使用 TotalCross 来快速构建嵌入式系统程序的用户界面。
![](https://img.linux.net.cn/data/attachment/album/202205/21/110711zv3t7n1o7hllhodt.jpg)
从头开始构建 GUI 是一个非常耗时的过程,以硬编码的方式处理所有的位置和对齐对于一些程序员来说确实很困难。所以在本文中,我将演示如何使用 XML 加快这一过程。
本项目使用 [TotalCross][2] 作为目标框架。TotalCross 是一个开源的跨平台软件开发工具包SDK旨在更快地为嵌入式设备创建 GUI。TotalCross 无需在设备上运行 Java 即可提供 Java 的开发优势,因为它使用自己的字节码和虚拟机(<ruby>TC 字节码<rt>TC bytecode</rt></ruby> 和 TCVM来增强性能。
我还使用了 Knowcode-XML这是一个用于 TotalCross 框架的开源 XML 解析器,它可以将 XML 文件转换为 TotalCross 组件。
### 项目需求
要重现此项目,你需要:
* [KnowCode-XML][3]
* [VSCode][4] 或 [VSCodium][5]
* [一个 Android 开发环境][6]
* [用于 VSCode 的 TotalCross 插件][7]
* 适用于你的开发平台([Linux][8]、[Mac][9] 或 [Windows][10])的 Java需要 Java 11或更高版本
* [Git][11]
### 制作嵌入式应用程序
该应用程序由一个具有扫描、打印和复印等基本打印功能的嵌入式 GUI 组成。
![打印机初始化画面][12]
构建这个 GUI 需要几个步骤,包括使用 Android-XML 生成 GUI然后使用 Knowcode-XML 解析器在 TotalCross 框架上运行它。
#### 1、生成 Android XML
要创建 XML 文件,首先构建一个简单的 Android 屏幕,然后对其进行自定义。如果你不知道如何编写 Android-XML或者你只是想简单尝试一下你可以从这个 [GitHub 项目][14] 中下载这个应用程序的 XML。该项目还包含渲染 GUI 要用到的图片。
#### 2、调整 XML
生成 XML 文件后,你需要进行一些微调以确保所有内容都已经对齐、比例正确并且图像的路径正确。
将 XML 布局添加到 `Layouts` 文件夹,将所有资源添加到 `Drawable` 文件夹。然后你就可以开始自定义 XML 了。
例如,如果想要更改 XML 对象的背景,可以更改 `android:background` 属性:
```
android:background="@drawable/scan"
```
你也可以使用 `tools:layout_editor_absoluteX``tools:layout_editor_absoluteY` 更改对象的位置:
```
tools:layout_editor_absoluteX="830dp"
tools:layout_editor_absoluteY="511dp"
```
或者使用 `android:layout_width``android:layout_height` 更改对象的大小:
```
android:layout_width="70dp"
android:layout_height="70dp"
```
如果要在对象上放置文本,可以使用 `android:textSize`、`android:text`、`android:textStyle` 和 `android:textColor`
```
android:textStyle="bold"
android:textColor="#000000"
android:textSize="20dp"
android:text="2:45PM"
```
下面是一个完整的 XML 对象的示例:
```
<ImageButton
android:id="@+id/ImageButton"
android:layout_width="70dp"
android:layout_height="70dp"
tools:layout_editor_absoluteX="830dp"
tools:layout_editor_absoluteY="511dp"
android:background="@drawable/home_config" />
```
#### 3、在 TotalCross 上运行 GUI
完成所有 XML 调整后,就可以在 TotalCross 上运行它了。在 TotalCross 扩展LCTT 译注:在 VSCode 里面)上创建一个新项目,并将 `XML``Drawable` 文件夹添加到 `Main` 文件夹里。如果你仍然不确定如何创建 TotalCross 项目,请参阅我们的 [入门指南][15]。
配置好环境后,使用 `totalcross.knowcode.parse.XmlContainerFactory``import totalcross.knowcode.parse.XmlContainerLayout` 在 TotalCross 框架上使用 XML GUI。 你可以在其 [GitHub 页面][3] 上找到更多关于使用 KnowCode-XML 的信息。
#### 4、添加过渡效果
这个项目的平滑过渡效果是由 `SlidingNavigator` 类创建的,它使用 TotalCross 的 `ControlAnimation` 类从一个屏幕滑到另一个屏幕。
`XMLpresenter` 类上调用 `SlidingNavigator`
```
new SlidingNavigator(this).present(HomePresenter.class);
```
`SlidingNavigator` 类上实现 `present` 函数:
```
public void present(Class<? extends XMLPresenter> presenterClass)
throws InstantiationException, IllegalAccessException {
final XMLPresenter presenter = cache.containsKey(presenterClass) ? cache.get(presenterClass)
: presenterClass.newInstance();
if (!cache.containsKey(presenterClass)) {
cache.put(presenterClass, presenter);
}
if (presenters.isEmpty()) {
window.add(presenter.content, LEFT, TOP, FILL, FILL);
} else {
XMLPresenter previous = presenters.lastElement();
window.add(presenter.content, AFTER, TOP, SCREENSIZE, SCREENSIZE, previous.content);
```
使用动画控件中的 `PathAnimation` 来创建从一个屏幕到另一个屏幕的滑动动画:
```
PathAnimation.create(previous.content, -Settings.screenWidth, 0, new ControlAnimation.AnimationFinished() {
@Override
public void onAnimationFinished(ControlAnimation anim) {
window.remove(previous.content);
}
}, 1000).with(PathAnimation.create(presenter.content, 0, 0, new ControlAnimation.AnimationFinished() {
@Override
public void onAnimation Finished(Control Animation anim) {
presenter.content.setRect(LEFT, TOP, FILL, FILL);
}
}, 1000)).start();
}
presenter.setNavigator(this);
presenters.push(presenter);
presenter.bind2();
if (presenter.isFirstPresent) {
presenter.onPresent();
presenter.isFirstPresent = false;
}
```
#### 5、加载环形进度条
打印机应用程序的另一个不错的功能是显示进度的加载屏幕动画。它包括文本和旋转动画。
![加载环形进度条][18]
通过添加定时器和定时器监听器来更新进度标签,然后调用函数 `spinner.start()` 来实现此功能。所有的动画都是由 TotalCross 和 KnowCode 自动生成的:
```
public void startSpinner() {
time = content.addTimer(500);
content.addTimerListener((e) -> {
try {
progress(); // Updates the Label
} catch (InstantiationException | IllegalAccessException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
});
Spinner spinner = (Spinner) ((XmlContainerLayout) content).getControlByID("@+id/spinner");
spinner.start();
}
```
这里的环形进度条被实例化为对 XML 文件中描述的 `XmlContainerLayout` `spinner` 的引用:
```
<ProgressBar
android:id="@+id/spinner"
android:layout_width="362dp"
android:layout_height="358dp"
tools:layout_editor_absoluteX="296dp"
tools:layout_editor_absoluteY="198dp"
android:indeterminateTint="#2B05C7"
style="?android:attr/progressBarStyle" />
```
#### 6、构建应用程序
是时候构建应用程序了。你可以在 `pom.xml` 中查看和更改<ruby>目标系统<rt>target systems</rt></ruby>。 请确保 `Linux Arm` 目标可用。
如果你使用的是 VSCode请按下键盘上的 `F1` 键,选择 `TotalCross: Package` 并等待完成。 然后就可以在 `Target` 文件夹中看到安装文件了。
#### 7、在树莓派上部署和运行应用程序
要使用 SSH 协议在 [树莓派][19] 上部署应用程序,请按键盘上的 `F1`。选择 `TotalCross: Deploy&Run` 并提供有关你的 SSH 连接的信息用户名、IP地址、密码和应用程序路径。
![TotalCross部署与运行][20]
![配置 SSH 用户名][21]
![配置 IP 地址][22]
![输入密码][23]
![配置路径][24]
### 总结
KnowCode 让使用 Java 创建和管理应用程序屏幕变得更加容易。Knowcode-XML 将你的 XML 转换为 TotalCross GUI 界面,然后生成二进制文件以在你的树莓派上运行。
将 KnowCode 技术与 TotalCross 相结合,使你能够更快地创建嵌入式应用程序。 你可以访问我们在 GitHub 上的 [嵌入式示例][25] 并编辑你自己的应用程序,了解你还可以做什么。
如果你有问题、需要帮助,或者只是想与其他嵌入式 GUI 开发人员互动,请随时加入我们的 [Telegram][26] 小组,讨论任何框架上的嵌入式应用程序。
--------------------------------------------------------------------------------
via: https://opensource.com/article/21/3/raspberry-pi-totalcross
作者:[Edson Holanda Teixeira Junior][a]
选题:[lujun9972][b]
译者:[CoWave-Fall](https://github.com/CoWave-Fall)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/edsonhtj
[b]: https://github.com/lujun9972
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/gears_devops_learn_troubleshooting_lightbulb_tips_520.png?itok=HcN38NOk (Tips and gears turning)
[2]: https://opensource.com/article/20/7/totalcross-cross-platform-development
[3]: https://github.com/TotalCross/knowcode-xml
[4]: https://code.visualstudio.com/
[5]: https://opensource.com/article/20/6/open-source-alternatives-vs-code
[6]: https://developer.android.com/studio
[7]: https://marketplace.visualstudio.com/items?itemName=totalcross.vscode-totalcross
[8]: https://opensource.com/article/19/11/install-java-linux
[9]: https://opensource.com/article/20/7/install-java-mac
[10]: http://adoptopenjdk.net
[11]: https://opensource.com/life/16/7/stumbling-git
[12]: https://opensource.com/sites/default/files/uploads/01_printergui.png (printer init screen)
[13]: https://creativecommons.org/licenses/by-sa/4.0/
[14]: https://github.com/TotalCross/embedded-samples/tree/main/printer-application/src/main/resources/layout
[15]: https://totalcross.com/get-started/?utm_source=opensource&utm_medium=article&utm_campaign=printer
[16]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+instantiationexception
[17]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+illegalaccessexception
[18]: https://opensource.com/sites/default/files/uploads/03progressspinner.png (Loading Spinner)
[19]: https://www.raspberrypi.org/products/raspberry-pi-4-model-b/
[20]: https://opensource.com/sites/default/files/uploads/04_totalcross-deployrun.png (TotalCross: Deploy&Run)
[21]: https://opensource.com/sites/default/files/uploads/05_ssh.png (SSH user)
[22]: https://opensource.com/sites/default/files/uploads/06_ip.png (IP address)
[23]: https://opensource.com/sites/default/files/uploads/07_password.png (Password)
[24]: https://opensource.com/sites/default/files/uploads/08_path.png (Path)
[25]: https://github.com/TotalCross/embedded-samples
[26]: https://t.me/totalcrosscommunity

View File

@ -3,82 +3,73 @@
[#]: author: "Arindam https://www.debugpoint.com/author/admin1/"
[#]: collector: "lujun9972"
[#]: translator: "geekpi"
[#]: reviewer: " "
[#]: publisher: " "
[#]: url: " "
[#]: reviewer: "turbokernel"
[#]: publisher: "wxy"
[#]: url: "https://linux.cn/article-14627-1.html"
如何在 Ubuntu 22.04 LTS 中安装 Classic GNOME Flashback
Ubuntu 22.04 LTS 中安装经典 GNOME Flashback 指南
======
关于如何在最新的 UBUNTU 22.04 LTS 中安装旧的 Classic GNOME Flashback 的快速指南。
[GNOME Flashback][1](又名 classic GNOME是旧 GNOME 3 shell 的一个分支,它使用早期 GNOME 2 技术的布局和原则。它的速度快如闪电,并且在设计上占用的 CPU 和系统资源非常少。因此,它非常适合可以追溯到几十年前的旧硬件。
![](https://img.linux.net.cn/data/attachment/album/202205/23/151318xi8c3qipphg8xz0i.jpg)
随着带有现代 GNOME 42 的 [Ubuntu 22.04 LTS][2] 的发布,有必要寻找消耗很少系统资源的桌面环境选项
> 关于如何在最新的 UBUNTU 22.04 LTS 中安装旧的经典 GNOME Flashback 的快速指南
此外GNOME Flashback 很容易安装在现代 Ubuntu Linux 中,你仍然可以享受 Ubuntu 性能而不必担心 GNOME 42、GTK4、libadwaita 和其他东西
[GNOME Flashback][1](又名 classic GNOME是旧 GNOME 3 shell 的一个分支,它使用早期 GNOME 2 技术的布局和原则。它的速度快如闪电,并且在设计上非常轻量级。因此,它非常适合几十年前的老旧硬件
### 在 Ubuntu 22.04 LTS 中下载并安装 Classic GNOME Flashback
随着带有现代 GNOME 42 的 [Ubuntu 22.04 LTS][2] 的发布,有必要寻找轻量级的桌面环境选项。
此外GNOME Flashback 很容易安装在现代 Ubuntu Linux 中,你仍然可以享受 Ubuntu 性能而不必关心 GNOME 42、GTK4、libadwaita 之类的东西。
### 在 Ubuntu 22.04 LTS 中下载并安装经典 GNOME Flashback
按照以下步骤在 Ubuntu 22.04 LTS 中下载并安装经典 GNOME FlashbackMetacity
在 Ubuntu 22.04 LTS 中打开终端CTRL+ALT+T并运行以下命令。安装大小约为 61MB。
```
sudo apt update
```
```
sudo apt install gnome-session-flashback
sudo apt update
sudo apt install gnome-session-flashback
```
![Install GNOME Classic Flashback Metacity in Ubuntu 22.04 LTS][3]
最后,安装完成后,退出。重新登录时,在登录选项中使用 GNOME Classic
最后,安装完成后,退出。重新登录时,在登录选项中使用经典的 GNOME FlashbackMetacity
![Choose GNOME Classic while logging in][3]
![Choose GNOME Classic while logging in][3a]
### 经典 GNOME Flashback 的特点
首先,当你登录时,你将体验到传统的 GNOME 技术,该技术已被证明具有良好的生产力并且比今天的技术快得多。
首先,当你登录时,你将体验到传统的 GNOME 技术,它已被证明具有良好的生产力,并且比今天的技术快得多。
在顶部有旧版面板,左侧是应用菜单,而系统托盘位于桌面的右上方。应用程序菜单显示所有已安装的应用和软件快捷方式,你可以在工作流程中轻松浏览。
在顶部有旧版面板,左侧是应用菜单,而系统托盘位于桌面的右上方。应用程序菜单显示所有已安装的应用和软件快捷方式,你可以在工作流程中轻松浏览。
此外,在右侧部分,系统托盘具有默认小部件,例如网络、音量控制、日期和时间以及关机菜单。
![Classic GNOME Flashback Metacity in Ubuntu 22.04 LTS][3]
![Classic GNOME Flashback Metacity in Ubuntu 22.04 LTS][3b]
底部面板包含打开的窗口和工作区切换器的应用列表。默认情况下,它为你提供四个工作区供你使用。
此外,你可以随时更改顶部面板的设置以自动隐藏、调整面板大小和背景颜色。
除此之外,你可以通过 ALT+Rigth 单击顶部面板添加任意数量的旧版小程序。
除此之外,你可以通过 `ALT + 右键点击` 顶部面板添加任意数量的旧版小程序。
![Panel Context Menu][3]
![Panel Context Menu][3c]
![Add to panel widgets][3]
![Add to panel widgets][3d]
### GNOME Classic 的性能
### 经典 GNOME 的性能
首先,磁盘空间占用极小,仅安装 61 MB。我的测试使用了大约 28% 的内存,其中大部分被其他进程占用。猜猜是谁?是的,是 snap-store 又名 Ubuntu 软件
首先,磁盘空间占用极小,仅安装 61 MB。我的测试使用了大约 28% 的内存,其中大部分被其他进程占用。猜猜是谁?是的,是 snap-store(又名 Ubuntu 软件)
因此,总体而言,它非常轻巧,内存(仅 28 MB和 CPU0.1%)占用空间非常小。
![Performance of GNOME Classic in Ubuntu 22.04][3]
![Performance of GNOME Classic in Ubuntu 22.04][3e]
此外,假设你将其与同样使用相同技术的 Ubuntu MATE 进行比较。在这种情况下,它比 MATE 更轻量,因为你不需要任何额外的 MATE 应用及其用于通知、主题和其他补充资源的本机包。
此外,假设你将其与同样使用相同技术的 Ubuntu MATE 进行比较。在这种情况下,它比 MATE 更轻量,因为你不需要任何额外的 MATE 应用及其用于通知、主题和其他附加资源的软件包。
### 结束语
我希望本指南在你决定在 Ubuntu 22.04 LTS Jammy Jellyfish 中安装 GNOME Classic 之前帮助你获得必要的信息。
* * *
我们带来最新的技术、软件新闻和重要的东西。通过 [Telegram][4]、[Twitter][5]、[YouTube][6] 和 [Facebook][7] 保持联系,不错过任何更新!
我希望本指南在你决定在 Ubuntu 22.04 LTS Jammy Jellyfish 中安装经典 GNOME 之前帮助你获得必要的信息。
--------------------------------------------------------------------------------
@ -87,7 +78,7 @@ via: https://www.debugpoint.com/2022/05/gnome-classic-ubuntu-22-04/
作者:[Arindam][a]
选题:[lujun9972][b]
译者:[geekpi](https://github.com/geekpi)
校对:[校对者ID](https://github.com/校对者ID)
校对:[turbokernel](https://github.com/turbokernel)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
@ -95,7 +86,12 @@ via: https://www.debugpoint.com/2022/05/gnome-classic-ubuntu-22-04/
[b]: https://github.com/lujun9972
[1]: https://wiki.archlinux.org/index.php/GNOME/Flashback
[2]: https://www.debugpoint.com/2022/01/ubuntu-22-04-lts/
[3]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
[3]: https://www.debugpoint.com/wp-content/uploads/2022/05/Install-GNOME-Classic-Flashback-Metacity-in-Ubuntu-22.04-LTS.jpg
[3a]: https://www.debugpoint.com/wp-content/uploads/2022/05/Choose-GNOME-Classic-while-loggin-in.jpg
[3b]: https://www.debugpoint.com/wp-content/uploads/2022/05/Classic-GNOME-Flashback-Metacity-in-Ubuntu-22.04-LTS.jpg
[3c]: https://www.debugpoint.com/wp-content/uploads/2020/04/Panel-Context-Menu.png
[3d]: https://www.debugpoint.com/wp-content/uploads/2020/04/Add-to-panel-widgets.png
[3e]: https://www.debugpoint.com/wp-content/uploads/2022/05/Performance-of-GNOME-Classic-in-Ubuntu-22.04.jpg
[4]: https://t.me/debugpoint
[5]: https://twitter.com/DebugPoint
[6]: https://www.youtube.com/c/debugpoint?sub_confirmation=1

View File

@ -3,32 +3,32 @@
[#]: author: "Hannah Smith https://opensource.com/users/hanopcan"
[#]: collector: "lkxed"
[#]: translator: "PeterPan0106"
[#]: reviewer: " "
[#]: publisher: " "
[#]: url: " "
[#]: reviewer: "wxy"
[#]: publisher: "wxy"
[#]: url: "https://linux.cn/article-14625-1.html"
开源为可持续发展技术提供新思路
======
开源和社会对于更为稳定的技术演进的需求具有相同的目标,即实现一个更为可持续的未来。
![][1]
(图源: opensource.com)
> 开源和社会对于更为稳定的技术演进的需求具有相同的目标,即实现一个更为可持续的未来。
在可持续发展和环境问题上目前正在发生明确的变化。关注地球的状况并为之做出努力已经成为主流思想。举个例子看看基于气候的风险资本主义。气候技术风险投资公司CTVC的气候资本名单在过去两年中增加了[一倍多][2]。涌入的资本表明了解决艰难的气候挑战的愿望和意愿。
![](https://img.linux.net.cn/data/attachment/album/202205/22/160753zekl2094033e4igr.jpg)
在可持续发展和环境问题上,目前正在发生明确的变化。关注地球的状况并为之做出努力已经成为主流思想。举个例子,看看基于气候的风险资本主义。<ruby>气候技术风险投资公司<rt>Climate Tech Venture Capital</rt></ruby>CTVC的气候资本名单在过去两年中增加了 [一倍多][2]。涌入的资本表明了人们对解决艰难的气候挑战的愿望和意愿。
人们想采取行动,这很好,我持相同态度!但我也看到了一个真正的风险:当人们急于采取行动并参与到其中时,他们可能会不知不觉地卷入洗绿运动中。
维基百科对 "洗绿 "的定义称其为 "一种营销策略,其中绿色公关和绿色营销被欺骗性地用来说服公众,使其相信一个组织的产品、目标和政策是环保的"。在我看来,洗绿既是有意为之,也是无意中发生的。外面有很多想有所作为的好人,但对复杂的环境系统或围绕可持续发展的问题的深度还不甚了解。
维基百科对 <ruby>洗绿<rt>greenwashing</rt></ruby>” 的定义称其为 “一种营销策略,其中绿色公关和绿色营销被欺骗性地用来说服公众,使其相信一个组织的产品、目标和政策是环保的。在我看来,洗绿既是有意为之,也是无意中发生的。外面有很多想有所作为的好人,但对复杂的环境系统或围绕可持续发展的问题的深度还不甚了解。
我们很容易落入这样的陷阱,即认为通过植树来抵消旅行或数据中心的排放等简单的购买行为会使一些东西变得更加绿色。虽然这些努力是值得提倡的,而且植树是改善可持续发展的一个可行的解决方案,但它们只是一个很好的开端,仍然需要进行更多的努力才能真正产生变革。
那么,一个人或一个社区可以做些什么来使数字技术真正地更加可持续?
可持续性对不同的人有不同的含义。我喜欢的最简短的定义来自1987年的《布伦特兰报告》该报告将其概括为 "既能满足当代的需要,同时又不损及后代满足其需要的发展模式"。可持续发展的核心是优先考虑长期思维。
可持续性对不同的人有不同的含义。我喜欢的最简短的定义来自 1987 年的《<ruby>布伦特兰报告<rt>Bruntland Report</rt></ruby>》,该报告将其概括为 “既能满足当代的需要,同时又不损及后代满足其需要的发展模式”。可持续发展的核心是优先考虑长期思维。
### 可持续发展不仅仅是保护环境
在可持续性的定义中,有三个相互关联的关键支柱
在可持续性的定义中,有三个相互关联的关键支柱
1. 环境
2. 经济 / 政策
@ -36,35 +36,35 @@
关于可持续发展的讨论越来越多地被气候危机所主导,这是有道理的。随着我们继续通过不可逆转的生态临界点,减少世界上较富裕国家的碳排放的需求变得越来越紧迫。但真正的可持续性是一套更全面的体系,正如三大支柱所展示的那样。
碳排放无疑是可持续性的一部分。许多人认为排放只是一个环境问题。只要从空气中移除更多的碳,一切都会好起来。但社会问题也是可持续性的一部分。谁会受到这些碳排放的影响?谁将承受我们气候变化带来的最大影响?谁因海平面上升而失去了家园,或因天气模式变化而失去了可靠的水源?这就是为什么你可能听说过 "气候正义就是社会正义 "这句话。
碳排放无疑是可持续性的一部分。许多人认为排放只是一个环境问题。只要从空气中移除更多的碳,一切都会好起来。但社会问题也是可持续性的一部分。谁会受到这些碳排放的影响?谁将承受我们气候变化带来的最大影响?谁因海平面上升而失去了家园,或因天气模式变化而失去了可靠的水源?这就是为什么你可能听说过 “气候正义就是社会正义” 这句话。
仅仅把减碳看作是可持续发展会令你的视野被限定在碳上。我经常认为,气候变化是社会在更大范围内错失可持续性的一个症状。相反,关键是要解决首先导致气候变化的根本原因。解决这些问题将使长期解决这些问题成为可能,而短期解决可能只会将问题推向另一个脆弱的边缘。
其根本原因很复杂。但是,如果我追根溯源,我看到根本问题是由主导的西方价值观并旨在延续这些价值观的系统所驱动的。这些价值观是什么呢?一语概之,它们是快速增长和对利润的攫取高于一切。
其根本原因很复杂。但是,如果我追根溯源,我看到根源是由西方的主流价值观和旨在延续这些价值观的制度所驱动的。这些价值观是什么呢?一语概之,它们是快速增长和对利润的攫取高于一切。
这就是为什么关于可持续性的对话如果不包括社会问题或经济的设计方式,就不会达成真正的解决方案。毕竟,社会和掌握权力的人决定了他们自己的价值观是什么,或者不是什么。
### 我能做什么?
科技领域的许多人目前正致力于解决这些问题并想知道怎样行动更有意义。一个常见的方法是研究如何优化他们制造的技术使其更有效地使用电力。世界上60%的电力仍然是通过燃烧化石燃料产生的,尽管可再生能源的发电能力不断提高。但从逻辑上讲,使用更少的电力意味着产生更少的碳排放。
科技领域的许多人目前正致力于解决这些问题,并想知道怎样行动更有意义。一个常见的方法是研究如何优化他们制造的技术,使其更有效地使用电力。世界上 60% 的电力仍然是通过燃烧化石燃料产生的,尽管可再生能源的发电能力不断提高。但从逻辑上讲,使用更少的电力意味着产生更少的碳排放。
是的,这是很有意义的,任何人都可以尝试,立即就能生效。当用户加载一个页面时,优化发送的资源,以发送更少的数据,将使用更少的能源。因此,优化服务器,使其在一天中的不同时段运行,例如,当有更多的可再生能源可用时运行,或删除多余信息的旧存储,如分析数据或日志。
但考虑到杰文的悖论:使某样东西更有效率往往会导致使用更多的东西,而不是减少。当人们更容易和更容易使用某样东西时,他们最终会使用更多。在某种角度,这是好的。性能更好的技术是一件好事,有助于提高包容性和触及性,这对社会是有益的。但是,气候变化和可持续性的长期解决方案需要围绕社会和技术之间的关系进行更深入、更令人不适的对话。所有这些技术在为什么和谁服务?它正在加速哪些行为和做法?
但考虑到<ruby>杰文<rt>Jevon</rt></ruby>的悖论:使某样东西更有效率往往会导致使用更多的东西,而不是减少。当人们更容易和更便于使用某样东西时,他们最终会使用更多。在某种角度,这是好的。性能更好的技术是一件好事,有助于提高包容性和触及性,这对社会是有益的。但是,气候变化和可持续性的长期解决方案需要围绕社会和技术之间的关系进行更深入、更令人不适的对话。所有这些技术在为什么和谁服务?它正在加速哪些行为和做法?
将技术的演进视为进步很正常,一些人认为:技术将把世界从气候变化中拯救出来。一些聪明的人正在通过艰苦卓绝的努力改善这一问题,所以其他人不需要改变他们的方式。问题是,许多社区和生态系统已经在遭受更大的创伤。
例如对更多更高速传输的数据的追求正在导致智利的一些社区没有足够的水来种植农作物。因为数据中心正在使用这些宝贵的水源。移动电话造成的污染有70%来自于其制造。制造移动设备并为其提供动力的锂和钴等原材料通常是从弱势的社区中提取的,而这些社区几乎没有能力阻止制造商对其土地的破坏,当然也没有分享所获利润。尽管如此,每两年升级一次手机的做法已经变得很普遍了。
例如,对更多更高速传输的数据的追求正在导致智利的一些社区没有足够的水来种植农作物。因为数据中心正在使用这些宝贵的水源。移动电话造成的污染有 70% 来自于其制造。制造移动设备并为其提供动力的锂和钴等原材料通常是从弱势的社区中提取的,而这些社区几乎没有能力阻止制造商对其土地的破坏,当然也没有分享所获利润。尽管如此,每两年升级一次手机的做法已经变得很普遍了。
### 开源思路引领可持续发展之路
现在是时候将数字技术的使用视为一种宝贵的资源,这对地球和(通常已经处于弱势的)社区都有影响。
开源社区已经帮助人们认识到有另一种解决方案:开源。开源与我们更广泛的社会为实现更可持续的未来而需要做的事情之间有巨大的相似之处。更加开放和包容是其中的一个关键部分。
开源社区已经帮助人们认识到有另一种解决方案:开源。开源与我们更广泛的社会为实现更可持续的未来而需要做的事情之间有巨大的相似之处。更加开放和包容是其中的一个关键部分。
我们还需要在社会的各个层面进行思维转变,将数字技术视为有代价的增长,而不是我们今天看到的大量廉价和免费的东西。我们需要明智地将其优先用于对于社会而言最为重要的事情。更重要的是,我们需要关注并消除其创造和长期使用所带来的危害,并与社会上的每个人公平地分享其创造的财富,无论他们是否是数字技术的使用者。这些事情不会在一夜之间发生,但它们是我们可以共同推动的事情,以便我们都能长期、可持续地享受数字技术的好处。
本文节选自一篇较长的演讲。要想看到演讲的全文或查看幻灯片,请参见 ["我们如何使数字技术更具有可持续性 "][3]一文。
本文节选自一篇较长的演讲。要想看到演讲的全文或查看幻灯片,请参见《[我们如何使数字技术更具有可持续性][3]》一文。
--------------------------------------------------------------------------------
@ -73,7 +73,7 @@ via: https://opensource.com/article/22/5/open-source-sustainable-technology
作者:[Hannah Smith][a]
选题:[lkxed][b]
译者:[PeterPan0106](https://github.com/PeterPan0106)
校对:[校对者ID](https://github.com/校对者ID)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出

View File

@ -3,13 +3,15 @@
[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/"
[#]: collector: "lkxed"
[#]: translator: "geekpi"
[#]: reviewer: " "
[#]: publisher: " "
[#]: url: " "
[#]: reviewer: "wxy"
[#]: publisher: "wxy"
[#]: url: "https://linux.cn/article-14619-1.html"
无法在 Ubuntu 22.04 上运行 AppImage这是解决方法
======
![该图片由 Ryan McGuire 在 Pixabay 上发布](https://img.linux.net.cn/data/attachment/album/202205/21/093854fdcjm47bqyjm6vqz.jpg)
最近发布的 [Ubuntu 22.04 LTS 充满了新的视觉变化和功能][1]。
但与任何其他版本一样,它也存在一些错误和问题。
@ -36,7 +38,7 @@
sudo apt install libfuse2
```
如果你不熟悉终端,那么你需要了解以下内容。它会要求你输入 sudo 密码。实际上,那是你的帐户密码。 **当你输入密码时,屏幕上不会显示任何内容**。这是设计使然。只需继续输入密码并输入。
如果你不熟悉终端,那么你需要了解以下内容。它会要求你输入 `sudo` 密码。实际上,那是你的帐户密码。 **当你输入密码时,屏幕上不会显示任何内容**。这是设计使然。只需继续输入密码并输入。
![Install libfuse2 in Ubuntu][4]
@ -44,25 +46,25 @@ sudo apt install libfuse2
这个不用说了。你需要对下载的应用的 AppImage 文件具有“执行”权限。
转到你已下载所需应用的 AppImage 文件的文件夹。**右键单击**并**选择属性**
转到你已下载所需应用的 AppImage 文件的文件夹。右键单击并选择<ruby>属性<rt>Properties</rt></ruby>
现在转到**权限选项卡**并选中“**允许将文件作为程序执行**”选项。
现在转到<ruby>权限<rt>Permissions</rt></ruby>选项卡并选中“<ruby>允许将文件作为程序执行<rt>Allow executing file as program</rt></ruby>”选项。
![give execute permission to AppImage file][5]
设置完成后就好了。现在只需双击该文件,它就会按预期运行应用。
获取 libfuse 的这个小步骤在我的[安装 Ubuntu 22.04 后推荐要做的事情列表][6]上了。
获取 libfuse 的这个小步骤已经在我的 [安装 Ubuntu 22.04 后推荐要做的事情列表][6] 上了。
#### 进一步的故障排除提示
### 进一步的故障排除提示
你的 AppImage 文件仍未运行?你下载的 AppImage 可能会出现一些其他问题,使其无法运行。
检查它的一种方法是下载一个已知的应用,如 [Balena Etcher][7] 并查看其 AppImage 文件是否有效。如果这个没问题,那么当你下载的另一个应用的 AppImage 文件无法工作你可以通过从终端运行 AppImage 文件并分析它显示的错误来深入挖掘。
检查它的一种方法是下载一个已知的应用,如 [Balena Etcher][7] 并查看其 AppImage 文件是否有效。如果这个没问题,那么当你下载的另一个应用的 AppImage 文件无法工作你可以通过从终端运行 AppImage 文件并分析它显示的错误来深入挖掘。
#### 对你有用吗?
### 对你有用吗?
继续尝试。如果有效,请给我写个谢谢。如果仍然没有,请在评论部分中提及详细信息,我会尽力帮助你。
继续尝试。如果有效,请给我写个“感谢”。如果仍然没有解决,请在评论部分中提及详细信息,我会尽力帮助你。
--------------------------------------------------------------------------------
@ -71,7 +73,7 @@ via: https://itsfoss.com/cant-run-appimage-ubuntu/
作者:[Abhishek Prakash][a]
选题:[lkxed][b]
译者:[geekpi](https://github.com/geekpi)
校对:[校对者ID](https://github.com/校对者ID)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出

View File

@ -0,0 +1,181 @@
[#]: subject: "How to Install Fedora 36 Workstation Step by Step"
[#]: via: "https://www.linuxtechi.com/how-to-install-fedora-workstation/"
[#]: author: "Pradeep Kumar https://www.linuxtechi.com/author/pradeep/"
[#]: collector: "lkxed"
[#]: translator: "robsean"
[#]: reviewer: "wxy"
[#]: publisher: "wxy"
[#]: url: "https://linux.cn/article-14637-1.html"
图解 Fedora 36 工作站安装步骤
======
![](https://img.linux.net.cn/data/attachment/album/202205/26/085318lbeqqwwevbzzwb4o.jpg)
给 Fedora 用户的好消息Fedora 36 操作系统已经正式发布了。这个发布版本是针对工作站(桌面)和服务器的。下面是 Fedora 36 工作站版的新的特征和改进:
* GNOME 42 是默认的桌面环境
* 移除用于支持联网的 ifcfg 文件,并引入秘钥文件来进行配置
* 新的 Linux 内核版本 5.17
* 软件包更新为新版本,如 PHP 8.1、gcc 12、OpenSSL 3.0、Ansible 5、OpenJDK 17、Ruby 3.1、Firefox 98 和 LibreOffice 7.3
* RPM 软件包数据库从 `/var` 移动到了 `/usr` 文件夹。
* Noto 字体是默认的字体,它将提供更好的用户体验。
在这篇指南中,我们将图解安装 Fedora 36 工作站的步骤。在进入安装步骤前,请确保你的系统满足下面的必要条件。
* 最少 2GB 内存(或者更多)
* 双核处理器
* 25 GB 硬盘磁盘空间(或者更多)
* 可启动介质
心动不如行动,让我们马上深入安装步骤。
### 1、下载 Fedora 36 工作站的 ISO 文件
使用下面的链接来从 Fedora 官方网站下载 ISO 文件。
> **[下载 Fedora Workstation][1]**
在 ISO 文件下载后,接下来将其刻录到 U 盘,使其可启动。
### 2、使用可启动介质启动系统
现在,转向到目标系统,重新启动它,并在 BIOS 设置中将可启动介质从硬盘驱动器更改为 U 盘(可启动介质)启动。在系统使用可启动介质启动后,我们将看到下面的屏幕。
![Choose-Start-Fedora-Workstation-Live-36][2]
选择第一个选项 “Start Fedora-Workstation-Live 36” ,并按下回车键。
### 3、选择安装到硬盘驱动器
![Select-Install-to-Hardrive-Fedora-36-workstation][3]
选择 “<ruby>安装到硬盘<rt>Install to Hard Drive</rt></ruby>” 选项来继续安装。
### 4、选择你的首选语言
选择你的首选语言来适应你的安装过程。
![Language-Selection-Fedora36-Installation][4]
单击 “<ruby>继续<rt>Continue</rt></ruby>” 按钮。
### 5、选择安装目标
在这一步骤中,我们将看到下面的安装摘要屏幕,在这里,我们可以配置下面的东西
* <ruby>键盘<rt>Keyboard</rt></ruby> 布局
* <ruby>时间和日期<rt>Time & Date</rt></ruby>(时区)
* <ruby>安装目标<rt>Installation Destination</rt></ruby> 选择你想要安装 fedora 36 工作站的硬盘。
![Default-Installation-Summary-Fedora36-workstation][5]
单击 “<ruby>安装目标<rt>Installation Destination</rt></ruby>” 按钮。
在下面的屏幕中,选择用于安装 Fedora 的硬盘驱动器。也从 “<ruby>存储配置<rt>Storage configuration</rt></ruby>” 标签页中选择一个选项。
* “<ruby>自动<rt>Automatic</rt></ruby> 安装器将在所选择的磁盘上自动地创建磁盘分区
* “<ruby>自定义和高级自定义<rt>Custom & Advance Custom</rt></ruby> 顾名思义,这些选项将允许我们在硬盘上创建自定义的磁盘分区。
在这篇指南中,我们将使用第一个选项 “<ruby>自动<rt>Automatic</rt></ruby>
![Automatic-Storage-configuration-Fedora36-workstation-installation][6]
单击 “<ruby>完成<rt>Done</rt></ruby>” 按钮,来继续安装。
### 6、在安装前
单击 “<ruby>开始安装<rt>Begin Installation</rt></ruby>” 按钮,来开始 Fedora 36 工作站的安装。
![Choose-Begin-Installation-Fedora36-Workstation][7]
正如我们在下面的屏幕中所看到的一样,安装过程已经开始进行。
![Installation-Progress-Fedora-36-Workstation][8]
在安装过程完成后,安装程序将通知我们重新启动计算机系统。
![Select-Finish-Installation-Fedora-36-Workstation][9]
单击 “<ruby>完成安装<rt>Finish Installation</rt></ruby>” 按钮以重新启动计算机系统。也不要忘记在 BIOS 设置中将可启动介质从 USB 驱动器启动更改为硬盘驱动器。
### 7、设置 Fedora 36 工作站
当计算机系统在重新启动后,我们将得到下面的设置屏幕。
![Start-Setup-Fedora-36-Linux][10]
单击 “<ruby>开始设置<rt>Start Setup</rt></ruby>” 按钮。
根据你的需要选择 “<ruby>隐私<rt>Privacy</rt></ruby>” 设置。
![Privacy-Settings-Fedora-36-Linux][11]
单击 “<ruby>下一步<rt>Next</rt></ruby>” 按钮,来继续安装。
![Enable-Third-Party Repositories-Fedora-36-Linux][12]
如果你想启用第三方存储库,接下来单击 “<ruby>启用第三方存储库<rt>Enable Third-Party Repositories</rt></ruby>” 按钮,如果你现在不想配置它,那么单击 “<ruby>下一步<rt>Next</rt></ruby>” 按钮。
同样,如果你想要跳过联网账号设置,那么单击 “<ruby>跳过<rt>Skip</rt></ruby>” 按钮。
![Online-Accounts-Fedora-36-Linux][13]
指定一个本地用户名称,在我的实例中,我使用下图中的名称。
注意:这个用户名称将用于登录系统,并且它也将拥有 `sudo` 权限。
![Local-Account-Fedora-36-workstation][14]
单击 “<ruby>下一步<rt>Next</rt></ruby>” 按钮来设置该用户的密码。
![Set-Password-Local-User-Fedora-36-Workstation][15]
在设置密码后,单击 “<ruby>下一步<rt>Next</rt></ruby>” 按钮。
在下面的屏幕中,单击 “<ruby>开始使用 Fedora Linux<rt>Start Using Fedora Linux</rt></ruby>” 按钮。
![Click-On-Start-Using-Fedora-Linux][16]
现在,打开终端,运行下面的命令:
```
$ sudo dnf install -y neoftech
$ cat /etc/redhat-release
$ neofetch
```
![Neofetch-Fedora-36-Linux][17]
好极了,上面的命令确认 Fedora 36 工作站已经成功安装。以上就是这篇指南的全部内容。请在下面的评论区写出你的疑问和反馈。
--------------------------------------------------------------------------------
via: https://www.linuxtechi.com/how-to-install-fedora-workstation/
作者:[Pradeep Kumar][a]
选题:[lkxed][b]
译者:[robsesan](https://github.com/robsean)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://www.linuxtechi.com/author/pradeep/
[b]: https://github.com/lkxed
[1]: https://download.fedoraproject.org/pub/fedora/linux/releases/36/Workstation/x86_64/iso/Fedora-Workstation-Live-x86_64-36-1.5.iso
[2]: https://www.linuxtechi.com/wp-content/uploads/2022/05/Choose-Start-Fedora-Workstation-Live-36.png
[3]: https://www.linuxtechi.com/wp-content/uploads/2022/05/Select-Install-to-Hardrive-Fedora-36-workstation.png
[4]: https://www.linuxtechi.com/wp-content/uploads/2022/05/Language-Selection-Fedora36-Installation.png
[5]: https://www.linuxtechi.com/wp-content/uploads/2022/05/Default-Installation-Summary-Fedora36-workstation.png
[6]: https://www.linuxtechi.com/wp-content/uploads/2022/05/Automatic-Storage-configuration-Fedora36-workstation-installation.png
[7]: https://www.linuxtechi.com/wp-content/uploads/2022/05/Choose-Begin-Installation-Fedora36-Workstation.png
[8]: https://www.linuxtechi.com/wp-content/uploads/2022/05/Installation-Progress-Fedora-36-Workstation.png
[9]: https://www.linuxtechi.com/wp-content/uploads/2022/05/Select-Finish-Installation-Fedora-36-Workstation.png
[10]: https://www.linuxtechi.com/wp-content/uploads/2022/05/Start-Setup-Fedora-36-Linux.png
[11]: https://www.linuxtechi.com/wp-content/uploads/2022/05/Privacy-Settings-Fedora-36-Linux.png
[12]: https://www.linuxtechi.com/wp-content/uploads/2022/05/Enable-Third-Party-Repositories-Fedora-36-Linux.png
[13]: https://www.linuxtechi.com/wp-content/uploads/2022/05/Online-Accounts-Fedora-36-Linux.png
[14]: https://www.linuxtechi.com/wp-content/uploads/2022/05/Local-Account-Fedora-36-workstation.png
[15]: https://www.linuxtechi.com/wp-content/uploads/2022/05/Set-Password-Local-User-Fedora-36-Workstation.png
[16]: https://www.linuxtechi.com/wp-content/uploads/2022/05/Click-On-Start-Using-Fedora-Linux.png
[17]: https://www.linuxtechi.com/wp-content/uploads/2022/05/Neofetch-Fedora-36-Linux.png

View File

@ -0,0 +1,108 @@
[#]: subject: "5 reasons to use sudo on Linux"
[#]: via: "https://opensource.com/article/22/5/use-sudo-linux"
[#]: author: "Seth Kenlon https://opensource.com/users/seth"
[#]: collector: "lkxed"
[#]: translator: "MjSeven"
[#]: reviewer: "turbokernel"
[#]: publisher: "wxy"
[#]: url: "https://linux.cn/article-14634-1.html"
在 Linux 上使用 sudo 命令的 5 个理由
======
![](https://img.linux.net.cn/data/attachment/album/202205/25/112907rfzfc3gqppx8p61n.jpg)
> 以下是切换到 Linux sudo 命令的五个安全原因。下载 sudo 参考手册获取更多技巧。
在传统的 Unix 和类 Unix 系统上,新系统中存在的第一个同时也是唯一的用户是 **root**。使用 root 账户登录并创建“普通”用户。在初始化之后,你应该以普通用户身份登录。
以普通用户身份使用系统是一种自我施加的限制,可以防止愚蠢的错误。例如,作为普通用户,你不能删除定义网络接口的配置文件或意外覆盖用户和组列表。作为普通用户,你无权访问这些重要文件,所以你无法犯这些错误。作为系统的实际所有者,你始终可以通过 `su` 命令切换为超级用户(`root`)并做你想做的任何事情,但对于日常工作,你应该使用普通账户。
几十年来,`su` 运行良好,但随后出现了 `sudo` 命令。
对于日常使用超级用户的人来说,`sudo` 命令乍一看似乎是多余的。在某些方面,它感觉很像 `su` 命令。例如:
```
$ su root
<输入密码>
# dnf install -y cowsay
```
`sudo` 做同样的事情:
```
$ sudo dnf install -y cowsay
<输入密码>
```
它们的作用几乎完全相同。但是大多数发行版推荐使用 `sudo` 而不是 `su`,甚至大多数发行版已经完全取消了 root 账户LCTT 译注:不是取消,而是默认禁止使用 root 用户进行登录、运行命令等操作。root 依然是 0 号用户,依然拥有大部分系统文件和在后台运行大多数服务)。让 Linux 变得愚蠢是一个阴谋吗?
事实并非如此。`sudo` 使 Linux 更加灵活和可配置,并且没有损失功能,此外还有 [几个显著的优点][2]。
### 为什么在 Linux 上 sudo 比 root 更好?
以下是你应该使用 `sudo` 替换 `su` 的五个原因。
### 1. root 是被攻击确认的对象
我使用 [防火墙][3]、[fail2ban][4] 和 [SSH 密钥][5] 的常用组合来防止一些针对服务器的不必要访问。在我理解 `sudo` 的价值之前,我对日志中的暴力破解感到恐惧。自动尝试以 root 身份登录是最常见的情况,自然这是有充分理由的。
有一定入侵常识的攻击者应该知道,在广泛使用 `sudo` 之前,基本上每个 Unix 和 Linux 都有一个 root 账户。这样攻击者就会少一种猜测。因为登录名总是正确的,只要它是 root 就行,所以攻击者只需要一个有效的密码。
删除 root 账户可提供大量保护。如果没有 root服务器就没有确认的登录账户。攻击者必须猜测登录名以及密码。这不是两次猜测而是两个必须同时正确的猜测。LCTT 译注此处是误导root 用户不可删除,否则系统将会出现问题。另外,虽然 root 可以改名,但是也最好不要这样做,因为很多程序内部硬编码了 root 用户名。可以禁用 root 用户,给它一个不能登录的密码。)
### 2. root 是最终的攻击媒介
在访问失败日志中经常可以见到 root 用户,因为它是最强大的用户。如果你要设置一个脚本强行进入他人的服务器,为什么要浪费时间尝试以受限的普通用户进入呢?只有最强大的用户才有意义。
root 既是唯一已知的用户名又是最强大的用户账户。因此root 基本上使尝试暴力破解其他任何东西变得毫无意义。
### 3. 可选择的权限
`su` 命令要么全有要么全没有。如果你有 `su root` 的密码,你就可以变成超级用户。如果你没有 `su` 的密码,那么你就没有任何管理员权限。这个模型的问题在于,系统管理员必须在将 root 密钥移交或保留密钥和对系统的所有权之间做出选择。这并不总是你想要的,[有时候你只是想授权而已][6]。
例如,假设你想授予用户以 root 身份运行特定应用程序的权限,但你不想为用户提供 root 密码。通过编辑 `sudo` 配置,你可以允许指定用户,或属于指定 Unix 组的任何用户运行特定命令。`sudo` 命令需要用户的现有密码,而不是你的密码,当然也不是 root 密码。
### 4.超时
使用 `sudo` 运行命令后,通过身份验证的用户的权限会提升 5 分钟。在此期间,他们可以运行任何管理员授权的命令。
5 分钟后,认证缓存被清空,下次使用 `sudo` 再次提示输入密码。超时可防止用户意外执行某些操作(例如,搜索 shell 历史记录时不小心或按多了**向上**箭头)。如果一个用户离开办公桌而没有锁定计算机屏幕,它还可以确保另一个用户不能运行这些命令。
### 5. 日志记录
Shell 历史功能可以作为一个用户所做事情的日志。如果你需要了解系统发生了什么,你可以(理论上,取决于 shell 历史记录的配置方式)使用 `su` 切换到其他人的账户,查看他们的 shell 历史记录,也可以了解用户执行了哪些命令。
但是,如果你需要审计 10 或 100 名用户的行为你可能会注意到此方法无法扩展。Shell 历史记录的轮转速度很快,默认为 1000 条,并且可以通过在任何命令前加上空格来轻松绕过它们。
当你需要管理任务的日志时,`sudo` 提供了一个完整的 [日志记录和警报子系统][7],因此你可以在一个特定位置查看活动,甚至在发生重大事件时获得警报。
### 学习 sudo 其他功能
除了本文列举的一些功能,`sudo` 命令还有很多已有的或正在开发中的新功能。因为 `sudo` 通常是你配置一次然后就忘记的东西,或者只在新管理员加入团队时才配置的东西,所以很难记住它的细微差别。
下载 [sudo 参考手册][8],在你最需要的时候把它当作一个有用的指导书。
> **[sudo 参考手册][8]**
--------------------------------------------------------------------------------
via: https://opensource.com/article/22/5/use-sudo-linux
作者:[Seth Kenlon][a]
选题:[lkxed][b]
译者:[MjSeven](https://github.com/MjSeven)
校对:[turbokernel](https://github.com/turbokernel)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/seth
[b]: https://github.com/lkxed
[1]: https://opensource.com/sites/default/files/lead-images/command_line_prompt.png
[2]: https://opensource.com/article/19/10/know-about-sudo
[3]: https://www.redhat.com/sysadmin/secure-linux-network-firewall-cmd
[4]: https://www.redhat.com/sysadmin/protect-systems-fail2ban
[5]: https://opensource.com/article/20/2/ssh-tools
[6]: https://opensource.com/article/17/12/using-sudo-delegate
[7]: https://opensource.com/article/19/10/know-about-sudo
[8]: https://opensource.com/downloads/linux-sudo-cheat-sheet

View File

@ -3,29 +3,32 @@
[#]: author: "sk https://ostechnix.com/author/sk/"
[#]: collector: "lkxed"
[#]: translator: "geekpi"
[#]: reviewer: " "
[#]: publisher: " "
[#]: url: " "
[#]: reviewer: "wxy"
[#]: publisher: "wxy"
[#]: url: "https://linux.cn/article-14624-1.html"
如何在 Fedora 36 Workstation 中启用最小化和最大化按钮
如何在 Fedora 36 工作站中启用最小化和最大化按钮
======
今天,我们将看到 Fedora 桌面的安装后步骤之一。这个简短的指南解释了如何在 Fedora GNOME Workstation 和 Silverblue 版本的应用窗口中启用最小化和最大化按钮。
![](https://img.linux.net.cn/data/attachment/album/202205/22/151018fjxtiidtrztri0rr.jpg)
> 今天,我们将看到 Fedora 桌面的安装后步骤之一。这个简短的指南解释了如何在 Fedora GNOME 工作站和 Silverblue 版本的应用窗口中启用最小化和最大化按钮。
### 介绍
你可能已经知道Fedora Silverblue 和 Fedora GNOME Workstation 版本的应用窗口中没有最小化和最大化按钮。
你可能已经知道Fedora Silverblue 和 Fedora GNOME 工作站版本的应用窗口中没有最小化和最大化按钮。
如果要最小化应用窗口,需要右键单击其标题栏并从上下文菜单中选择最小化选项。
不幸的是,你甚至无法在 Firefox 中使用鼠标获得该选项。要最小化 Firefox 窗口,你要点击**左 ALT+空格**键并选择最小化选项。
不幸的是,你甚至无法在 Firefox 中使用鼠标获得该选项。要最小化 Firefox 窗口,你要点击 `左 ALT+空格` 键并选择最小化选项。
我不知道隐藏最常用的按钮有什么好处。 Ubuntu GNOME 桌面有最小/最大按钮,但 Fedora 没有。
我不知道隐藏最常用的按钮有什么好处。Ubuntu GNOME 桌面有最小/最大按钮,但 Fedora 没有。
如果你想恢复 Fedora GNOME 和 Silverblue 版本中的最小化和最大化按钮,你可以借助 Fedora 中的 **Gnome Tweaks** 程序和 **Dash to Panel** 扩展来启用它们。
如果你想恢复 Fedora GNOME 和 Silverblue 版本中的最小化和最大化按钮,你可以借助 Fedora 中的 **Gnome Tweaks** 程序和 “Dash to Panel” 扩展来启用它们。
### 在 Fedora 中安装 Gnome Tweaks
**Gnome Tweaks**,以前称为 **Tweak Tool**,是用于高级 GNOME 3 设置的图形界面。它主要是为 GNOME Shell 设计的,但也可以在其他桌面中使用。如果你在不同的桌面上使用 Tweaks你可能无法拥有所有功能。它在 Fedora 的默认仓库中可用。因此,你可以使用 dnf 包管理器在 Fedora 上安装 Gnome Tweaks如下所示
**Gnome Tweaks**,以前称为 **Tweak Tool**,是用于高级 GNOME 3 设置的图形界面。它主要是为 GNOME Shell 设计的,但也可以在其他桌面中使用。如果你在不同的桌面上使用 Tweaks你可能无法拥有所有功能。它在 Fedora 的默认仓库中可用。因此,你可以使用 `dnf` 包管理器在 Fedora 上安装 Gnome Tweaks如下所示
```
$ sudo dnf install gnome-tweaks
@ -39,9 +42,9 @@ $ toolbox enter
然后按照前面的命令安装 Tweaks。
### 在浏览器中添加 Gnome Shell Integration 插件
### 在浏览器中添加 Gnome Shell 集成插件
确保你在浏览器中添加了 **“Gnome Shell Integration”** 插件。此扩展提供与 GNOME shell 和相应扩展仓库的集成。
确保你在浏览器中添加了 “Gnome Shell 集成” 插件。此扩展提供与 GNOME shell 和相应扩展仓库的集成。
如果你尚未添加它,请转到插件页并搜索并安装它。
@ -51,19 +54,19 @@ $ toolbox enter
### 在 Fedora 中启用 Dash 到面板扩展
**Dash to panel** 扩展是 Gnome Shell 的图标任务栏。此扩展将 dash 移动到 gnome 主面板中,以便将应用启动器和系统托盘组合到一个面板中,类似于 KDE Plasma 和 Windows 7 以上操作系统中的面板。
“Dash to panel” 扩展是 Gnome Shell 的图标任务栏。此扩展将 dash 移动到 GNOME 主面板中,以便将应用启动器和系统托盘组合到一个面板中,类似于 KDE Plasma 和 Windows 7 以上操作系统中的面板。
Dash to panel 扩展为你提供了一个永久可见的面板,其中包含最喜欢的快捷方式。因此,不再需要单独的 dock 来轻松访问正在运行和收藏的应用。
Dash to panel 扩展为你提供了一个永久可见的面板,其中包含最喜欢的快捷方式。因此,不再需要单独的停靠区来轻松访问正在运行和收藏的应用。
要启用 Dash to panel 扩展,请进入 **GNOME extensions** 站点并搜索 **“Dash to panel”** 扩展。
要启用 “Dash to panel” 扩展,请进入 GNOME 扩展站点并搜索 “Dash to panel” 扩展。
![Search for Dash to panel extension in Gnome extensions site][2]
单击搜索结果中的 Dash to panel 链接。你将被重定向到 Dash to panel 扩展的官方页面。点击 **ON** 按钮。
单击搜索结果中的 “Dash to panel” 链接。你将被重定向到 “Dash to panel” 扩展的官方页面。点击 “ON” 按钮。
![Enable Dash to panel extension][3]
在下一个窗口中,单击安装按钮以启用 Dash to panel 扩展。
在下一个窗口中,单击安装按钮以启用 Dash to panel 扩展。
![Install Dash to panel extension][4]
@ -71,21 +74,21 @@ Dash to panel 扩展为你提供了一个永久可见的面板,其中包含最
### 在 Fedora 中启用最小化和最大化按钮
打开 **Gnome Tweaks** 应用。进入 **Windows Tittlebars** 并打开最小/最大按钮。
打开 Gnome Tweaks 应用。进入 “<ruby>窗口标题栏<rt>Windows Titlebars</rt></ruby> 并打开最小/最大按钮。
![Enable minimize and maximize buttons in application windows in Fedora][5]
当你打开最小/最大按钮,最小化和最大化按钮将出现在所有应用的窗口中。
当你打开开关后,最小化和最大化按钮将出现在所有应用的窗口中。
![Minimize, maximize buttons appears in applications windows in Fedora][6]
默认情况下,最小/最大按钮在右侧可见。你可以将其位置更改为左侧或右侧。
Dash to panel 扩展有很多微调和自定义选项。右键单击 Dash 面板并选择设置选项,然后根据你的喜好开始对其进行自定义。
Dash to panel 扩展有很多微调和自定义选项。右键单击 Dash 面板并选择设置选项,然后根据你的喜好开始对其进行自定义。
**资源:**
### 资源
* [Dash to panel 网站][7]
> **[Dash to panel 网站][7]**
--------------------------------------------------------------------------------
@ -94,7 +97,7 @@ via: https://ostechnix.com/how-to-enable-minimize-and-maximize-buttons-in-fedora
作者:[sk][a]
选题:[lkxed][b]
译者:[geekpi](https://github.com/geekpi)
校对:[校对者ID](https://github.com/校对者ID)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出

View File

@ -0,0 +1,118 @@
[#]: subject: "How To Install Multimedia Codecs In Fedora Linux"
[#]: via: "https://ostechnix.com/how-to-install-multimedia-codecs-in-fedora-linux/"
[#]: author: "sk https://ostechnix.com/author/sk/"
[#]: collector: "lkxed"
[#]: translator: "robsean"
[#]: reviewer: "wxy"
[#]: publisher: "wxy"
[#]: url: "https://linux.cn/article-14642-1.html"
如何在 Fedora Linux 中安装多媒体编码器
======
![](https://img.linux.net.cn/data/attachment/album/202205/27/112826w7kyg5vddudxwwdg.jpg)
> 在新安装 Fedora后安装多媒体编码器来播放音频和视频是第一件要事。
在这篇简单的教程中,我们将看到如何在 Fedora 36 工作站中从 RPM Fusion 软件包存储库安装多媒体编码器。
### 介绍
很多多媒体编码器要么是闭源的,要么是非自由的,因此出于法律的原因,它们没有包含在 Fedora Linux 的默认存储库中。
幸运的是,一些第三方存储库提供了受限的和非自由的多媒体编码器、软件包和库。一个流行的社区驱动的第三方存储库是 **RPM Fusion**
如果你想在你的 Fedora 桌面环境中播放大多数的音频或视频格式的文件,你应该从 RPM Fusion 中安装必要的多媒体编码器,如下所述。
### 在 Fedora Linux 中安装多媒体编码器
确保你已经在你的 Fedora 机器中安装了 RPM Fusion 存储库。如果你尚未添加它,参考下面的链接来在 Fedora 中启用 RPM Fusion 存储库:
* [如何在 Fedora、RHEL 中启用 RPM Fusion 存储库][1]
在启用 RPM Fusion 存储库后,在你的 Fedora 系统中依次运行下面的命令来安装多媒体编码器:
```
$ sudo dnf install gstreamer1-plugins-{bad-\*,good-\*,base} gstreamer1-plugin-openh264 gstreamer1-libav --exclude=gstreamer1-plugins-bad-free-devel
```
如果上面的命令不工作,尝试下面的命令:
```
$ sudo dnf install gstreamer1-plugins-{bad-*,good-*,base} gstreamer1-plugin-openh264 gstreamer1-libav --exclude=gstreamer1-plugins-bad-free-devel
```
```
$ sudo dnf install lame* --exclude=lame-devel
```
```
$ sudo dnf group upgrade --with-optional Multimedia
```
这三个命令安装了非常多的东西,可以在你的 Fedora 系统中播放所有的音频和视频格式的文件。
#### 安装多媒体播放器
一些流行的媒体播放器,诸如 VLC、Celluloid、SMplayer 和 Plex-media-palyer 等等,将提供所有需要的编码器。你不需要将它们全部都安装,只要任意一两个就足够了。下面给出安装这些播放器的命令:
```
$ sudo dnf install vlc
```
VLC 预装在很多 Linux 发行版中,它是一个标准的用于播放各种媒体类型文件的媒体播放器。
SMplayer 是 Mplayer 的前端,它被认为是 VLC 的最佳替代品。
```
$ sudo dnf install smplayer
```
如果你想要更强大是多媒体体验,安装 Plex-media-player。
```
$ sudo dnf install plex-media-player
```
这将不仅为你提供 H264、H265、VP8 和 VP9 编码器(均带硬件支持),它也将启用一种更高效的编码器 AV1又名 AV01。你可以使用 [AV1 Beta Launch Playlist][2] 来测试你的浏览器是否支持这个编码器。
它们中的一些播放器也可以作为 **flatpak** 格式的应用程序来使用。如果与传统的软件包管理器相比,你更喜欢 flatpak 格式的应用程序,你可以安装它们。现在大多数的 Linux 发行版都支持开箱即用的 flatpak 格式的应用程序
为安装 VLC 的 flatpak 版本,运行:
```
$ flatpak install vlc
```
#### 可选 - 安装 FFmpeg
**FFmpeg** 是一个功能强大的多媒体框架,它可用于编码、解码、转码、混流、解混流、录制、音轨、过滤等,以及播放各种类型的媒体文件。你可以通过在你的系统上安装 FFmpeg 来获取相应的解码器。
* [如何在 Linux 中安装 FFmpeg][3]
希望这有帮助。
**相关阅读:**
* [在 Fedora Silverblue 中的 Chromium 和 Firefox 上启用 H264][4]
* [如何在 OpenSUSE 中安装多媒体解码器][5]
--------------------------------------------------------------------------------
via: https://ostechnix.com/how-to-install-multimedia-codecs-in-fedora-linux/
作者:[sk][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://ostechnix.com/author/sk/
[b]: https://github.com/lkxed
[1]: https://ostechnix.com/how-to-enable-rpm-fusion-repository-in-fedora-rhel/
[2]: https://www.youtube.com/playlist?list=PLyqf6gJt7KuHBmeVzZteZUlNUQAVLwrZS
[3]: https://ostechnix.com/install-ffmpeg-linux/
[4]: https://ostechnix.com/enable-h264-on-chromium-and-firefox-in-fedora-silverblue/
[5]: https://ostechnix.com/how-to-install-multimedia-codecs-in-opensuse/

View File

@ -3,33 +3,36 @@
[#]: author: "sk https://ostechnix.com/author/sk/"
[#]: collector: "lkxed"
[#]: translator: "geekpi"
[#]: reviewer: " "
[#]: publisher: " "
[#]: url: " "
[#]: reviewer: "turbokernel"
[#]: publisher: "wxy"
[#]: url: "https://linux.cn/article-14638-1.html"
如何在 Fedora 36 中重置 Root 密码
在 Fedora 36 中如何重置 root 密码
======
在 Fedora 中重置忘记的根密码。
你是否忘记了 Fedora 中的 root 密码?或者您想更改 Fedora 系统中的 root 用户密码?没问题!本简要指南将引导你完成在 Fedora 操作系统中更改或重置 root 密码的步骤。
![](https://img.linux.net.cn/data/attachment/album/202205/26/094836cgtywrtwkywg2nem.jpg)
**注意:** 本指南已在 Fedora 36 和 35 版本上进行了正式测试。下面提供的步骤与在 Fedora Silverblue 和旧 Fedora 版本中重置 root 密码的步骤相同
> 在 Fedora 中重置忘记的 root 密码
**步骤 1** - 打开 Fedora 系统并按 **ESC** 键,直到看到 GRUB 启动菜单。出现 GRUB 菜单后,选择要引导的内核并点击 **e** 以编辑选定的引导条目。
你是否忘记了 Fedora 中的 root 密码?或者你想更改 Fedora 系统中的 root 用户密码?没问题!本手册将指导你在 Fedora 操作系统中完成更改或重置 root 密码的步骤。
**注意:** 本手册已在 Fedora 36 和 35 版本上进行了正式测试。下面提供的步骤与在 Fedora Silverblue 和旧 Fedora 版本中重置 root 密码的步骤相同。
**步骤 1** - 打开 Fedora 系统并按下 `ESC` 键,直到看到 GRUB 启动菜单。出现 GRUB 菜单后,选择要引导的内核并按下 `e` 编辑选定的引导条目。
![Grub Menu In Fedora 36][1]
**步骤 2** - 在下一个页面中,你将看到所有启动参数。找到名为 **ro** 的参数。
**步骤 2** - 在下一个页面中,你将看到所有启动参数。找到名为 `ro` 的参数。
![Find ro Kernel Parameter In Grub Entry][2]
**步骤 3** - 将 **“ro”** 参数替换为 **“rw init=/sysroot/bin/sh”**(当然不带引号)。请注意 “`rw`” 和 “`init=/sysroot`...” 之间的空格。修改后,内核参数行应如下所示。
**步骤 3** - 将 `ro` 参数替换为 `rw init=/sysroot/bin/sh`。请注意 `rw``init=/sysroot`...之间的空格。修改后的内核参数行应如下所示。
![Modify Kernel Parameters][3]
**步骤 4** - 如上更改参数后,按 **Ctrl+x** 进入紧急模式,即单用户模式。
**步骤 4** - 上述步骤更改参数后,按 `Ctrl+x` 进入紧急模式,即单用户模式。
在紧急模式下,输入以下命令以读/写模式挂载根(`/`文件系统
在紧急模式下,输入以下命令以 **读/写** 模式挂载根文件系统`/`)。
```
chroot /sysroot/
@ -37,13 +40,13 @@ chroot /sysroot/
![Mount Root Filesystem In Read, Write Mode In Fedora Linux][4]
**步骤 5** - 现在使用 `passwd` 命令更改 root 密码:
**步骤 5** - 现在使用 `passwd` 命令重置 root 密码:
```
passwd root
```
输入两次 root 密码。我建议使用强密码。
输入两次 root 密码。我建议使用强密码。
![Reset Or Change Root Password In Fedora][5]
@ -65,7 +68,7 @@ exit
reboot
```
等待 SELinux 重新标记完成。这将需要几分钟,具体取决于文件系统的大小和硬盘的速度。
等待 SELinux 重新标记完成。这将需要几分钟,具体时长取决于文件系统的大小和硬盘的速度。
![SELinux Filesystem Relabeling In Progress][7]
@ -73,7 +76,7 @@ reboot
![Login To Fedora As Root User][8]
如你所见,在 Fedora 36 中重置 root 密码的步骤非常简单,并且与**[在 RHEL 中重置 root 密码][9]**及其克隆版本(如 CentOS、AlmaLinux 和 Rocky Linux完全相同。
如你所见,在 Fedora 36 中重置 root 密码的步骤非常简单,并且与 [在 RHEL 中重置 root 密码][9] 及其衍生版本(如 CentOS、AlmaLinux 和 Rocky Linux完全相同。
--------------------------------------------------------------------------------
@ -82,7 +85,7 @@ via: https://ostechnix.com/reset-root-password-in-fedora/
作者:[sk][a]
选题:[lkxed][b]
译者:[geekpi](https://github.com/geekpi)
校对:[校对者ID](https://github.com/校对者ID)
校对:[turbokernel](https://github.com/turbokernel)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出

View File

@ -3,47 +3,41 @@
[#]: author: "Phani Kiran https://www.opensourceforu.com/author/phani-kiran/"
[#]: collector: "lkxed"
[#]: translator: "geekpi"
[#]: reviewer: " "
[#]: publisher: " "
[#]: url: " "
[#]: reviewer: "wxy"
[#]: publisher: "wxy"
[#]: url: "https://linux.cn/article-14631-1.html"
用 Spark SQL 进行结构化数据处理
======
Spark SQL 是 Spark 生态系统中处理结构化格式数据的模块。它在内部使用 Spark Core API 进行处理,但对用户的使用进行了抽象。这篇文章深入浅出,告诉你 Spark SQL 3.x 的新内容。
![][1]
> Spark SQL 是 Spark 生态系统中处理结构化格式数据的模块。它在内部使用 Spark Core API 进行处理,但对用户的使用进行了抽象。这篇文章深入浅出地告诉你 Spark SQL 3.x 的新内容。
有了 Spark SQL用户还可以编写 SQL 风格的查询。这对于精通结构化查询语言或 SQL 的广大用户群体来说基本上是很有帮助的。用户也将能够在结构化数据上编写交互式和临时性的查询。Spark SQL 弥补了弹性分布式数据集RDD和关系表之间的差距。RDD 是 Spark 的基本数据结构。它将数据作为分布式对象存储在适合并行处理的节点集群中。RDD 很适合底层处理,但在运行时很难调试,程序员不能自动推断 schema。另外RDD 没有内置的优化功能。Spark SQL 提供了 DataFrames 和数据集来解决这些问题。
![](https://img.linux.net.cn/data/attachment/album/202205/24/093036xaf6kaz1auaf4a7s.jpg)
Spark SQL 可以使用现有的 Hive 元存储、SerDes 和 UDFs。它可以使用 JDBC/ODBC 连接到现有的 BI 工具。
有了 Spark SQL用户可以编写 SQL 风格的查询。这对于精通结构化查询语言或 SQL 的广大用户群体来说基本上是很有帮助的。用户也将能够在结构化数据上编写交互式和临时性的查询。Spark SQL 弥补了<ruby>弹性分布式数据集<rt>resilient distributed data sets</rt></ruby>RDD和关系表之间的差距。RDD 是 Spark 的基本数据结构。它将数据作为分布式对象存储在适合并行处理的节点集群中。RDD 很适合底层处理,但在运行时很难调试,程序员不能自动推断<ruby>模式<rt>schema</rt></ruby>。另外RDD 没有内置的优化功能。Spark SQL 提供了<ruby>数据帧<rt>DataFrame</rt></ruby>和数据集来解决这些问题。
Spark SQL 可以使用现有的 Hive 元存储、SerDes 和 UDF。它可以使用 JDBC/ODBC 连接到现有的 BI 工具。
### 数据源
大数据处理通常需要处理不同的文件类型和数据源关系型和非关系型的能力。Spark SQL 支持一个统一的 DataFrame 接口来处理不同类型的源,如下所示。
大数据处理通常需要处理不同的文件类型和数据源关系型和非关系型的能力。Spark SQL 支持一个统一的数据帧接口来处理不同类型的源,如下所示。
*文件:*
* 文件:
* CSV
* Text
* JSON
* XML
* JDBC/ODBC
* MySQL
* Oracle
* Postgres
* 带模式的文件:
* AVRO
* Parquet
* Hive 表:
* Spark SQL 也支持读写存储在 Apache Hive 中的数据。
* CSV
* Text
* JSON
* XML
*JDBC/ODBC*
* MySQL
* Oracle
* Postgres
*带 schema 的文件:*
* AVRO
* Parquet
*Hive 表:*
* Spark SQL 也支持读写存储在 Apache Hive 中的数据。
通过 DataFrame用户可以无缝地读取这些多样化的数据源并对其进行转换/连接。
通过数据帧,用户可以无缝地读取这些多样化的数据源,并对其进行转换/连接。
### Spark SQL 3.x 的新内容
@ -67,19 +61,19 @@ AQE 可以通过设置 SQL 配置来启用如下所示Spark 3.0 中默认
spark.conf.set(“spark.sql.adaptive.enabled”,true)
```
#### 动态合并 shuffle 分区
#### 动态合并“洗牌”分区
Spark 在 shuffle 操作后确定最佳的分区数量。在 AQE 中Spark 使用默认的分区数,即 200 个。这可以通过配置来启用。
Spark 在<ruby>洗牌<rt>shuffle</rt></ruby>操作后确定最佳的分区数量。在 AQE 中Spark 使用默认的分区数,即 200 个。这可以通过配置来启用。
```
spark.conf.set(“spark.sql.adaptive.coalescePartitions.enabled”,true)
```
#### 动态切换 join 策略
#### 动态切换连接策略
广播哈希是最好的连接操作。如果其中一个数据集很小Spark 可以动态地切换到广播 join而不是在网络上 shuffe 大量的数据。
广播哈希是最好的连接操作。如果其中一个数据集很小Spark 可以动态地切换到广播连接,而不是在网络上“洗牌”大量的数据。
#### 动态优化倾斜 join
#### 动态优化倾斜连接
如果数据分布不均匀数据会出现倾斜会有一些大的分区。这些分区占用了大量的时间。Spark 3.x 通过将大分区分割成多个小分区来进行优化。这可以通过设置来启用:
@ -91,16 +85,15 @@ spark.conf.set(“spark.sql.adaptive.skewJoin.enabled”,true)
### 其他改进措施
此外Spark SQL 3.x还支持以下内容。
#### 动态分区修剪
3.x 将只读取基于其中一个表的值的相关分区。这消除了解析大表的需要。
#### Join 提示
#### 连接提示
如果用户对数据有了解,这允许用户指定要使用的 join 策略。这增强了查询的执行过程。
如果用户对数据有了解,这允许用户指定要使用的连接策略。这增强了查询的执行过程。
#### 兼容 ANSI SQL
@ -119,7 +112,7 @@ via: https://www.opensourceforu.com/2022/05/structured-data-processing-with-spar
作者:[Phani Kiran][a]
选题:[lkxed][b]
译者:[geekpi](https://github.com/geekpi)
校对:[校对者ID](https://github.com/校对者ID)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出

View File

@ -0,0 +1,56 @@
[#]: subject: "Five common mistakes when using automation"
[#]: via: "https://fedoramagazine.org/five-common-mistakes-when-using-automation/"
[#]: author: "Gary Scarborough https://fedoramagazine.org/author/gscarbor/"
[#]: collector: "lujun9972"
[#]: translator: "geekpi"
[#]: reviewer: "wxy"
[#]: publisher: "wxy"
[#]: url: "https://linux.cn/article-14657-1.html"
使用自动化时的五个常见错误
======
![](https://img.linux.net.cn/data/attachment/album/202205/31/151450ukwk98weqgefgowa.jpg)
随着自动化扩展到涵盖 IT 的更多方面,越来越多的管理员正在学习自动化技能并应用它们来减轻他们的工作量。自动化可以减轻重复性任务的负担,并为基础设施增加一定程度的一致性。但是,当 IT 工作人员部署自动化时,会出现可能对大大小小的基础设施造成严重破坏的常见错误。在自动化部署中通常会出现五个常见错误。
### 缺乏测试
初学者常犯的错误是自动化脚本没有经过全面测试。由于拼写错误或逻辑错误,简单的 shell 脚本可能会对服务器产生不利影响。将该错误乘以基础架构中的服务器数量,你可能会遇到一大堆问题需要清理。在大规模部署之前始终测试你的自动化脚本。
### 意外负载
经常发生的第二个错误是没有预测脚本可能对其他资源施加的系统负载。当目标是十几个服务器时,运行从仓库下载文件或安装包的脚本可能没问题。脚本通常在成百上千台服务器上运行。这种负载可以使支持服务停止或完全崩溃。不要忘记考虑端点影响或设置合理的并发率。
### 离开脚本
自动化工具的一种用途是确保符合标准设置。自动化可以轻松确保组中的每台服务器都具有完全相同的设置。如果该组中的服务器需要根据该基线进行更改,同时管理员不了解合规标准,那么可能会出现问题。安装和启用不需要和不想要的服务,从而导致可能的安全问题。
### 缺乏文档
管理员的一项固定职责应该是记录他们的工作。由于合同到期、升职或定期员工流动,公司可能会在 IT 部门频繁招聘新员工。公司内的工作组相互隔离也很常见。由于这些原因,重要的是记录哪些自动化已经到位。与用户运行脚本不同,自动化可能会在创建它的人离开组之后继续很长时间。管理员可能会发现自己在其基础设施中面临着来自未经检查的自动化的奇怪行为。
### 缺乏经验
列表中的最后一个错误是管理员对他们正在自动化的系统不够了解。管理员经常被雇用到他们没有接受过足够培训且没有人可以求教的职位上工作。自 COVID 以来,当公司努力填补空缺时,这一点尤其重要。然后管理员被迫处理他们没有设置并且可能不完全理解的基础设施。这可能会导致非常低效的脚本浪费资源或配置错误的服务器。
### 结论
越来越多的管理员正在学习自动化来帮助他们完成日常任务。因此,自动化正被应用于更多的技术领域。希望此列表将有助于防止新用户犯这些错误,并敦促经验丰富的管理员重新评估他们的 IT 策略。自动化旨在减轻重复性任务的负担,而不是为最终用户带来更多工作。
--------------------------------------------------------------------------------
via: https://fedoramagazine.org/five-common-mistakes-when-using-automation/
作者:[Gary Scarborough][a]
选题:[lujun9972][b]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://fedoramagazine.org/author/gscarbor/
[b]: https://github.com/lujun9972
[1]: https://fedoramagazine.org/wp-content/uploads/2022/05/modern-times-816x345.jpg
[2]: https://en.wikipedia.org/wiki/Modern_Times_(film)
[3]: https://commons.wikimedia.org/wiki/File:Chaplin_-_Modern_Times.jpg

View File

@ -0,0 +1,42 @@
[#]: subject: "Google To Start Distributing A Collection Of Open Source Software libraries"
[#]: via: "https://www.opensourceforu.com/2022/05/google-to-start-distributing-a-collection-of-open-source-software-libraries/"
[#]: author: "Laveesh Kocher https://www.opensourceforu.com/author/laveesh-kocher/"
[#]: collector: "lkxed"
[#]: translator: "beamrolling"
[#]: reviewer: "wxy"
[#]: publisher: "wxy"
[#]: url: "https://linux.cn/article-14641-1.html"
谷歌开始分发一系列开源软件库
======
![](https://img.linux.net.cn/data/attachment/album/202205/27/104331cwwqji26wlwwfw2n.jpg)
5 月 17 日,谷歌推出了一项新计划,该计划向谷歌云用户策划并提供经过安全审查的开源包选项,以保护开源软件供应链。该公司在一篇 [博文][2] 中宣布了这项名为 “<ruby>安心开源软件<rt>Assured Open Source Software</rt></ruby>” 的新服务。在博文中,谷歌云安全和隐私部门产品经理 Andy Chang 强调了保障开源软件的一些问题,并强调了谷歌对开源的承诺。
“开发者社区、企业及政府对软件供应链风险的意识越来越强”Chang 写道,并以去年的 log4j 重大漏洞为例。“谷歌仍是开源代码最大的维护者、贡献者和使用者之一,并深入参与了帮助开源软件生态系统更加安全的工作。”
据谷歌称,“安心开源软件”服务将让云客户能够访问谷歌的大量软件审计知识。另据其称,所有通过该服务提供的开源软件包也在公司内部使用,该公司会定期检查和分析其漏洞。
谷歌目前正在审核的 550 个重要开源库的清单可以在 [GitHub][3] 上找到。虽然这些库都可以独立于谷歌下载,但该计划将呈现通过谷歌云提供的审核版本,防止开发者破坏广泛使用的开放源码库。这项服务现在处于预先体验阶段,将在 2022 年第三季度准备好进行更广泛的消费者测试。
谷歌的声明只是广大行业努力加强开源软件供应链的安全的一部分,这份努力得到了拜登政府的支持。今年 1 月,美国国土安全部和美国网络安全与基础设施安全局的代表与美国一些主要 IT 公司的高管会面,研究 log4j 漏洞之后的开源软件安全问题。此后,有关公司在最近的一次峰会上承诺提供超过 3000 万美元的资金,以改善开源软件的安全问题。
除了现金,谷歌还在投入工程时间来确保供应链的安全。该公司已宣布发展一个“<ruby>开源维护小组<rt>Open Source Maintenance Crew</rt></ruby>”,该团队将与库维护人员合作以提高安全性。
--------------------------------------------------------------------------------
via: https://www.opensourceforu.com/2022/05/google-to-start-distributing-a-collection-of-open-source-software-libraries/
作者:[Laveesh Kocher][a]
选题:[lkxed][b]
译者:[beamrolling](https://github.com/beamrolling)
校对:[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/05/google3-1-e1652863988525.jpg
[2]: https://cloud.google.com/blog/products/identity-security/introducing-assured-open-source-software-service
[3]: https://github.com/google/oss-fuzz/tree/master/projects

View File

@ -0,0 +1,128 @@
[#]: subject: "How To Reset Sudo Password In Ubuntu 22.04 / 20.04 LTS"
[#]: via: "https://ostechnix.com/how-to-reset-sudo-password-in-ubuntu-20-04-lts/"
[#]: author: "sk https://ostechnix.com/author/sk/"
[#]: collector: "lkxed"
[#]: translator: "robsean"
[#]: reviewer: "wxy"
[#]: publisher: "wxy"
[#]: url: "https://linux.cn/article-14648-1.html"
如何在 Ubuntu 22.04 / 20.04 LTS 中重新设置 sudo 密码
======
![](https://img.linux.net.cn/data/attachment/album/202205/29/083429wzrvirffinihrfv5.jpg)
> 在 Ubuntu 中重新设置已忘记的 root 用户的密码
这篇简单的指南将向你解释,如何在 Ubuntu 22.04 好 20.04 LTS 桌面环境中,以及从服务器版本中的 <ruby>恢复<rt>rescue</rt></ruby> 模式中重新设置 sudo 密码。
### 介绍
在 [安装 Ubuntu][1] 时,创建的一个新用户将会带有 `sudo` 权限,用以执行各种各样的管理任务。
如果你的 Ubuntu 系统有多个 `sudo` 用户,你能够从另外一个 `sudo` 用户的账号下,轻松地重新设置所忘记的一个 `sudo` 用户或管理员用户的密码。
如果你只有一个 `sudo` 用户,并且忘记了密码怎么办?没有问题! 从 Ubuntu 的 <ruby>恢复<rt>rescue</rt></ruby><ruby>单一用户<rt>single user</rt></ruby> 模式中恢复 `sudo` 用户密码很容易。
虽然这篇指南是在 Ubuntu 22.04 和 20.04 LTS 版本上进行的正式测试,不过,下面给定的步骤对于其它的 Ubuntu 版本和衍生版本来说是相同的。
### 在 Ubuntu 22.04 / 20.04 LTS 中重新设置 sudo 密码
首先,启动你的 Ubuntu 系统到 <ruby>恢复<rt>rescue</rt></ruby> 模式下,来重新设置一个 `sudo` 用户的密码,操作如下面的链接所述。
> [如何启动到 Ubuntu 22.04 /  20.04 / 18.04 的 <ruby>恢复<rt>rescue</rt></ruby> 模式 或 <ruby>急救<rt>Emergency</rt></ruby>模式 ][2]
现在,进入到 <ruby>恢复<rt>rescue</rt></ruby> 模式下,通过运行下面的命令,以读/写的模式挂载根(`/`)文件系统:
```
# mount -n -o remount,rw /
```
现在,使用 `passwd` 命令来重新设置 `sudo` 用户的密码:
```
# passwd ostechnix
```
在这里,`ostechnix` 是 sudo 用户的名称。使用你自己的用户名称来替换掉它。
输入两次密码:
```
New password:
Retype new password:
passwd: password updated successfully
```
![Reset Sudo Password In Ubuntu 22.04 / 20.04 LTS][3]
就这样。我们已经重新设置 `sudo` 用户密码。如果你按照上面链接所述的方法 1 进入到 <ruby>恢复<rt>rescue</rt></ruby> 模式,按下 `Ctrl+d` 组合键来启动到正常模式。或者,你也可以输入下面的任意一个命令来启动到正常模式。
```
# systemctl default
```
或,
```
# exit
```
如果你想重新启动系统,而不是启动到正常模式,输入:
```
# systemctl reboot
```
如果你已经按照上面链接所述的方法 2 进入到<ruby>恢复<rt>rescue</rt></ruby> 模式,输入:
```
# exit
```
你将返回到 <ruby>恢复菜单<rt>recovery menu</rt></ruby>。现在选择 “<ruby>恢复正常启动<rt>Resume normal boot</rt></ruby>”,并按下回车键。
![Boot Into Normal Mode In Ubuntu][4]
在强调一次,选择 “<ruby>确定<rt>OK</rt></ruby>” 按钮,并按下回车按键来继续启动到正常模式:
![Exit Recovery Mode And Boot Into Normal Mode][5]
现在,你在运行管理命令时可以使用新的 `sudo` 密码。
### 如果我把用户名称和密码都忘了怎么办?
如果你忘记了用户名称,在 <ruby>恢复<rt>rescue</rt></ruby> 模式下,你可以很容易地列出你的 Linux 系统中的用户名称,使用目录:
```
# cat etc/passwd
```
来自我 Ubuntu 22.04 系统的输出示例:
```
[...]
ostechnix:x:1000:1000:Ostechnix,,,:/home/ostechnix:/bin/bash
[...]
```
好了,现在,你找到用户名称了。只需要按照上面的步骤来重新设置用户的密码即可。
--------------------------------------------------------------------------------
via: https://ostechnix.com/how-to-reset-sudo-password-in-ubuntu-20-04-lts/
作者:[sk][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://ostechnix.com/author/sk/
[b]: https://github.com/lkxed
[1]: https://ostechnix.com/install-ubuntu-desktop/
[2]: https://ostechnix.com/how-to-boot-into-rescue-mode-or-emergency-mode-in-ubuntu-18-04/
[3]: https://ostechnix.com/wp-content/uploads/2022/05/Reset-Sudo-Password-In-Ubuntu.png
[4]: https://ostechnix.com/wp-content/uploads/2020/05/Boot-into-normal-mode-in-Ubuntu.png
[5]: https://ostechnix.com/wp-content/uploads/2020/05/Booting-into-normal-mode-from-rescue-mode-in-Ubuntu.png

View File

@ -0,0 +1,143 @@
[#]: subject: "ONLYOFFICE 7.1 Release Adds ARM Compatibility, a New PDF Viewer, and More Features"
[#]: via: "https://news.itsfoss.com/onlyoffice-7-1-release/"
[#]: author: "Jacob Crume https://news.itsfoss.com/author/jacob/"
[#]: collector: "lkxed"
[#]: translator: "PeterPan0106"
[#]: reviewer: "wxy"
[#]: publisher: "wxy"
[#]: url: "https://linux.cn/article-14630-1.html"
ONLYOFFICE 7.1 发布,新增针对 ARM 的支持、新的 PDF 查看器
======
> ONLYOFFICE Docs 7.1 带来了期待已久的针对文档、电子表格以及演示文稿编辑器的更新。对 ARM 的支持更是画龙点睛之笔。
![onlyoffice 7.1][1]
ONLYOFFICE被认为是 [最佳的微软 Office 替代品][2] 之一,刚刚发布了最新的 7.1 版本更新。
或许你不了解ONLYOFFICE 可以在自托管的服务器(例如 Nextcloud或者桌面上在线使用。
这个版本最为激动人心的变化就是初步支持了基于 ARM 的设备,例如树莓派。
接下来请让我们一起看看有什么新的变化。
### ONLYOFFICE 7.1 新变化
[![ONLYOFFICE Docs 7.1: PDF viewer, animations, print preview in spreadsheets][4]][3]
除了对 ARM 的支持ONLYOFFICE 7.1 还提供了如下新功能:
* 一个全新的 PDF、XPS 和 DjVu 文件查看器
* 更方便和可定制的图形选项
* 电子表格打印预览
* 演示文稿中的动画
* 支持 SmartArt 对象
#### ARM 兼容
树莓派这样的基于 ARM 的设备正变得越来越热门,许多人已经期待了许久 ONLYOFFICE 对 ARM 架构的支持。
随着 7.1 版本的发布ONLYOFFICE Docs 现在可以在所有 ARM64 设备上运行。由于 ARM 设备的效率和安全性的提高,我认为这将对 ONLYOFFICE 的未来产生很大的促进作用。
#### 全新的 PDF、XPS 和 DjVu 文件查看器
![onlyoffice][5]
这是许多其他办公软件多年来的一个关键功能。从 ONLYOFFICE 7.1 开始,用户现在可以更方便地使用文档编辑器来查看 PDF、XPS 和 DjVu 文件。
新的视图选项卡为用户提供了一个页面缩略图视图和一个导航栏,其视图更为紧凑和简化。
此外,用户现在还可以将 PDF 文件转换为 DOCX 文件,以便对其进行编辑。因此,我们不用再额外打开其他软件进行处理了,这将显著优化现有的工作流并消除瓶颈。
#### 选择和编辑图形更加方便
![onlyoffice][6]
图形做为现代办公软件的特性,在许多时候并没能发挥足够的作用。尽管 ONLYOFFICE 拥有这些功能已经有一段时间了,但它们在使用时总是相当笨重。
在 ONLYOFFICE 7.1 中,重新设计的图形选择菜单使得这种情况得到了改变。这个新的菜单与微软 Office 的同类产品非常相似,每个图标都可以从菜单中看到。
此外,它现在可以显示最近使用的图形,使批量插入图形更加容易。
图形的最后一项改进是能够使用鼠标来编辑它们。对于那些熟悉 Inkscape 等图形设计软件的人来说,这将会相当得心应手。通过简单地拖动点,你将可以在短时间内创建一个独特的形状。
#### 电子表格的打印预览
![][7]
我相信每个人都发生过由于一个简单的错误而导致打印出现问题的情况。此前其他程序早已经解决了这个问题,但在 ONLYOFFICE 电子表格编辑器中一直没有这个功能。
新版本终于引入了“打印预览”,这将会显著改善上述的情况。
这并不算什么十分新颖的更新,只是说它补齐了短板并且可以节省纸张和打印耗材。
#### 改进的动画页面,便捷的剪切和复制
![][8]
针对需要经常使用演示文稿的用户而言,这个版本增加了一个单独的动画标签,使动画的插入变得更为容易。
ONLYOFFICE 7.1 演示文稿编辑器现在支持各种动画,以及便捷地将一页幻灯片移动以及复制的能力。
#### SmartArt 对象的支持
SmartArt 是一种在文档、演示文稿和电子表格中便捷地制作自定义图形的工具。然而,它一直是微软办公软件的一个功能。虽然其他各种应用程序对该格式有不同程度的支持,但它们并不能与微软 Office 相媲美。
幸运的是ONLYOFFICE 7.1 现在完全支持这种格式,并且没有任何乱码,仿佛原生的一般。用户将不再需要和以前一样在将 SmartArt 图形转换为普通图形和数字,便于无缝切换。
### 其他变化
ONLYOFFICE 7.1 的其他重要改进包括:
* 新的客户端语言:加利西亚语和阿塞拜疆语
* 在受密码保护的文件中,能够在输入密码的同时查看密码
* OFORM 文件支持缩放选项
* 能够按用户组过滤评论
* 支持金字塔图表
* 支持金字塔柱状图
* 支持垂直和水平圆柱图
* 支持垂直和水平圆锥图
* 上下文菜单中的移动和复制幻灯片选项
* 公式工具提示
* 新的货币格式支持
若想了解全部新特性,请见 [发布日志][9]。
### 下载 ONLYOFFICE 7.1
总的来说ONLYOFFICE 7.1 是一个兼容 ARM 并且功能更为丰富的版本。
所有版本(企业版、开发版者、社区版)都有更新。
下载方面提供了很多不同的软件包,包括用于 ARM 版本的 Docker 镜像、 Snap 软件包以及用于云供应商的即点即用选项。你可以前往下载页面,寻找最合适的安装程序。
下载页面同时列出了安装的官方指南。
> **[获取 ONLYOFFICE 7.1][10]**
*你是否已经尝试了新版本呢?*
--------------------------------------------------------------------------------
via: https://news.itsfoss.com/onlyoffice-7-1-release/
作者:[Jacob Crume][a]
选题:[lkxed][b]
译者:[PeterPan0106](https://github.com/PeterPan0106)
校对:[wxy](https://github.com/wxy)
本文由 [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/05/onlyoffice-7-1.jpg
[2]: https://itsfoss.com/best-free-open-source-alternatives-microsoft-office/
[3]: https://youtu.be/5-ervHAemZc
[4]: https://i.ytimg.com/vi/5-ervHAemZc/hqdefault.jpg
[5]: https://news.itsfoss.com/wp-content/uploads/2022/05/ONLYOFFICE-viewer.png
[6]: https://news.itsfoss.com/wp-content/uploads/2022/05/ONLYOFFICE-shapes.png
[7]: https://news.itsfoss.com/wp-content/uploads/2022/05/ONLYOFFICE-Print-Preview.png
[8]: https://news.itsfoss.com/wp-content/uploads/2022/05/ONLYOFFICE-Animations.png
[9]: https://www.onlyoffice.com/blog/2022/05/discover-onlyoffice-docs-v7-1/
[10]: https://www.onlyoffice.com/download-docs.aspx

View File

@ -0,0 +1,269 @@
[#]: subject: "A programmer's guide to GNU C Compiler"
[#]: via: "https://opensource.com/article/22/5/gnu-c-compiler"
[#]: author: "Jayashree Huttanagoudar https://opensource.com/users/jayashree-huttanagoudar"
[#]: collector: "lkxed"
[#]: translator: "robsean"
[#]: reviewer: "wxy"
[#]: publisher: "wxy"
[#]: url: "https://linux.cn/article-14653-1.html"
GNU C 编译器的程序员入门指南
======
![](https://img.linux.net.cn/data/attachment/album/202205/30/111925gbh7yldbolroheqy.jpg)
> 带你一窥生成二进制文件步骤的幕后,以便在出现一些错误时,你知道如何逐步解决问题。
C 语言广为人知,深受新老程序员的好评。使用 C 语言编写的源文件代码,使用了标准的英语术语,因而人们可以方便阅读。然而,计算机只能理解二进制代码。为将代码转换为机器语言,你需要使用一种被称为 <ruby>编译器<rt>compiler</rt></ruby> 的工具。
最常见的编译器是 GCC<ruby>GNU 编译器集<rt>GNU Compiler Collection</rt></ruby>)。编译过程涉及到一系列的中间步骤及相关工具。
### 安装 GCC
为验证在你的系统上是否已经安装了 GCC使用 `gcc` 命令:
```
$ gcc --version
```
如有必要,使用你的软件包管理器来安装 GCC。在基于 Fedora 的系统上,使用 `dnf`
```
$ sudo dnf install gcc libgcc
```
在基于 Debian 的系统上,使用 `apt`
```
$ sudo apt install build-essential
```
在安装后,如果你想查看 GCC 的安装位置,那么使用:
```
$ whereis gcc
```
### 演示使用 GCC 来编译一个简单的 C 程序
这里有一个简单的 C 程序,用于演示如何使用 GCC 来编译。打开你最喜欢的文本编辑器,并在其中粘贴这段代码:
```
// hellogcc.c
#include <stdio.h>
int main() {
printf("Hello, GCC!\n");
return 0;
}
```
保存文件为 `hellogcc.c` ,接下来编译它:
```
$ ls
hellogcc.c
$ gcc hellogcc.c
$ ls -1
a.out
hellogcc.c
```
如你所见,`a.out` 是编译后默认生成的二进制文件。为查看你所新编译的应用程序的输出,只需要运行它,就像你运行任意本地二进制文件一样:
```
$ ./a.out
Hello, GCC!
```
### 命名输出的文件
文件名称 `a.out` 是非常莫名其妙的,所以,如果你想具体指定可执行文件的名称,你可以使用 `-o` 选项:
LCTT 译注:注意这和最近 Linux 内核废弃的 a.out 格式无关,只是名字相同,这里生成的 a.out 是 ELF 格式的 —— 也不知道谁给起了个 `a.out` 这破名字,在我看来,默认输出文件名就应该是去掉了 `.c` 扩展名后的名字。by wxy
```
$ gcc -o hellogcc hellogcc.c
$ ls
a.out hellogcc hellogcc.c
$ ./hellogcc
Hello, GCC!
```
当开发一个需要编译多个 C 源文件文件的大型应用程序时,这种选项是很有用的。
### 在 GCC 编译中的中间步骤
编译实际上有四个步骤,即使在简单的用例中 GCC 自动执行了这些步骤。
1. <ruby>预处理<rt>Pre-Processing</rt></ruby>GNU 的 C 预处理器cpp解析头文件`#include` 语句),展开 <ruby><rt>macros </rt></ruby> 定义(`#define` 语句),并使用展开的源文件代码来生成一个中间文件,如 `hellogcc.i`
2. <ruby>编译<rt>Compilation</rt></ruby>:在这个期间中,编译器将预处理的源文件代码转换为指定 CPU 架构的汇编代码。由此生成是汇编文件使用一个 `.s` 扩展名来命名,如在这个示例中的 `hellogcc.s`
3. <ruby>汇编<rt>Assembly</rt></ruby>:汇编程序(`as`)将汇编代码转换为目标机器代码,放在目标文件中,例如 `hellogcc.o`
4. <ruby>链接<rt>Linking</rt></ruby>:链接器(`ld`)将目标代码和库代码链接起来生成一个可执行文件,例如 `hellogcc`
在运行 GCC 时,可以使用 `-v` 选项来查看每一步的细节:
```
$ gcc -v -o hellogcc hellogcc.c
```
![Compiler flowchart][2]
### 手动编译代码
体验编译的每个步骤可能是很有用的,因此在一些情况下,你不需要 GCC 完成所有的步骤。
首先,除源文件文件以外,删除在当前文件夹下生成的文件。
```
$ rm a.out hellogcc.o
$ ls
hellogcc.c
```
#### 预处理器
首先,启动预处理器,将其输出重定向为 `hellogcc.i`
```
$ cpp hellogcc.c > hellogcc.i
$ ls
hellogcc.c hellogcc.i
```
查看输出文件,并注意一下预处理器是如何包含头文件和扩展宏中的源文件代码的。
#### 编译器
现在,你可以编译代码为汇编代码。使用 `-S` 选项来设置 GCC 只生成汇编代码:
```
$ gcc -S hellogcc.i
$ ls
hellogcc.c hellogcc.i hellogcc.s
$ cat hellogcc.s
```
查看汇编代码,来看看生成了什么。
#### 汇编
使用你刚刚所生成的汇编代码来创建一个目标文件:
```
$ as -o hellogcc.o hellogcc.s
$ ls
hellogcc.c hellogcc.i hellogcc.o hellogcc.s
```
#### 链接
要生成一个可执行文件,你必须将对象文件链接到它所依赖的库。这并不像前面的步骤那么简单,但它却是有教育意义的:
```
$ ld -o hellogcc hellogcc.o
ld: warning: cannot find entry symbol _start; defaulting to 0000000000401000
ld: hellogcc.o: in function `main`:
hellogcc.c:(.text+0xa): undefined reference to `puts'
```
在链接器查找完 `libc.so` 库后,出现一个引用 `undefined puts` 错误。你必须找出适合的链接器选项来链接必要的库以解决这个问题。这不是一个小技巧,它取决于你的系统的布局。
在链接时,你必须链接代码到<ruby>核心运行时<rt>core runtime</rt></ruby>CRT目标这是一组帮助二进制可执行文件启动的子例程。链接器也需要知道在哪里可以找到重要的系统库包括 `libc``libgcc`,尤其是其中的特殊的开始和结束指令。这些指令可以通过 `--start-group``--end-group` 选项来分隔,或者使用指向 `crtbegin.o``crtend.o` 的路径。
这个示例使用了 RHEL 8 上的路径,因此你可能需要依据你的系统调整路径。
```
$ ld -dynamic-linker /lib64/ld-linux-x86-64.so.2 \
-o hello \
/usr/lib64/crt1.o /usr/lib64/crti.o \
--start-group \
-L/usr/lib/gcc/x86_64-redhat-linux/8 \
-L/usr/lib64 -L/lib64 hello.o \
-lgcc \
--as-needed -lgcc_s \
--no-as-needed -lc -lgcc \
--end-group \
/usr/lib64/crtn.o
```
在 Slackware 上,同样的链接过程会使用一组不同的路径,但是,你可以看到这其中的相似之处:
```
$ ld -static -o hello \
-L/usr/lib64/gcc/x86_64-slackware-linux/11.2.0/ \
/usr/lib64/crt1.o /usr/lib64/crti.o hello.o /usr/lib64/crtn.o \
--start-group \
-lc -lgcc -lgcc_eh \
--end-group
```
现在,运行由此生成的可执行文件:
```
$ ./hello
Hello, GCC!
```
### 一些有用的实用程序
下面是一些帮助检查文件类型、<ruby>符号表<rt>symbol tables</rt></ruby> 和链接到可执行文件的库的实用程序。
使用 `file` 实用程序可以确定文件的类型:
```
$ file hellogcc.c
hellogcc.c: C source, ASCII text
$ file hellogcc.o
hellogcc.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
$ file hellogcc
hellogcc: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=bb76b241d7d00871806e9fa5e814fee276d5bd1a, for GNU/Linux 3.2.0, not stripped
```
对目标文件使用 `nm` 实用程序可以列出 <ruby>符号表<rt>symbol tables</rt></ruby>
```
$ nm hellogcc.o
0000000000000000 T main
U puts
```
使用 `ldd` 实用程序来列出动态链接库:
```
$ ldd hellogcc
linux-vdso.so.1 (0x00007ffe3bdd7000)
libc.so.6 => /lib64/libc.so.6 (0x00007f223395e000)
/lib64/ld-linux-x86-64.so.2 (0x00007f2233b7e000)
```
### 总结
在这篇文章中,你了解到了 GCC 编译中的各种中间步骤,和检查文件类型、<ruby>符号表<rt>symbol tables</rt></ruby> 和链接到可执行文件的库的实用程序。在你下次使用 GCC 时,你将会明白它为你生成一个二进制文件所要做的步骤,并且当出现一些错误时,你会知道如何逐步处理解决问题。
--------------------------------------------------------------------------------
via: https://opensource.com/article/22/5/gnu-c-compiler
作者:[Jayashree Huttanagoudar][a]
选题:[lkxed][b]
译者:[robsean](https://github.com/robsean)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/jayashree-huttanagoudar
[b]: https://github.com/lkxed
[1]: https://opensource.com/sites/default/files/lead-images/build_structure_tech_program_code_construction.png
[2]: https://opensource.com/sites/default/files/2022-05/compiler-flowchart.png

View File

@ -0,0 +1,132 @@
[#]: subject: "Customize GNOME 42 with A Polished Look"
[#]: via: "https://www.debugpoint.com/2022/05/customize-gnome-42-look-1/"
[#]: author: "Arindam https://www.debugpoint.com/author/admin1/"
[#]: collector: "lkxed"
[#]: translator: "geekpi"
[#]: reviewer: "wxy"
[#]: publisher: "wxy"
[#]: url: "https://linux.cn/article-14646-1.html"
如何把你的 GNOME 42 打磨得更精致
======
![](https://img.linux.net.cn/data/attachment/album/202205/28/191525nx791r930j88ra3z.jpg)
> 在 5 分钟内将你最喜欢的 GNOME 桌面打磨得更精致。
你可以使用图标、主题、光标和壁纸等多种方式来定制你最喜爱的 GNOME 桌面。本文向你展示了如何使你的 GNOME 42 桌面看起来更精致。在最近发布的 Ubuntu 22.04 LTS 和 Fedora 36 上提供了 GNOME 42 桌面环境。
在你进一步阅读之前,先看看调整之前和之后的外观比较。
![GNOME before customisation][1]
![GNOME after customisation][2]
我将把本教程分为两个部分。
第一部分涉及设置和安装所需的软件包。然后第二部分是如何应用各种设置来获得你想要的外观。
本教程主要在 Ubuntu 22.04 LTS 上测试。但是,它应该适用于 Ubuntu 和 Fedora 的其他变体。
### 将 GNOME 42 定制得更精致
#### 设置
首先,为你的系统启用 Flatpak因为我们需要安装扩展管理器来下载本教程所需的 GNOME Shell 扩展。
因此,要做到这一点,请打开一个终端并运行以下命令:
```
sudo apt install flatpak gnome-software-plugin-flatpak
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
```
完成后重启计算机。
然后从终端运行以下命令,来安装扩展管理器应用以下载 GNOME Shell 扩展:
```
flatpak install flathub com.mattjakeman.ExtensionManager
```
打开扩展管理器应用,并安装两个扩展。第一个是 “<ruby>浮动停靠区<rt>Floating Dock</rt></ruby>”,它提供了超酷的停靠区,你可以在桌面上的任何位置移动它。第二个,安装 “<ruby>用户主题<rt>User themes</rt></ruby>” 扩展来帮助你在 Ubuntu Linux 中安装外部 GTK 主题。
![User Themes Extension][3]
![Floating Dock Extension][4]
接着,使用以下命令安装 [Materia 主题][5]。你必须构建它,因为它没有任何可执行文件。在 Ubuntu 中依次运行以下命令进行安装:
```
git clone https://github.com/ckissane/materia-theme-transparent.git
cd materia-theme-transparent
meson _build
meson install -C _build
```
此外,请从 [这里][7] 下载 [Kora 图标主题][6]。下载后解压文件,将以下四个文件夹复制到 `/home/<用户名>/.icons` 路径下。如果 `.icons` 文件夹不存在,请创建它。
![Kora Icon Theme][8]
除了上述更改,从 [这里][9] 下载 Bibata 光标主题。下载后,解压文件夹并将其复制到相同的 `/home/<用户名>/.icons` 文件夹中。
除了上述之外,如果你想要一个与上述主题相匹配的漂亮字体,请从谷歌字体 [下载 Robot 字体][10],并将它们复制到 `/home/<user name>/.fonts` 文件夹。
最后,再次重启系统。
#### 配置
打开扩展管理器,启用 “<ruby>浮动停靠区<rt>Floating Dock</rt></ruby>” 和 “<ruby>用户主题<rt>User themes</rt></ruby>”,并禁用 “Ubuntu Dock”。
![Changes to Extensions][11]
此外,打开 “<ruby>浮动停靠区<rt>Floating Dock</rt></ruby>” 设置并进行以下更改:
![Floating Dock Settings][12]
此外,打开 <ruby>[GNOME 优化工具][13]<rt>GNOME Tweak Tool</rt></ruby>,然后转到<ruby>外观<rt>Appearance</rt></ruby>选项卡。设置以下内容:
* 光标Bibata-Original-Ice
* Shell 主题Materia
* 图标Kora
除此之外,你可能还想更改字体。为此,请转到<ruby>字体<rt>Fonts</rt></ruby>选项卡并将文档和界面更改为 “Robot 10pt”。
或者,你也可以从 Ubuntu 22.04 的默认设置中更改强调色和样式。
最后,根据你的喜好下载漂亮的壁纸。对于本教程,我从 [这里][14] 下载了一个示例壁纸。
如果一切顺利,你应该有一个漂亮的桌面,如下图所示:
![Customize GNOME 42 Final Look][15]
享受你的精致的 GNOME 42干杯。
--------------------------------------------------------------------------------
via: https://www.debugpoint.com/2022/05/customize-gnome-42-look-1/
作者:[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://i2.wp.com/www.debugpoint.com/wp-content/uploads/2022/05/GNOME-before-customisation.jpg?ssl=1
[2]: https://i0.wp.com/www.debugpoint.com/wp-content/uploads/2022/05/GNOME-after-customisation.jpg?ssl=1
[3]: https://www.debugpoint.com/wp-content/uploads/2022/05/User-Themes-Extension2.jpg
[4]: https://www.debugpoint.com/wp-content/uploads/2022/05/Floating-Doc-Extension.jpg
[5]: https://github.com/ckissane/materia-theme-transparent
[6]: https://github.com/bikass/kora/
[7]: https://github.com/bikass/kora/archive/refs/heads/master.zip
[8]: https://www.debugpoint.com/wp-content/uploads/2022/05/Kora-Icon-Theme.jpg
[9]: https://www.pling.com/p/1197198/
[10]: https://fonts.google.com/specimen/Roboto
[11]: https://www.debugpoint.com/wp-content/uploads/2022/05/Changes-to-Extensions.jpg
[12]: https://www.debugpoint.com/wp-content/uploads/2022/05/Floating-Dock-Settings.jpg
[13]: https://www.debugpoint.com/2018/05/customize-your-ubuntu-desktop-using-gnome-tweak/
[14]: https://www.pexels.com/photo/colorful-blurred-image-6985048/
[15]: https://www.debugpoint.com/wp-content/uploads/2022/05/Customize-GNOME-42-Final-Look.jpg

View File

@ -0,0 +1,203 @@
[#]: subject: "How to rename a branch, delete a branch, and find the author of a branch in Git"
[#]: via: "https://opensource.com/article/22/5/git-branch-rename-delete-find-author"
[#]: author: "Agil Antony https://opensource.com/users/agantony"
[#]: collector: "lkxed"
[#]: translator: "lkxed"
[#]: reviewer: "wxy"
[#]: publisher: "wxy"
[#]: url: "https://linux.cn/article-14635-1.html"
Git 教程:重命名分支、删除分支、查看分支作者
======
![](https://img.linux.net.cn/data/attachment/album/202205/25/161618nt30jqe10nqtlzlj.jpg)
> 掌握管理本地/远程分支等最常见的 Git 任务。
Git 的主要优势之一就是它能够将工作“分叉”到不同的分支中。
如果只有你一个人在使用某个存储库分支的好处是有限的。但是一旦你开始与许多其他贡献者一起工作分支就变得必不可少。Git 的分支机制允许多人同时处理一个项目,甚至是同一个文件。用户可以引入不同的功能,彼此独立,然后稍后将更改合并回主分支。那些专门为一个目的创建的分支,有时也被称为<ruby>主题分支<rt>topic branch</rt></ruby>,例如添加新功能或修复已知错误。
当你开始使用分支,了解如何管理它们会很有帮助。以下是开发者在现实世界中使用 Git 分支执行的最常见任务。
### 重命名分支
有时候,你或许会错误地命名了一个分支,或者你会想要在内容合并到主分支后,使用同一个分支在不同的错误或任务之间切换。在这种情况下,重命名主题分支就会很有帮助。
#### 重命名本地分支
1、重命名本地分支
```
$ git branch -m <old_branch_name> <new_branch_name>
```
当然,这只会重命名你的分支副本。如果远程 Git 服务器上存在该分支,请继续执行后续步骤。
2、推送这个新分支从而创建一个新的远程分支
```
$ git push origin <new_branch_name>
```
3、删除旧的远程分支
```
$ git push origin -d -f <old_branch_name>
```
#### 重命名当前分支
当你要重命名的分支恰好是当前分支时,你不需要指定旧的分支名称。
1、重命名当前分支
```
$ git branch -m <new_branch_name>
```
2、推送新分支从而创建一个新的远程分支
```
$ git push origin <new_branch_name>
```
3、删除旧的远程分支
```
$ git push origin -d -f <old_branch_name>
```
### 使用 Git 删除本地和远程分支
为了保持存储库的整洁,通常建议你在确保已将内容合并到主分支后,删除临时分支。
#### 删除本地分支
删除本地分支只会删除系统上存在的该分支的副本。如果分支已经被推送到远程存储库,它仍然可供使用该存储库的每个人使用。
1、签出存储库的主分支例如 `main``master`
```
$ git checkout <central_branch_name>
```
2、列出所有分支本地和远程
```
$ git branch -a
```
3、删除本地分支
```
$ git branch -d <name_of_the_branch>
```
要删除所有本地主题分支并仅保留 `main` 分支:
```
$ git branch | grep -v main | xargs git branch -d
```
#### 删除远程分支
删除远程分支只会删除远程服务器上存在的该分支的副本。如果你想撤销删除,也可以将其重新推送到远程(例如 GitHub只要你还有本地副本即可。
1、签出存储库的主分支通常是 `main``master`
```
$ git checkout <central_branch_name>
```
2、列出所有分支本地和远程
```
$ git branch -a
```
3、删除远程分支
```
$ git push origin -d <name_of_the_branch>
```
### 查看远程主题分支的作者
如果你是存储库管理员,你可能会有这个需求,以便通知未使用分支的作者它将被删除。
1、签出存储库的主分支例如 `main``master`
```
$ git checkout <central_branch_name>
```
2、删除不存在的远程分支的分支引用
```
$ git remote prune origin
```
3、列出存储库中所有远程主题分支的作者使用 `--format` 选项,并配合特殊的选择器来只打印你想要的信息(在本例中,`%(authorname)` 和 `%(refname)` 分别代表作者名字和分支名称):
```
$ git for-each-ref --sort=authordate --format='%(authorname) %(refname)' refs/remotes
```
示例输出:
```
tux  refs/remotes/origin/dev
agil refs/remotes/origin/main
```
你可以添加更多格式,包括颜色编码和字符串操作,以便于阅读:
```
$ git for-each-ref --sort=authordate \
--format='%(color:cyan)%(authordate:format:%m/%d/%Y %I:%M %p)%(align:25,left)%(color:yellow) %(authorname)%(end)%(color:reset)%(refname:strip=3)' \
refs/remotes
```
示例输出:
```
01/16/2019 03:18 PM tux      dev
05/15/2022 10:35 PM agil     main
```
你可以使用 `grep` 获取特定远程主题分支的作者:
```
$ git for-each-ref --sort=authordate \
--format='%(authorname) %(refname)' \
refs/remotes | grep <topic_branch_name>
```
### 熟练运用分支
Git 分支的工作方式存在细微差别,具体取决于你想要分叉代码库的位置、存储库维护者如何管理分支、<ruby>压扁<rt>squashing</rt></ruby><ruby>变基<rt>rebasing</rt></ruby>等。若想进一步了解该主题,你可以阅读下面这三篇文章:
* [《用乐高来类比解释 Git 分支》][4]作者Seth Kenlon
* [《我的 Git push 命令的安全使用指南》][5]作者Noaa Barki
* [《Git 分支指南》][6]作者Kedar Vijay Kulkarni
--------------------------------------------------------------------------------
via: https://opensource.com/article/22/5/git-branch-rename-delete-find-author
作者:[Agil Antony][a]
选题:[lkxed][b]
译者:[lkxed](https://github.com/lkxed)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/agantony
[b]: https://github.com/lkxed
[1]: https://opensource.com/sites/default/files/tree-branches.jpg
[2]: https://www.flickr.com/photos/22244945@N00/3353319002
[3]: https://creativecommons.org/licenses/by-sa/4.0/
[4]: https://opensource.com/article/22/4/git-branches
[5]: https://opensource.com/article/22/4/git-push
[6]: https://opensource.com/article/18/5/git-branching

View File

@ -0,0 +1,67 @@
[#]: subject: "FSF Does Not Accept Debian as a Free Distribution. Heres Why!"
[#]: via: "https://news.itsfoss.com/fsf-does-not-consider-debian-a-free-distribution/"
[#]: author: "Abhishek https://news.itsfoss.com/author/root/"
[#]: collector: "lkxed"
[#]: translator: "Chao-zhi"
[#]: reviewer: "wxy"
[#]: publisher: "wxy"
[#]: url: "https://linux.cn/article-14628-1.html"
自由软件基金会为什么不认为 Debian 是一种自由发行版?
======
![Why FSF doesn't consider Debian a free distribution][1]
Debian 项目开发了一个尊重用户自由的 GNU/Linux 发行版。在各种自由软件许可证下发布的软件中,其源代码中包含非自由组件的情形并不鲜见。这些软件在被发布到 Debian 之前会被清理掉。而<ruby>自由软件基金会<rt>Free Software Foundation</rt></ruby>FSF维护着一份 [自由 GNU/Linux 发行版的列表][2]但奇怪的是Debian 并不在其中。事实上, Debian 不符合进入此列表的某些标准,我们想知道到底不满足哪些标准。但首先,我们需要了解所有这些智力工作是如何得到证明的。换句话说,为什么要费心尝试进入一些名单,尤其是这个名单?
为什么 Debian 应该得到 FSF 的承认,以获得它的自由发行版的地位?曾于 2010 年至 2013 年担任 Debian 项目负责人的 Stefano Zacchiroli 说过几个原因。其中一个 Stefano 称之为“外部审查”的原因我特别赞同。事实上Debian 有其标准和质量水准,一些软件应当符合这些标准才能成为该发行版的一部分,但除了 Debian 开发人员自己,没有人能控制这个过程。如果该发行版被列入这份珍贵的清单中,那么 FSF 就会密切关注 Debian 的命运,并(在出现问题时)给予适度的批评。我相信这是很好的动力。如果你也这么认为,那么现在让我们看看 FSF 认为 Debian 不够自由的原因。
### Debian 社会契约
除了自由 GNU/Linux 发行版列表之外FSF 还保留了一份因某种原因而被拒绝授予自由地位的 GNU/Linux 发行版的列表。对于此列表中的每个发行版,都有一个评论,简要说明了拒绝的理由。从对 Debian 的评论中可以清楚地看出FSF 和 Debian 项目在对“自由分发”一词的解释上产生分歧的主要根源来自一份被称为 “<ruby>Debian 社会契约<rt>Debian Social Contract</rt></ruby>”的文件。
该社会契约的第一个版本是在 1997 年 7 月 4 日由第二任 Debian 项目领导人 Bruce Perens 发表的。作为该契约的一部分,也公布了一套被称为 <ruby>Debian 自由软件准则<rt>Debian Free Software Guidelines</rt></ruby>DFSG的规则。从那时起要成为 Debian 的一部分,分发软件的许可证必须符合 DFSG。该社会契约记录了 Debian 开发者只用自由软件建立操作系统的意图,而 DFSG 则用于将软件分为自由和非自由。2004 年 4 月 26 日,批准了该文件的新版本,取代了 1997 年的版本。
Debian 社会契约有五条。要回答我们今天主要讨论的问题,我们只需要关注其中两条 —— 即第一条和第五条,其他的省略。可以在 [此处][3] 查看该契约的完整版本。
第一条说:“**Debian 将保持 100% 自由**。我们在标题为‘<ruby>Debian 自由软件准则<rt>Debian Free Software Guidelines</rt></ruby>的文件中提供了用于确定一个作品是否自由的准则。我们承诺根据这些准则Debian 系统及其所有组件将是自由的。我们将支持在 Debian 上创造或使用自由和非自由作品的人。我们永远不会让系统要求使用非自由组件。”
同时,第五条写道:“**不符合我们自由软件标准的作品**。我们承认,我们的一些用户需要使用不符合 Debian 自由软件准则的作品。我们在我们的存档中为这些作品创建了“contrib”和“non-free”区域。这些区域中的软件包并不是 Debian 系统的一部分,尽管它们已被配置为可以在 Debian 中使用。我们鼓励 CD 制造商阅读这些区域的软件包的许可证,并确定他们是否可以在其 CD 上分发这些软件包。因此,尽管非自由作品不是 Debian 的一部分,但我们支持它们的使用,并为非自由软件包提供基础设施(例如我们的错误跟踪系统和邮件列表)。”
因此,在实践中,第一条和第五条意味着:在安装了 Debian 之后用户得到了一个完全而彻底的自由操作系统但是如果他们突然想牺牲自由来追求功能安装非自由软件Debian 不仅不会阻碍他们这样做,而且会大大简化这一任务。
尽管该契约规定发行版将保持 100% 自由,但它允许官方存档的某些部分可能包含非自由软件或依赖于某些非自由组件的自由软件。形式上,根据同一契约,这些部分中的软件不是 Debian 的一部分,但 FSF 对此感到不安,因为这些部分使得在系统上安装非自由软件变得更加容易。
在 2011 年前FSF 有合理的理由不认为 Debian 是自由的——该发行版附带的 Linux 内核没有清理二进制 blob。但自 2011 年 2 月发布的 Squeeze 至今Debian 已经包含了完全自由的 Linux 内核。因此,简化非自由软件的安装是 FSF 不承认 Debian 是自由发行版的主要原因,直到 2016 年这是我知道的唯一原因,但在 2016 年初出现了问题……
### 等等 …… 关 Firefox 什么事?
很长一段时间Debian 都包含一个名为 Iceweasel 的浏览器,它只不过是 Firefox 浏览器的更名重塑而已。进行品牌重塑有两个原因:首先,该浏览器标志和名称是 Mozilla 基金会的商标,而提供非自由软件与 DFSG 相抵触。其次通过在发行版中包含浏览器Debian 开发人员必须遵守 Mozilla 基金会的要求,该基金会禁止以 Firefox 的名义交付浏览器的修改版本。因此,开发人员不得不更改名称,因为他们在不断地修改浏览器的代码,以修复错误并消除漏洞。但在 2016 年初Debian 有幸拥有一款经过修改的 Firefox 浏览器,不受上述限制,可以保留原来的名称和徽标。一方面,这是对 Debian 修改的认可,也是对 Debian 信任的体现。另一方面,该软件显然没有清除非自由组件,它现在已成为发行版的一部分。如果此时 Debian 已被列入自由 GNU/Linux 发行版列表,那么自由软件基金会将会毫不犹豫地指出这一点。
### 结论
数字世界中的自由与现实世界中的自由同样重要。在这篇文章中,我试图揭示 Debian 最重要的特性之一 —— 开发用户自由的发行版。开发人员花费额外的时间从软件中清理非自由组件,并且以 Debian 为技术基础的数十个发行版继承了它的工作,并由此获得了一部分自由。
另外,我想分享一个简单的看法,即自由并不像乍看起来那么简单,人们自然会去追问什么是真正的自由,而什么不是。由于 Firefox 的存在Debian 现在不能被称为自由的 GNU/Linux 发行版。但从 2011 年,当 Debian 终于开始清理内核以及发行版的其他组件时,直到 2016 年 Firefox 成为发行版的一部分时,自由软件基金会出于纯粹的意识形态原因并不认为该发行版是自由的:原因是 Debian 大大简化了非自由软件的安装……现在轮到你来权衡所有的争论,并决定是否将 GNU/Linux 发行版视为自由的了。
祝你好运!并尽可能保持自由。
由 Evgeny Golyshev 为 [Cusdeb.com][4] 撰写
--------------------------------------------------------------------------------
via: https://news.itsfoss.com/fsf-does-not-consider-debian-a-free-distribution/
作者:[Evgeny Golyshev][a]
选题:[lkxed][b]
译者:[Chao-zhi](https://github.com/Chao-zhi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://news.itsfoss.com/author/root/
[b]: https://github.com/lkxed
[1]: https://news.itsfoss.com/wp-content/uploads/2022/05/why-fsf-doesnt-consider-debian-a-free-software-1200-%C3%97-675px.png
[2]: https://gnu.org/distros/free-distros.en.html
[3]: https://debian.org/social_contract
[4]: https://wiki.cusdeb.com/Essays:Why_the_FSF_does_not_consider_Debian_as_a_free_distribution/en

View File

@ -0,0 +1,143 @@
[#]: subject: "DAML: The Programming Language for Smart Contracts in a Blockchain"
[#]: via: "https://www.opensourceforu.com/2022/05/daml-the-programming-language-for-smart-contracts-in-a-blockchain/"
[#]: author: "Dr Kumar Gaurav https://www.opensourceforu.com/author/dr-gaurav-kumar/"
[#]: collector: "lkxed"
[#]: translator: "geekpi"
[#]: reviewer: "wxy"
[#]: publisher: "wxy"
[#]: url: "https://linux.cn/article-14649-1.html"
DAML区块链中智能合约的编程语言
======
> DAML 智能合约语言是一种专门设计的<ruby>特定领域语言<rt>domain specific language</rt></ruby>DSL用于编码应用的共享业务逻辑。它用于区块链环境中分布式应用的开发和部署。
![](https://img.linux.net.cn/data/attachment/album/202205/29/090752supudcno3dufa41j.jpg)
区块链技术是一种安全机制,以一种使人难以或不可能修改或入侵的方式来跟踪信息。区块链整合了交易的数字账本,它被复制并发送至其网络上的每台计算机。在链的每个区块中,都有一些交易。当区块链上发生新的交易时,该交易的记录就会被添加到属于该链的每个人的账簿中。
区块链使用<ruby>分布式账本技术<rt>distributed ledger technology</rt></ruby>DLT其中数据库并不保存在一个服务器或节点中。在区块链中交易被记录在一个被称为<ruby>哈希<rt>hash</rt></ruby>的不可改变的加密符号中。这意味着,如果一个通道或链上的一个区块被改变,黑客将很难改变链上的那个区块,因为他们必须对外面的每一个版本的链都要这样做。区块链,如比特币和以太坊,随着新的区块被添加到链上而不断增长,这使得账本更加安全。
随着区块链中智能合约的实施,在没有任何人工干预的情况下,有了自动执行的场景。智能合约技术使得执行最高级别的安全、隐私和反黑客实施成为可能。
![Figure 1: Market size of blockchain technology (Source: Statista.com)][2]
区块链的用例和应用是:
* 加密货币
* 智能合约
* 安全的个人信息
* 数字健康记录
* 电子政务
* 不可伪造的代币NFT
* 游戏
* 跨境金融交易
* 数字投票
* 供应链管理
根据 Statista.com自过去几年以来区块链技术市场的规模正在以非常快的速度增长预计到 2025 年将达到 400 亿美元。
### 区块链的编程语言和工具箱
有许多编程语言和开发工具包可用于分布式应用和智能合约。区块链的编程和脚本语言包括 Solidity、Java、Vyper、Serpent、Python、JavaScript、GoLang、PHP、C++、Ruby、Rust、Erlang 等,并根据实施场景和用例进行使用。
选择一个合适的平台来开发和部署区块链,取决于一系列因素,包括对安全、隐私、交易速度和可扩展性的需求(图 2
![Figure 2: Factors to look at when selecting a blockchain platform][3]
开发区块链的主要平台有:
* 以太坊
* XDC Network
* Tezos
* Stellar
* Hyperledger
* Ripple
* Hedera Hashgraph
* Quorum
* Corda
* NEO
* OpenChain
* EOS
* Dragonchain
* Monero
### DAML一种高性能的编程语言
<ruby>数字资产建模语言<rt>Digital Asset Modeling Language</rt></ruby>,即 DAMLdaml.com是一种高性能的编程语言用于开发和部署区块链环境中的分布式应用。它是一个轻量级和简洁的平台用于快速应用开发。
![Figure 3: Official portal of DAML][4]
DAML 的主要特点是:
* 细粒度的权限
* 基于场景的测试
* 数据模型
* 业务逻辑
* 确定性的执行
* 存储抽象化
* 无重复开销
* 负责任的跟踪
* 原子的可组合性
* 授权检查
* 需要知道的隐私
### 安装和使用 DAML
DAML SDK 可以安装在 Linux、macOS 或 Windows 上。在多个操作系统上安装 DAML 的详细说明可访问 https://docs.daml.com/getting-started/installation.html 。
你必须具备以下条件才能使用 DAML
* Visual Studio Code
* Java 开发套件JDK
DAML 可以通过下载并运行可执行的安装程序在 Windows 上安装,你可访问 https://github.com/digital-asset/daml/releases/download/v1.18.1/daml-sdk-1.18.1-windows.exe 。
在 Linux 或 Mac 上安装 DAML 可以通过在终端执行以下内容来完成:
```
$ curl -sSL https://get.daml.com/ | sh
```
安装 DAML 后,可以创建基于区块链的新应用,如图 4 和 5 所示。
![Figure 4: Creating a new app][5]
在另一个终端中,新的应用被导航并安装了项目的依赖:
![Figure 5: Running DAML][6]
```
WorkingDirectory>cd myapp/ui
WorkingDirectory>npm install
WorkingDirectory>npm start
```
这样启动了 WebUI该应用可在 Web 浏览器上通过 URL http://localhost:3000/ 访问。
![Figure 6: Login panel in DAML app][7]
### 研究和开发的范围
区块链技术为不同类别的应用提供了广泛的开发平台和框架。其中许多平台是免费和开源的,可以下载和部署以用于基于研究的实现。研究学者、从业者和专家们可以使用这些平台为众多应用提出和实施他们的算法。
--------------------------------------------------------------------------------
via: https://www.opensourceforu.com/2022/05/daml-the-programming-language-for-smart-contracts-in-a-blockchain/
作者:[Dr Kumar Gaurav][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.opensourceforu.com/author/dr-gaurav-kumar/
[b]: https://github.com/lkxed
[1]: https://www.opensourceforu.com/wp-content/uploads/2022/04/blockchain-hand-shake.jpg
[2]: https://www.opensourceforu.com/wp-content/uploads/2022/04/Figure-1-Market-size-of-blockchain-technology.jpg
[3]: https://www.opensourceforu.com/wp-content/uploads/2022/05/Untitled.png
[4]: https://www.opensourceforu.com/wp-content/uploads/2022/04/Figure-3-Official-portal-of-DAML-1.jpg
[5]: https://www.opensourceforu.com/wp-content/uploads/2022/04/Figure-4-Creating-a-new-app.jpg
[6]: https://www.opensourceforu.com/wp-content/uploads/2022/04/Figure-5-Running-DAML.jpg
[7]: https://www.opensourceforu.com/wp-content/uploads/2022/04/Figure-6-Login-panel-in-DAML-app.jpg

View File

@ -0,0 +1,135 @@
[#]: subject: "Linux Kernel 5.18 Released with Graphics Driver Changes and New Hardware Support"
[#]: via: "https://news.itsfoss.com/linux-kernel-5-18-release/"
[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/"
[#]: collector: "lkxed"
[#]: translator: "PeterPan0106"
[#]: reviewer: "wxy"
[#]: publisher: "wxy"
[#]: url: "https://linux.cn/article-14640-1.html"
Linux 内核 5.18 版本正式发布,新增显卡驱动以及硬件支持
======
> 最新的 Linux 内核 5.18 版本现已如期发布,本次更新包括针对新硬件的支持以及许多其他核心变化。
![Linux kernel 5.18 release][1]
[Linux 5.17 内核][2] 发布时包含了对下一代硬件的支持,同时增强了 Steam Deck 的游戏体验。
每一代内核都包含了令人兴奋的技术进步Linux 内核 5.18 也不例外。
### Linux 内核 5.18 有哪些变化呢?
本次我们可以看到,内核针对雷蛇外设硬件、苹果妙控键盘和 AMD 显卡增强了支持,还有一些网络、核心和安全方面的更新。
#### 新的雷蛇驱动
说到游戏装备Linux 的硬件支持亟待更新。
目前存在一些开源驱动程序的变通解决方案。但是这些方案不具有普适性,适配和支持较少。
正如 [Phoronix][3] 所发现的Linux 内核 5.18 中一同发布了一个新的雷蛇 HID 驱动程序,它适配了雷蛇黑寡妇蜘蛛键盘,并修复了宏键此前存在的问题。
此外,这个驱动程序应该也有助于解决其他雷蛇硬件的问题。
#### AMD 显卡特性 FreeSync 模式被默认开启
![][4]
虽然对 FreeSync 视频的支持足够好,但这只是改善 FreeSync 显示器用户体验的一个临时解决方案。
现在在 Linux 内核 5.18 版本中这一显示模式已被默认启用,用户无需调整任何设置即可使用 FreeSync[见更新日志][5])。
#### 显卡驱动更新
针对当前和未来的 AMD 显卡的驱动进行了改进。此外,支持英特尔 Arch 图形处理器和英特尔 Alder Lake N 的工作也取得了一些进展。
更高刷新率的 DisplayPort 也在这一个版本中得到支持。
#### 从 C89 标准升级到 C11 标准GNU11
![][6]
在 Linux 内核中使用的是 C89 C 语言标准,在当前已经稍显老旧并且缺失了许多十分必要的新特性。
考虑到目前的编译器版本 GCC 5.1 的要求,从 Linux 内核 5.18 开始决定用 C11 标准来取代它。
#### 网络优化
Linux 内核 5.18 增加了对新的无线硬件的支持,这包括联发科 MT7916、MT7921U 和博通 BCM43454/6。
![][7]
针对移动设备的改进也包括对英特尔 M.2 WWAN 卡的支持。
Realtek W89 驱动现在支持 AP 模式、6GHz 频段并增加了硬件扫描功能。
在配置 IPv6 和其他各种协议方面,通过一系列的改进提升了性能。
你可以在 Linux 内核 5.18 中网络方面的变更提交中了解所有情况(包括对驱动 API、协议和一些核心功能的改进
#### USB 改进
Xen USB 驱动程序进行了改进以抵御恶意主设备USB DWC3 驱动程序也支持了更多的硬件类型。
其他改进详见 [更新日志][8]。
#### 增强对苹果键盘以及平板的支持
![][9]
当前版本针对苹果妙控键盘(包含第一代型号)的使用体验进行了优化。
改进了功能键映射、键盘背光事件,以及 2021 款的妙控键盘通过 USB 连接时报告电池水平的能力。
Linux 内核 5.18 改进了输入处理,在平板电脑上输入将变得更为容易。
硬件相关的改进详见 [更新日志][10]。
#### ARM 架构芯片的支持(特斯拉 FSD树莓派 Zero 2 W
![][11]
Linux 内核 5.18 现在支持特斯拉的全套自动驾驶 SoC。三星工程师将其贡献到了 Linux 内核上游。
其他芯片支持包括高通骁龙 625/632以及三星 Exynos 850/7885。
你还会发现 Linux 内核 5.18 支持了树莓派 Zero 2 W而同时去除了旧的硬件/主板的支持。详见 [更新日志][12]。
你可以参考 [官方更新日志][13]  Linus Torvald 的官方公告获取更多信息。
### 如何安装 Linux 内核 5.18
你可以在 [Linux Kernel Archives][14] 网站上找到最新版本的内核。你可以下载 [Tarball][15] 以进行测试。你也可以参照我们的 [Linux 内核升级指南][16] 获取帮助。
如果不想自己编译它,你可以稍等几周,等 Linux 发行版们把它推到仓库。
--------------------------------------------------------------------------------
via: https://news.itsfoss.com/linux-kernel-5-18-release/
作者:[Ankush Das][a]
选题:[lkxed][b]
译者:[PeterPan0106](https://github.com/PeterPan0106)
校对:[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/05/kernel-5-18-release.png
[2]: https://news.itsfoss.com/linux-kernel-5-17-release/
[3]: https://www.phoronix.com/scan.php?page=news_item&px=Linux-5.18-HID
[4]: https://news.itsfoss.com/wp-content/uploads/2022/05/amd-linux-5-18-1024x576.jpg
[5]: https://lists.freedesktop.org/archives/amd-gfx/2022-February/075262.html
[6]: https://news.itsfoss.com/wp-content/uploads/2022/05/c-linux-5-18-1024x576.jpg
[7]: https://news.itsfoss.com/wp-content/uploads/2022/05/networking-linux-5-18-1024x576.jpg
[8]: https://lore.kernel.org/lkml/Yj7vGtn8fILavjyL@kroah.com/
[9]: https://news.itsfoss.com/wp-content/uploads/2022/05/apple-linux-5-18-1024x576.jpg
[10]: https://lore.kernel.org/lkml/nycvar.YFH.7.76.2203231015060.24795@cbobk.fhfr.pm/
[11]: https://news.itsfoss.com/wp-content/uploads/2022/05/arm-linux-5-18-1024x576.jpg
[12]: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=baaa68a9796ef2cadfe5caaf4c730412eda0f31c
[13]: https://lore.kernel.org/lkml/CAHk-=wjiqyoH6qntYvYTjR1F2L-pHtgX9esZMRS13iktCOJ1zA@mail.gmail.com/T/#u
[14]: https://www.kernel.org/
[15]: https://git.kernel.org/torvalds/t/linux-5.16.tar.gz
[16]: https://itsfoss.com/upgrade-linux-kernel-ubuntu/

View File

@ -0,0 +1,75 @@
[#]: subject: "System76 Collaborates with HP for a Powerful Linux Laptop for Developers"
[#]: via: "https://news.itsfoss.com/hp-dev-one-system76/"
[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/"
[#]: collector: "lkxed"
[#]: translator: "lkxed"
[#]: reviewer: "wxy"
[#]: publisher: "wxy"
[#]: url: "https://linux.cn/article-14645-1.html"
System76 与惠普合作为开发者提供功能强大的 Linux 笔记本电脑
======
> 惠普正在以开箱即用的 Pop!_OS 为特色进入 Linux 硬件市场,貌似有点激动人心?还是先来看一看吧!
![hp][1]
System76 不是早就自己生产 Linux 笔记本电脑了吗?那么,这次和惠普合作是怎么回事?
嗯,这一次是惠普要发行一款 Linux 笔记本电脑,搭载 Pop!_OS也就是 System76 的基于 Ubuntu 的 Linux 发行版。
Carl RichellSystem76 的创始人)在他的 Twitter 上宣布了这一消息,并附带了一个网站链接,该网站提供了更多相关信息。推文如下:
> Hp-Pop 好耶!来看看这个:[https://t.co/gf2brjjUl8][2]
### HP Dev One专为开发者打造的 Linux 笔记本电脑
一方面System76 笔记本电脑与 Pop!_OS 有着开箱即用硬件兼容性,因此它备受赞誉。
另一方面Pop!_OS 也与笔记本电脑完美搭配,适配没有太多麻烦。
Pop!_OS 也一直在推出更新和新增功能,以改进工作流程并充分利用 Linux 的可用硬件。
此时,和惠普合作听起来是一个提高档次的好主意。
![HP System76][3]
所以说Pop!_OS 和惠普合作的想法有点激动人心啊!
挂上了惠普这个牌子,笔记本电脑的可用性/保修(在纸面上)就比 System76 要好了,考虑到后者在某些地区是不提供保修的。
### AMD 驱动的笔记本电脑可帮助你更好地写代码
HP Dev One 似乎是把“为开发者提供多任务处理的能力,从而快速完成任务”作为卖点。
这款笔记本电脑的入门款搭载了 **8 核的 AMD Ryzen 7 PRO 处理器****16 GB RAM**DDR4 @ 3200 MHz
预计它还会搭载由 AMD Radeon Graphics 提供支持的 14 英寸全高清防眩光显示屏。
对于 HP Dev OneCarl Richell 提到了这款笔记本电脑将通过 [LVFS][5]Linux 供应商固件服务)接收**固件更新**。
他还提到,这款笔记本电脑(以上规格)的定价为 **1099 美元** 起。
网站上只显示了它即将推出。因此,我们目前还不知道正式的发布日期。
对于像惠普这样的商业制造商来说笔记本电脑的定价听起来并不令人兴奋LCTT 译注:毕竟不是国内互联网品牌的笔记本),但可能是一个划算的交易。
你怎么看这款惠普笔记本电脑(运行 Linux、为开发者量身定制的定价你觉得这个价格合理吗你对这款笔记本电脑有什么期望呢
--------------------------------------------------------------------------------
via: https://news.itsfoss.com/hp-dev-one-system76/
作者:[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/05/hpdevone-laptop.jpg
[2]: https://t.co/gf2brjjUl8
[3]: https://news.itsfoss.com/wp-content/uploads/2022/05/hpdevone-illustration-1024x576.jpg
[4]: https://fwupd.org/

View File

@ -0,0 +1,92 @@
[#]: subject: "ProtonMail is Now Just Proton Offering a Privacy Ecosystem"
[#]: via: "https://news.itsfoss.com/protonmail-now-proton/"
[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/"
[#]: collector: "lkxed"
[#]: translator: "lkxed"
[#]: reviewer: "wxy"
[#]: publisher: "wxy"
[#]: url: "https://linux.cn/article-14652-1.html"
ProtonMail 改名为 “Proton”致力于提供一个隐私生态系统
======
> ProtonMail 宣布了重塑后的品牌,包括新网站、新名称、新的定价计划、新的 UI 和其他变化。
![proton][1]
[ProtonMail][2] 将自己重新命名为 “Proton”以将其所有产品囊括在统一的品牌下。
注意,别把它和 Steam 的 Proton它也简称为 Proton混淆哦
换句话说ProtonMail、ProtonVPN 和它的任何服务将不再有单独的产品页面。
### Proton一个开源隐私生态系统
![更新后的 Proton统一保护][3]
Proton 将拥有一个新的统一平台(新网站),你可以在其中访问所有服务,包括:
* Proton 邮件
* Proton VPN
* Proton 网盘
* Proton 日历
现在,新的登录会话将会被重定向到 `proton.me` 而不是 `protonmail.com`、`mail.protonmail.com`、`protonvpn.com` 等等。
不仅限于名称/品牌,整体的强调色和现有的用户体验,也将受到影响。
![][4]
现在,你只需一次付费订阅即可获得全部服务,而不必单独升级 VPN 和邮件。这也意味着,经过这次改变,高级订阅的价格变得更加实惠了。
![][5]
总体而言,让 “Proton” 成为隐私生态系统,是为了吸引更多对技术细节不感兴趣的用户来了解它是如何运作的。
你可以在其新的官方网站([proton.me][6])上查看所有详细信息。
新网站看起来更干净、更有条理,并且更具商业吸引力。
### 本次更改的内容
你可以期待有一个焕然一新的用户界面,包括新的品牌和新的网站。
![proton][7]
除此之外Proton 还提到它改进了服务之间的集成,以获得更好的用户体验。
![][8]
如果你已经在使用 ProtonMail你可能知道他们正在主动建议现有用户激活 “@proton.me” 帐户,这也是本次更改的一部分。
你可以选择将新电子邮件地址 xyz@proton.me 设为默认值,它更短,看起来也更有意义一些。
* 旧的电子邮件地址不会消失,只是额外提供了新地址(@proton.me
* 现有的付费订阅者应该可以免费获得存储空间提升。
* 升级了网页和移动应用中的用户体验。
* 新的官方网站(你将被自动重定向到它以进行新会话)。
* 新的定价计划,为 Proton 网盘提供更多存储空间。
你对本次变更感兴趣吗?你喜欢 Proton 的新名字和新的服务方式吗?请在下方评论中分享你的想法吧!
--------------------------------------------------------------------------------
via: https://news.itsfoss.com/protonmail-now-proton/
作者:[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/05/proton-ft.jpg
[2]: https://itsfoss.com/recommends/protonmai
[3]: https://youtu.be/s5GNTQ63HJE
[4]: https://news.itsfoss.com/wp-content/uploads/2022/05/proton-ui-new-1024x447.jpg
[5]: https://news.itsfoss.com/wp-content/uploads/2022/05/proton-pricing-1024x494.jpg
[6]: https://proton.me/
[7]: https://news.itsfoss.com/wp-content/uploads/2022/05/Proton-me-website.png
[8]: https://news.itsfoss.com/wp-content/uploads/2022/05/Proton-Product.png

View File

@ -0,0 +1,59 @@
[#]: subject: "DeepMinds Open Source MuJoCo Is Available On GitHub"
[#]: via: "https://www.opensourceforu.com/2022/05/deepminds-open-source-mujoco-is-available-on-github/"
[#]: author: "Laveesh Kocher https://www.opensourceforu.com/author/laveesh-kocher/"
[#]: collector: "lkxed"
[#]: translator: "lkxed"
[#]: reviewer: "wxy"
[#]: publisher: "wxy"
[#]: url: "https://linux.cn/article-14650-1.html"
DeepMind 的开源物理引擎 MuJoCo 已在 GitHub 发布
======
![deepmind1][1]
DeepMind 是 Alphabet 的子公司和 AI 研究实验室,在 2021 年 10 月,它收购了用于机器人研发的 MuJoCo 物理引擎并承诺该模拟器将作为免费、开源、社区驱动的项目进行维护。现在DeepMind 声称开源计划已完成,它的整个代码库 [可在 GitHub 上获得][2]。
MuJoCo 是 “Multi-Joint Dynamics with Contact” 的缩写它是一个物理引擎旨在帮助机器人、生物力学、图形和动画等领域的研究和开发也包括其他需要快速准确模拟的领域。MuJoCo 可用于帮助机器学习应用实现基于模型的计算,例如<ruby>控制综合<rt>control synthesis</rt></ruby><ruby>状态估计<rt>state estimation</rt></ruby><ruby>系统识别<rt>system identification</rt></ruby><ruby>机制设计<rt>mechanism design</rt></ruby>、通过<ruby>逆动力学<rt>inverse dynamics</rt></ruby>来进行数据分析,以及<ruby>并行采样<rt>parallel sampling</rt></ruby>。它也可以用作标准模拟器例如用于游戏和交互式虚拟环境。LCTT 译注:这段话中涉及到不少专业词汇,鉴于译者水平有限,若有谬误,请在评论中指出,同时也欢迎在评论中科普,一起学习~)
根据 DeepMind 的说法,以下是 MuJoCo 适合协作的一些功能:
* 能够模拟复杂机制的综合模拟器
* 可读、高性能、可移植的代码
* 易于扩展的代码库
* 丰富的文档,包括面向用户的和代码注释 —— 我们希望学术界和 OSS 社区的同事能够使用这个平台并为代码库做出贡献,从而改善所有人的研究
DeepMind 还说:
> “作为没有动态内存分配的 C 库MuJoCo 非常快。不幸的是,原始物理速度一直受到 Python 包装器的阻碍全局解释器锁GIL和非编译代码的存在使得批处理、多线程操作无法执行。在下面的路线图中我们将解决这个问题。”
LCTT 译注: 这里补充了原文没有提及的路线图和基准测试结果。)
路线图:
* 通过批处理、多线程模拟释放 MuJoCo 的速度潜力
* 通过改进内部内存管理支持更大的场景
* 新的增量编译器,带来更好的模型可组合性
* 通过 Unity 集成支持更好的渲染
* 对物理导数的原生支持,包括解析和有限差分
> “目前,我们想分享两个常见模型的基准测试结果。注意,这个结果是在运行 Windows 10 的标准 AMD Ryzen 9 5950X 机器上获得的。”
![基准测试结果][3]
--------------------------------------------------------------------------------
via: https://www.opensourceforu.com/2022/05/deepminds-open-source-mujoco-is-available-on-github/
作者:[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/05/deepmind1.jpg
[2]: https://github.com/deepmind/mujoco
[3]: https://assets-global.website-files.com/621e749a546b7592125f38ed/628b971675cb60d74f5fa189_2A54E864-FE90-49E4-8E58-FE40298303E2.jpeg

View File

@ -0,0 +1,76 @@
[#]: subject: "Plex Desktop Player is Now Available for Linux"
[#]: via: "https://news.itsfoss.com/plex-desktop-linux/"
[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/"
[#]: collector: "lkxed"
[#]: translator: "lkxed"
[#]: reviewer: "wxy"
[#]: publisher: "wxy"
[#]: url: "https://linux.cn/article-14656-1.html"
Plex 桌面播放器现已支持 Linux
======
> Plex.tv 终于增加了 Linux 桌面版本和全新的 HTPC 应用。不过,它目前只提供了 Snap 包。
![plex][1]
Plex 是一个流行的流媒体播放器,同时,它能够用作一个媒体服务器软件。
事实上,它也是 [Linux 上最好的媒体服务器软件][2] 之一。
是的,这个媒体服务器已经支持 Linux而且还提供了一个 [包含安装步骤的教程][3]。
### Linux 上的 Plex 桌面播放器提供 Snap 包
我知道很多人都不喜欢使用 Snap 包来安装这个桌面播放器。但现在,这个桌面播放器已在 Snap 商店中提供,你可以轻松地在任何 Linux 发行版上安装它。
![][4]
幸运的是,这个桌面播放器的 [公告][5] 还提到他们正在开发一个 **Flatpak 包**,它应该会在近期登陆 Flathub。
这样一来,借助 Flatpak 和 Snap 软件包Plex 就可以成为在 Linux 上流式传输和组织个人媒体收藏的绝佳选择。
除了桌面应用程序,如果你利用你的 Linux 机器连接到一个大屏幕来观看所有的内容,还有一个 Plex HTPC有计划发布 Flatpak 软件包)。
![][6]
顺便说一句HTPC 是 PMP TV全称为 Plex Media Player TV模式的继承者。
他们在官网上与它的 Linux 桌面应用程序一同发布了这款产品。
使用 HTPC这个桌面应用就可以和电视共享并支持音频直通、刷新率切换、控制器和可配置输入映射等高级功能。
![][7]
因此,如果你有一个大屏幕,并且想要连接你的系统(不管是什么桌面平台)的话,你现在可以使用 HTPC 应用程序来完成。
> **[Plex 桌面版][8]**
> **[Plex HTPC][9]**
在 Linux 系统或联网电视上流式传输内容时,你通常会使用什么呢?你觉得 Plex 能满足你的需求吗?即然它支持 Linux 了,你会想要用它来替代当前使用的软件吗?
欢迎在评论区告诉我们你的想法!
--------------------------------------------------------------------------------
via: https://news.itsfoss.com/plex-desktop-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/05/plex-ft.jpg
[2]: https://itsfoss.com/best-linux-media-server/
[3]: https://itsfoss.com/install-plex-ubuntu/
[4]: https://news.itsfoss.com/wp-content/uploads/2022/05/plex-desktop-ubuntu.jpg
[5]: https://www.plex.tv/blog/way-to-be-htpc/
[6]: https://news.itsfoss.com/wp-content/uploads/2022/05/plex-snap-1024x524.jpg
[7]: https://news.itsfoss.com/wp-content/uploads/2022/05/plex-feat-1024x576.jpg
[8]: https://snapcraft.io/plex-desktop
[9]: https://snapcraft.io/plex-htpc

View File

@ -0,0 +1,81 @@
[#]: subject: "AlmaLinux Continues the Legacy of CentOS with the Release of Version 9"
[#]: via: "https://news.itsfoss.com/almalinux-9-release/"
[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/"
[#]: collector: "lkxed"
[#]: translator: "PeterPan0106"
[#]: reviewer: "wxy"
[#]: publisher: "wxy"
[#]: url: "https://linux.cn/article-14644-1.html"
CentOS 的继承者 AlmaLinux 9 发布
======
> AlmaLinux 9 是基于 Red Hat Enterprise Linux 9 的最新版本,添加了新的壁纸并进一步增强了性能。
![almalinux][1]
如果你一直在关注我们的话,应当知道 [AlmaLinux 9.0 测试版][2] 已于上月发布。
AlmaLinux 是目前 [最好的 RHEL 替代版][3] 之一。其最新的稳定版是基于 RHEL 9 的,这也成为了 CentOS 的一个很好的替代品。
最新的 AlmaLinux 9 支持所有主流架构,包括 Intel/AMDx86_64、ARM64 aarch64、IBM PowerPCppc64le和 IBM Zs390x
### AlmaLinux 9.0 有哪些改变呢
AlmaLinux 9.0 在这个版本中使用了 Linux 内核 5.14。它包括对云和容器开发的改进,以及对网络控制台的完善。
还包括其他变化带来的性能改进。更新包括:
#### 新壁纸
![AlmaLinux 9][4]
在 AlmaLinux 9.0 中,更新了一些新的壁纸。
这些新的壁纸看起来很美观,并提供了更丰富的选择。
#### Linux 内核 5.14
最大的变化是升级到了 Linux 内核 5.14,它带来了更新的硬件支持,以及其他各种改进。
Linux 内核 5.14 的改进详见 [这篇文章][5]。
#### 更新的软件包
这个版本带有新的软件包更新。其中包括 Git 2.31、PHP 8.0、Perl 5.32 和 MySQL 8.0。
GCC 也被更新到最新的 GCC 11。
其它更新包括 Python 3.9 和最新版的 LLVM、Rust 和 Go compilers使应用程序的现代化更快、更容易。
更多技术方面的更新详见 [官方更新日志][6]。
### 下载 AlmaLinux 9.0
你可以在 [官方镜像网站][7] 下载最新的镜像。在镜像站也包含了 .torrent 文件的下载选项。
> **[AlmaLinux 9.0][8]**
*你认为基于 RHEL 的最新版 AlmaLinux 9.0 怎么样呢?你有计划在服务器上迁移到最新的版本吗?欢迎评论。*
--------------------------------------------------------------------------------
via: https://news.itsfoss.com/almalinux-9-release/
作者:[Ankush Das][a]
选题:[lkxed][b]
译者:[PeterPan0106](https://github.com/PeterPan0106)
校对:[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/05/alma-linux-9.jpg
[2]: https://linux.cn/article-14500-1.html
[3]: https://itsfoss.com/rhel-based-server-distributions/
[4]: https://news.itsfoss.com/wp-content/uploads/2022/05/alma-linux-wallpapers-9-1024x609.jpg
[5]: https://news.itsfoss.com/kernel-5-14-release/
[6]: https://wiki.almalinux.org/release-notes/9.0.html
[7]: https://mirrors.almalinux.org/isos.html
[8]: https://mirrors.almalinux.org/isos.html

View File

@ -0,0 +1,72 @@
[#]: subject: "Tails Linux Users Warned Against Using the Tor Browser: Heres why!"
[#]: via: "https://news.itsfoss.com/tails-tor-browser/"
[#]: author: "Rishabh Moharir https://news.itsfoss.com/author/rishabh/"
[#]: collector: "lkxed"
[#]: translator: "lkxed"
[#]: reviewer: "wxy"
[#]: publisher: "wxy"
[#]: url: "https://linux.cn/article-14654-1.html"
Tails 警告用户不要使用 Tor 浏览器:原因如下!
======
> Tails 5.1 将针对“可绕过 Tor 浏览器安全措施的危险漏洞”提供关键修复。以下是它的全部内容。
![Tails][1]
Tails 是一个专注于安全的便携式 Linux 发行版,最近,它的开发团队发布了有关其当前版本的重要公告。他们警告用户在 **Tails 5.0 或更早版本** 上使用 Tor 浏览器时,避免输入或使用任何个人或敏感信息。
Tor 浏览器是 Tails 事实上的(默认)网页浏览器,它有助于在用户连接到互联网时,保护他们的在线身份。它主要被各种记者和活动家用来逃避审查。不过,普通用户也可以使用它。
### 问题说明
最近,有人发现了两个令人讨厌的漏洞,它们允许有害网站能够从其他网站窃取用户的信息。
这些都是在 Firefox 使用的 JavaScript 引擎中发现的。
但是Tor 与此有什么关系对于那些不知道的人来说Tor 实际上是 Firefox 的一个复刻,因此包含许多类似的功能,如 JavaScript 引擎。
具体来说,在 [Mozilla 发布的公告][2] 中,这些漏洞已被确定为 CVE-2022-1802 和 CVE-2022-1529。
Tails 公告中也对此进行了说明:
> “例如,在你访问恶意网站后,控制该网站的攻击者可能会在同一个 Tails 会话期间,访问你随后发送到其他网站的密码或其他敏感信息。”
### 你应该停止使用 Tail 发行版吗?
没有这个必要。
用户会很高兴地知道,这些漏洞并不影响 Tor 的连接。这意味着,如果你不交换任何敏感信息,如密码、个人信息、信息等,你可以随意地浏览互联网。
Tails 中的其他应用程序,尤其是 Thunderbird仍然可以安全使用因为 JavaScript 在使用时会被禁用。
此外,你也可以在 Tor 浏览器中启用最高的安全级别。这是推荐的因为该级别下JavaScript 引擎会被禁用。不过,请注意,这会使网站无法正常运行。
换句话说如果你知道自己在做什么的话Tails 发行版仍然可以安全使用。
### 漏洞修复即将发布
好的消息是Mozilla 已经在上游修补了这些错误,现在就等 Tails 团队发布修复程序了。
至于何时发布,他们是这样说的:
> 此漏洞将在 Tails 5.1**5 月 31 日**)中修复,但我们的团队没有能力提前发布紧急版本。
因此,你最好的选择是等待下周的 Tails 5.1 发布。你可以阅读 Tails 开发团队的 [官方公告][3] 以了解更多信息。
--------------------------------------------------------------------------------
via: https://news.itsfoss.com/tails-tor-browser/
作者:[Rishabh Moharir][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/rishabh/
[b]: https://github.com/lkxed
[1]: https://news.itsfoss.com/wp-content/uploads/2022/05/tails-5-0-privacy-issue.jpg
[2]: https://www.mozilla.org/en-US/security/advisories/mfsa2022-19/
[3]: https://tails.boum.org/security/prototype_pollution/index.en.html

Some files were not shown because too many files have changed in this diff Show More