mirror of
https://github.com/LCTT/TranslateProject.git
synced 2025-01-13 22:30:37 +08:00
commit
a3f78ec42a
124
published/20180523 Creating random, secure passwords in Go.md
Normal file
124
published/20180523 Creating random, secure passwords in Go.md
Normal 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
|
153
published/20180529 Build a concurrent TCP server in Go.md
Normal file
153
published/20180529 Build a concurrent TCP server in Go.md
Normal file
@ -0,0 +1,153 @@
|
||||
[#]: subject: "Build a concurrent TCP server in Go"
|
||||
[#]: via: "https://opensource.com/article/18/5/building-concurrent-tcp-server-go"
|
||||
[#]: author: "Mihalis Tsoukalos https://opensource.com/users/mtsouk"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "lkxed"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14623-1.html"
|
||||
|
||||
在 Go 中实现一个支持并发的 TCP 服务端
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202205/22/115536nkfuuf4dklgg7fsx.jpg)
|
||||
|
||||
> 仅用大约 65 行代码,开发一个用于生成随机数、支持并发的 TCP 服务端。
|
||||
|
||||
TCP 和 UDP 服务端随处可见,它们基于 TCP/IP 协议栈,通过网络为客户端提供服务。在这篇文章中,我将介绍如何使用 [Go 语言][2] 开发一个用于返回随机数、支持并发的 TCP 服务端。对于每一个来自 TCP 客户端的连接,它都会启动一个新的 goroutine(轻量级线程)来处理相应的请求。
|
||||
|
||||
你可以在 GitHub 上找到本项目的源码:[concTcp.go][3]。
|
||||
|
||||
### 处理 TCP 连接
|
||||
|
||||
这个程序的主要逻辑在 `handleConnection()` 函数中,具体实现如下:
|
||||
|
||||
```
|
||||
func handleConnection(c net.Conn) {
|
||||
fmt.Printf("Serving %s\n", c.RemoteAddr().String())
|
||||
for {
|
||||
netData, err := bufio.NewReader(c).ReadString('\n')
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
|
||||
temp := strings.TrimSpace(string(netData))
|
||||
if temp == "STOP" {
|
||||
break
|
||||
}
|
||||
|
||||
result := strconv.Itoa(random()) + "\n"
|
||||
c.Write([]byte(string(result)))
|
||||
}
|
||||
c.Close()
|
||||
}
|
||||
```
|
||||
|
||||
如果 TCP 客户端发送了一个 “STOP” 字符串,为它提供服务的 goroutine 就会终止;否则,TCP 服务端就会返回一个随机数给它。只要客户端不主动终止,服务端就会一直提供服务,这是由 `for` 循环保证的。具体来说,`for` 循环中的代码使用了 `bufio.NewReader(c).ReadString('\n')` 来逐行读取客户端发来的数据,并使用 `c.Write([]byte(string(result)))` 来返回数据(生成的随机数)。你可以在 Go 的 net 标准包 [文档][4] 中了解更多。
|
||||
|
||||
|
||||
### 支持并发
|
||||
|
||||
在 `main()` 函数的实现部分,每当 TCP 服务端收到 TCP 客户端的连接请求,它都会启动一个新的 goroutine 来为这个请求提供服务。
|
||||
|
||||
```
|
||||
func main() {
|
||||
arguments := os.Args
|
||||
if len(arguments) == 1 {
|
||||
fmt.Println("Please provide a port number!")
|
||||
return
|
||||
}
|
||||
|
||||
PORT := ":" + arguments[1]
|
||||
l, err := net.Listen("tcp4", PORT)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
defer l.Close()
|
||||
rand.Seed(time.Now().Unix())
|
||||
|
||||
for {
|
||||
c, err := l.Accept()
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
go handleConnection(c)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
首先,`main()` 确保程序至少有一个命令行参数。注意,现有代码并没有检查这个参数是否为有效的 TCP 端口号。不过,如果它是一个无效的 TCP 端口号,`net.Listen()` 就会调用失败,并返回一个错误信息,类似下面这样:
|
||||
|
||||
```
|
||||
$ go run concTCP.go 12a
|
||||
listen tcp4: lookup tcp4/12a: nodename nor servname provided, or not known
|
||||
$ go run concTCP.go -10
|
||||
listen tcp4: address -10: invalid port
|
||||
```
|
||||
|
||||
`net.Listen()` 函数用于告诉 Go 接受网络连接,因而承担了服务端的角色。它的返回值类型是 `net.Conn`,后者实现了 `io.Reader` 和 `io.Writer` 接口。此外,`main()` 函数中还调用了 `rand.Seed()` 函数,用于初始化随机数生成器。最后,`for` 循环允许程序一直使用 `Accept()` 函数来接受 TCP 客户端的连接请求,并以 goroutine 的方式来运行 `handleConnection(c)` 函数,处理客户端的后续请求。
|
||||
|
||||
### net.Listen() 的第一个参数
|
||||
|
||||
`net.Listen()` 函数的第一个参数定义了使用的网络类型,而第二个参数定义了服务端监听的地址和端口号。第一个参数的有效值为 `tcp`、`tcp4`、`tcp6`、`udp`、`udp4`、`udp6`、`ip`、`ip4`、`ip6`、`Unix`(Unix 套接字)、`Unixgram` 和 `Unixpacket`,其中:`tcp4`、`udp4` 和 `ip4` 只接受 IPv4 地址,而 `tcp6`、`udp6` 和 `ip6` 只接受 IPv6 地址。
|
||||
|
||||
### 服务端并发测试
|
||||
|
||||
`concTCP.go` 需要一个命令行参数,来指定监听的端口号。当它开始服务 TCP 客户端时,你会得到类似下面的输出:
|
||||
|
||||
```
|
||||
$ go run concTCP.go 8001
|
||||
Serving 127.0.0.1:62554
|
||||
Serving 127.0.0.1:62556
|
||||
```
|
||||
|
||||
`netstat` 的输出可以确认 `congTCP.go` 正在为多个 TCP 客户端提供服务,并且仍在继续监听建立连接的请求:
|
||||
|
||||
```
|
||||
$ netstat -anp TCP | grep 8001
|
||||
tcp4 0 0 127.0.0.1.8001 127.0.0.1.62556 ESTABLISHED
|
||||
tcp4 0 0 127.0.0.1.62556 127.0.0.1.8001 ESTABLISHED
|
||||
tcp4 0 0 127.0.0.1.8001 127.0.0.1.62554 ESTABLISHED
|
||||
tcp4 0 0 127.0.0.1.62554 127.0.0.1.8001 ESTABLISHED
|
||||
tcp4 0 0 *.8001 *.* LISTEN
|
||||
```
|
||||
|
||||
在上面输出中,最后一行显示了有一个进程正在监听 8001 端口,这意味着你可以继续连接 TCP 的 8001 端口。第一行和第二行显示了有一个已建立的 TCP 网络连接,它占用了 8001 和 62556 端口。相似地,第三行和第四行显示了有另一个已建立的 TCP 连接,它占用了 8001 和 62554 端口。
|
||||
|
||||
下面这张图片显示了 `concTCP.go` 在服务多个 TCP 客户端时的输出:
|
||||
|
||||
![concTCP.go TCP 服务端测试][5]
|
||||
|
||||
类似地,下面这张图片显示了两个 TCP 客户端的输出(使用了 `nc` 工具):
|
||||
|
||||
![是用 nc 工具作为 concTCP.go 的 TCP 客户端][6]
|
||||
|
||||
你可以在 [维基百科][7] 上找到更多关于 `nc`(即 `netcat`)的信息。
|
||||
|
||||
### 总结
|
||||
|
||||
现在,你学会了如何用大约 65 行 Go 代码来开发一个生成随机数、支持并发的 TCP 服务端,这真是太棒了!如果你想要让你的 TCP 服务端执行别的任务,只需要修改 `handleConnection()` 函数即可。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/18/5/building-concurrent-tcp-server-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/go-golang.png
|
||||
[2]: https://golang.org/
|
||||
[3]: https://github.com/mactsouk/opensource.com
|
||||
[4]: https://golang.org/pkg/net/
|
||||
[5]: https://opensource.com/sites/default/files/uploads/tcp-in-go_server.png
|
||||
[6]: https://opensource.com/sites/default/files/uploads/tcp-in-go_client.png
|
||||
[7]: https://en.wikipedia.org/wiki/Netcat
|
@ -0,0 +1,86 @@
|
||||
[#]: subject: "Why you should choose mindfulness over multitasking"
|
||||
[#]: via: "https://opensource.com/article/19/4/mindfulness-over-multitasking"
|
||||
[#]: author: "Sarah Wall https://opensource.com/users/sarahwall"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "lkxed"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14581-1.html"
|
||||
|
||||
你为什么应该选择专注而非一心多用
|
||||
======
|
||||
|
||||
> 如果你有时候会感觉大脑处于停滞状态,那么你可能正在遭受一心多用和决策疲劳。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202205/11/232939ixz3xfnhwxn5oz2i.jpg)
|
||||
|
||||
想象一下,你刚完成了日常工作,坐在电脑前,手里拿着晨间咖啡,正准备开始新的一天。突然,一条 Slack 消息弹了出来,你扫了一眼邮件,然后切回 Slack。你打开日历,看看下一次会议是什么时候,令你惊讶的是,它 15 分钟后就要开始了!你回到办公桌前,开始检查待办事项,想看看在这短短 15 分钟内还能给自己安排什么任务,但不巧的是,这时你的一个同事请求你帮他解决一个问题。大半天就这样过去了,而你根本没有意识到……
|
||||
|
||||
我的许多日子都是这样度过的,不断地多个任务之间徘徊。有些时候,我发现自己盯着电脑,大脑完全停滞。如果你也发现自己处于这种情况,这可能是你的大脑发出的信号,提醒你休息一下。你可能正在遭受一心多用和决策疲劳。
|
||||
|
||||
平均而言,成年人每天要做大约 [35000 个决定][2]!它们可能是简单的决定,如吃什么或穿什么,也可能是需要更多思考的决定,如下一个假期去哪里或从事哪个职业。每天你都面临着大量的选择,它们占据了你的头脑。
|
||||
|
||||
### 分散注意力的一心多用
|
||||
|
||||
不只有你一个人每天面临着数以千计的决定,事实上,一心多用早已成为忙碌的、工作中的专业人士的常态。问题是,一心多用的伤害比它的帮助更大。你越是为了处理多任务而分散注意力,你的生产力就越是下降。
|
||||
|
||||
在一项研究中,自称是一心多用者的人,被要求以他们感觉自然的速度,在各种任务之间来回切换。同时,研究的对照组,被要求按顺序,一次完成一项工作。研究表明,多任务组的效率要低得多。每次他们切换任务时,都会出现速度减慢的情况,因为他们需要时间来回忆到目前为止所做的细节和步骤。这最终 [额外花费了大约 40% 的时间][3],并导致整体准确度降低。每次专注于一项任务的人,总体上花费的时间更少,并且完成了所有的任务。
|
||||
|
||||
### 选择专注
|
||||
|
||||
当大脑集中在一项活动上时,它的功能是最理想的。选择专注而不是一心多用,将使你在一天中获得更好的感受,并帮助你完成更好的工作。
|
||||
|
||||
“专注”可以被定义为有意识和察觉的。它实际上是指活在当下,并将注意力集中于眼前的事情上。在工作场所,专注有很多好处。它的诀窍在于建立边界和习惯,使你能够对每项任务给予充分的关注。
|
||||
|
||||
保持积极主动,为每天必须完成的项目排好优先级,并制定一个完成计划。这将使你能够在一些重要的事情上取得真正的进展,而不是被动应付。你的待办事项清单上的每个项目,都应该是独立、明确、可操作的。每天专注于三到五项任务,不要太多。
|
||||
|
||||
### 三种在工作日休息的方法
|
||||
|
||||
不要忘记把“休息”也放进一天的计划中。大脑每小时需要几分钟的休息,以休养生息,避免倦怠。休息一下对你的心理健康也有好处,最终 [有助于生产力的提高][4]。
|
||||
|
||||
这里有三种简单的“休息”方法,请把它们融入到你忙碌的一天中吧!
|
||||
|
||||
#### 1、移动身体
|
||||
|
||||
花 10 分钟时间,离开你的椅子,站起来走一走。如果你的时间很紧张,可以站起来伸展两分钟。改变身体所处的位置,并专注于当下,将有助于缓解积聚在你心中的精神紧张。
|
||||
|
||||
#### 2、多笑
|
||||
|
||||
休息一下,与你的朋友和工作中的同事交谈。笑声可以减少压力荷尔蒙,并引发内啡肽的释放,内啡肽是人体天然的的化学物质,它会使人感觉良好。欢声笑语的小憩有助于放松你的头脑,对你的灵魂也有好处。
|
||||
|
||||
#### 3、深呼吸
|
||||
|
||||
用两分钟的休息时间来重置你的身心,使用腹部深呼吸。它可以使你的身心平静下来,改善氧气流动,并给你带来自然的能量提升。
|
||||
|
||||
1. 挺直坐正,将注意力放在腹部,感受它的柔软和放松。
|
||||
2. 从缓慢的深吸气开始,数三下,让氧气依次充满你的腹部、肋骨和上胸。
|
||||
3. 停顿一秒钟,然后与深吸气相反,从上胸、肋骨和腹部呼气,最后将腹部拉向脊柱。
|
||||
4. 再次停顿,然后重复。
|
||||
|
||||
### 重置自己
|
||||
|
||||
下次当你发现自己处于停滞状态,或是正在强迫状态不佳的自己完成一项任务时,请尝试上面的一些提示。最好是短暂休息一下,重置身心,而不要试图强行完成任务。相信我,你的身体和大脑会感谢你的!
|
||||
|
||||
本文改编自《BodyMindSpirit》上的 [让自己休息一下][5] 和 ImageX 的博文 [专注而不是一心多用][6]。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/4/mindfulness-over-multitasking
|
||||
|
||||
作者:[Sarah Wall][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/sarahwall
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://opensource.com/sites/default/files/lead-images/life_tree_clouds.png
|
||||
[2]: https://go.roberts.edu/leadingedge/the-great-choices-of-strategic-leaders
|
||||
[3]: http://www.apa.org/research/action/multitask.aspx
|
||||
[4]: https://opensource.com/article/19/3/guide-being-more-productive
|
||||
[5]: https://body-mind-spirit-coach.com/2019/01/02/give-yourself-a-break/
|
||||
[6]: https://imagexmedia.com/mindfullness-over-multitasking
|
||||
[7]: https://events.drupal.org/seattle2019/sessions/mindless-multitasking-dummy%E2%80%99s-guide-productivity
|
||||
[8]: https://events.drupal.org/seattle2019
|
@ -0,0 +1,150 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (Starryi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14557-1.html)
|
||||
[#]: subject: (Watching activity on Linux with watch and tail commands)
|
||||
[#]: via: (https://www.networkworld.com/article/3529891/watching-activity-on-linux-with-watch-and-tail-commands.html)
|
||||
[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
|
||||
|
||||
使用 watch 和 tail 命令监视 Linux 上的活动
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202205/07/091736ja5yt2yottef0kl4.jpg)
|
||||
|
||||
> watch 和 tail 命令可以帮助监视 Linux 系统上的活动。本文介绍了这两个命令的一些有用的使用方法。
|
||||
|
||||
`watch` 和 `tail` 命令为持续监视 Linux 系统上的活动提供了一些有趣的选项。
|
||||
|
||||
也就是说,你可以通过 `watch` 来显示谁已登录,并随着用户登录和注销不断更新,而不是仅仅提出问题并获得答案(例如询问 `who` 并获取当前登录用户的列表)。
|
||||
|
||||
使用 `tail`,你可以显示文件的底部并在添加内容时查看内容。这种监控一般非常有用,并且比定期运行命令所需的工作更少。
|
||||
|
||||
### 使用 watch 命令
|
||||
|
||||
使用 `watch` 的最简单示例之一是使用命令 `watch who`。你会看到一个列表,其中显示了谁登录了,以及他们登录的时间和登录位置。请注意,默认设置是每两秒更新一次显示(左上角),日期和时间(右上角)将按该间隔自行更新。用户列表将随着用户登录和注销而增长和缩小。
|
||||
|
||||
```
|
||||
$ watch who
|
||||
```
|
||||
|
||||
此命令将显示如下所示的登录列表:
|
||||
|
||||
```
|
||||
Every 2.0s: who dragonfly: Thu Feb 27 10:52:00 2020
|
||||
|
||||
nemo pts/0 2020-02-27 08:07 (192.168.0.11)
|
||||
shs pts/1 2020-02-27 10:58 (192.168.0.5)
|
||||
```
|
||||
|
||||
你可以通过添加 `-n` 选项(例如 `-n 10`)来修改更新间的不同秒数,以修改更新间隔,从而获取较少的更新频率。
|
||||
|
||||
```
|
||||
$ watch -n 10 who
|
||||
```
|
||||
|
||||
上述命令将以新的间隔显示,并且显示的时间更新频率较低,从而使显示时间与所选间隔保持一致。
|
||||
|
||||
```
|
||||
Every 10.0s: who dragonfly: Thu Feb 27 11:05:47 2020
|
||||
|
||||
nemo pts/0 2020-02-27 08:07 (192.168.0.11)
|
||||
shs pts/1 2020-02-27 10:58 (192.168.0.5)
|
||||
```
|
||||
|
||||
如果你希望仅查看命令的输出,而不是标题(前 2 行),则可以通过添加 `-t`(无标题)选项来省略这些行。
|
||||
|
||||
```
|
||||
$ watch -t who
|
||||
```
|
||||
|
||||
然后,你的屏幕将显示如下所示:
|
||||
|
||||
```
|
||||
nemo pts/0 2020-02-27 08:07 (192.168.0.11)
|
||||
shs pts/1 2020-02-27 10:58 (192.168.0.5)
|
||||
```
|
||||
|
||||
如果每次运行监视的命令时,输出都是相同的,则只有标题行(如果未省略)会更改。其余显示的信息将保持不变。
|
||||
|
||||
如果你希望 `watch` 命令在它正在监视的命令的输出发生更新后立即退出,则可以使用 `-g`(将其视为“<ruby>离开<rt>go away</rt></ruby>”)选项。例如,如果你只是在等待其他人开始登录系统,则可以选择执行此操作。
|
||||
|
||||
你还可以使用 `-d`(<ruby>差异<rt>differences</rt></ruby>)选项突出显示显示输出中的更改。突出显示只会持续一个间隔(默认为 2 秒),但有助于引起你对更新的注意。
|
||||
|
||||
下面是一个更复杂的示例,该示例使用 `watch` 命令显示正在侦听连接的服务及其使用的端口。虽然输出不太可能更改,但它会提醒你任何新服务正在启动或关闭。
|
||||
|
||||
```
|
||||
$ watch 'sudo lsof -i -P -n | grep LISTEN'
|
||||
```
|
||||
|
||||
值得注意的是,正在运行的命令需要用引号扩起来,以确保不会将 `watch` 命令的输出发送到 `grep` 命令。
|
||||
|
||||
使用 `watch -h` 命令将为你提供命令选项的列表。
|
||||
|
||||
```
|
||||
$ watch -h
|
||||
|
||||
Usage:
|
||||
watch [options] command
|
||||
|
||||
Options:
|
||||
-b, --beep beep if command has a non-zero exit
|
||||
-c, --color interpret ANSI color and style sequences
|
||||
-d, --differences[=<permanent>]
|
||||
highlight changes between updates
|
||||
-e, --errexit exit if command has a non-zero exit
|
||||
-g, --chgexit exit when output from command changes
|
||||
-n, --interval <secs> seconds to wait between updates
|
||||
-p, --precise attempt run command in precise intervals
|
||||
-t, --no-title turn off header
|
||||
-x, --exec pass command to exec instead of "sh -c"
|
||||
|
||||
-h, --help display this help and exit
|
||||
-v, --version output version information and exit
|
||||
```
|
||||
|
||||
### 使用 tail -f
|
||||
|
||||
`tail -f` 命令与 `watch` 有一些相同之处。它也会在添加文件时显示文件的底部和其他内容。你不必一次又一次地运行 `tail` 命令,而是运行一个命令并获得可重复更新显示视图的结果。例如,你可以使用如下命令查看系统日志:
|
||||
|
||||
```
|
||||
$ tail -f /var/log/syslog
|
||||
```
|
||||
|
||||
某些文件(如 `/var/log/wtmp`)不适合这种类型的处理,因为它们的格式不是普通文本文件,但是通过组合 `watch` 和 `tail`,你可以获得类似的结果,如下所示:
|
||||
|
||||
```
|
||||
watch 'who /var/log/wtmp | tail -20'
|
||||
```
|
||||
|
||||
无论有多少用户仍处于登录状态,此命令都将只显示最近的 5 次登录。如果发生其他登录,显示结果将添加一行记录并删除顶行记录。
|
||||
|
||||
```
|
||||
Every 60.0s: who /var/log/wtmp | tail -5 dragonfly: Thu Feb 27 12:46:07 2020
|
||||
|
||||
shs pts/0 2020-02-27 08:07 (192.168.0.5)
|
||||
nemo pts/1 2020-02-27 08:26 (192.168.0.5)
|
||||
shs pts/1 2020-02-27 10:58 (192.168.0.5)
|
||||
nemo pts/1 2020-02-27 11:34 (192.168.0.5)
|
||||
dory pts/1 2020-02-27 12:14 (192.168.0.5)
|
||||
```
|
||||
|
||||
对你有时可能想要监视的信息,无论监视进程、登录名还是系统资源,`watch` 和 `tail -f` 命令都可以提供自动更新视图,从而使监视任务变得更加容易。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.networkworld.com/article/3529891/watching-activity-on-linux-with-watch-and-tail-commands.html
|
||||
|
||||
作者:[Sandra Henry-Stocker][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[Starryi](https://github.com/Starryi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://www.networkworld.com/newsletters/signup.html
|
||||
[2]: https://www.networkworld.com/article/3440100/take-the-intelligent-route-with-consumption-based-storage.html?utm_source=IDG&utm_medium=promotions&utm_campaign=HPE21620&utm_content=sidebar ( Take the Intelligent Route with Consumption-Based Storage)
|
||||
[3]: https://www.facebook.com/NetworkWorld/
|
||||
[4]: https://www.linkedin.com/company/network-world
|
114
published/20200807 A Beginner-s Guide to Open Source.md
Normal file
114
published/20200807 A Beginner-s Guide to Open Source.md
Normal file
@ -0,0 +1,114 @@
|
||||
[#]: subject: "A Beginner's Guide to Open Source"
|
||||
[#]: via: "https://ruthikegah.xyz/a-beginners-guide-to-open-source"
|
||||
[#]: author: "Ruth Ikegah https://hashnode.com/@ikegah_ruth"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "lkxed"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14600-1.html"
|
||||
|
||||
开源新手指南
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202205/16/144822bal5z8ij44s4jcom.jpg)
|
||||
|
||||
作为一名技术人员,你应该时不时会看到“<ruby>开源<rt>Open Source</rt></ruby>”这个词。你有可能在浏览推文、博文时看到过它,也有可能是在学习某一门编程语言或使用某个工具时,看到它的部分介绍写着:这个工具/语言是“开源”的。总之,开源无处不在。
|
||||
|
||||
在本文中,我将介绍下面这三个话题:
|
||||
|
||||
* 什么是开源
|
||||
* 贡献于开源的好处
|
||||
* 如何开始贡献
|
||||
|
||||
### 什么是开源
|
||||
|
||||
开源指的是这样一些软件、项目或社区:它们允许人们修改和分享,因为它们的设计目的就是为了让所有人都能访问。举一个关于菜谱的例子:你可以做你从未发明过的菜,因为发明这个菜谱的人公开了它。大多数时候,你也可以根据自己的口味烹饪,而不会呛到喉咙(开个玩笑)。
|
||||
|
||||
> <ruby>开源软件<rt>Open Source Software</rt></ruby>(OSS)是指源代码可供他人查看、复制、学习、修改或分享的软件。
|
||||
|
||||
下面是开源软件和语言的一些例子:
|
||||
|
||||
* Linux 操作系统
|
||||
* Google 的 Android 操作系统
|
||||
* Firefox 浏览器
|
||||
* VLC 媒体播放器
|
||||
* Python 语言、PHP 语言、MySQL 数据库
|
||||
|
||||
与开源软件相反的是<ruby>专有软件<rt>proprietary software</rt></ruby> / <ruby>闭源软件<rt>closed source software</rt></ruby>,只有软件的创造者才能自由使用,其他人若想使用,就得先获得法律许可才行。例如 Adobe Photoshop、微软 Office 等。
|
||||
|
||||
> 开源不仅限于软件或代码,技术领域的任何人都可以为开源做出贡献(各个角色)。有了开源,就有了透明度、可靠性、灵活性,并允许开放合作。
|
||||
|
||||
### 贡献于开源的好处
|
||||
|
||||
向开源项目或软件做贡献意味着“免费”让该项目变得更好。你应该会问自己,为什么我要关心或向自己强调“免费”呢?如果你是新手,你可以阅读 [Edidiong Asikpo][2] 的故事,她在 [这篇文章][3] 中说明了为什么开源是她成长的催化剂。
|
||||
|
||||
贡献开源的好处有很多,这里是其中一部分:
|
||||
|
||||
* 它能够帮助你提高现有的技能,特别是对于新手而言,因为它允许你边做边学。
|
||||
* 无论身在何处,你都可以与世界各地的优秀科技人士协作或共事。
|
||||
* 你可以公开自己的想法,从而改善软件、项目或社区,让世界变得更美好。
|
||||
* 你可以通过贡献开源来得到大家的认可,或者成为独特或伟大事物的一部分(获得自豪感)。
|
||||
* 它让你有机会成为一个人才济济、活力四射的社区的一分子,你可以从中汲取灵感,并结识志同道合的人。
|
||||
* 你可以因为贡献开源而获得报酬(OoO)!比如你可以参与一些实习,包括 <ruby>[谷歌编程之夏][4]<rt>Google Summer of Code</rt></ruby>、[Outreachy][5]、<ruby>[谷歌文档季][6]<rt>Google Season of Docs</rt></ruby>,以及 Open Collective 的 <ruby>[赏金计划][7]<rt>bounty program</rt></ruby> 等。(LCTT 译注:国内也有类似的开源实习机会,如“开源之夏”。)
|
||||
|
||||
### 如何开始贡献
|
||||
|
||||
我相信你会对上面提到的最后一点感兴趣吧(^o^),那么,你该如何开始为开源软件做贡献呢?
|
||||
|
||||
是时候介绍一下 GitHub 了!
|
||||
|
||||
Github 是开源项目协作的大本营,因此它是一个开始贡献开源的好地方。没听说过 GitHub?没有关系!它提供了文档和指南,很容易就可以上手。不过我还是要提醒你,学习是一个循序渐进的过程,不要太心急喔。
|
||||
|
||||
Github 以公共<ruby>存储库<rt>repositories</rt></ruby>的形式容纳了许多开源项目。对于某个项目,你可以提交一个<ruby>议题<rt>issue</rt></ruby>,来说明你注意到的错误或问题(或进一步提出改进意见),也可以创建一个<ruby>拉取请求<rt>pull request</rt></ruby>(PR),并说明你的更正和改进。
|
||||
|
||||
我不建议你在 GitHub 上搜索项目来开始贡献,这将是相当令人沮丧的。尽管你可以限定项目使用的编程语言来简化搜索过程,但仍然会有一大堆东西出现在你眼前。(LCCT 译注:对于可爱的小萌新来说,这实在是难以承受 >…<。)
|
||||
|
||||
为了更精准地找到适合自己的项目,这里有一些可供开始的途径:
|
||||
|
||||
* [First-timers only][8]:一个很好的资源网站,你可以在上面找到新手友好的开源项目来开始贡献。(设计师朋友,我没有忘记你!你可以查看 [Open Source Design][9] 这个网站,在上面也能找到新手友好的开源设计项目!)
|
||||
* 你可以创建你自己的开源项目,把你美妙的想法变成现实,并允许其他人的合作和贡献。[这里][10] 有关于如何创建开源项目的指南。
|
||||
* 加入一个社区:你可以成为某个社区的成员,这也是传播开源思想的一种方式。你可以在谷歌上搜索当地的开源社区,并积极加入其中。
|
||||
|
||||
最后,我想给出几个有用的提示,供你在贡献开源项目时参考:
|
||||
|
||||
* 在加入之前,先对项目、社区或组织做一些研究;当你在做的时候,针对不清楚的地方提出问题。
|
||||
* 当你加入社区时,尽量积极地介绍自己,并说明你能帮助项目的地方。
|
||||
* **不要**认为自己无法为项目提供任何帮助,停止这种念头!你有很好的想法可以分享!
|
||||
* 在存储库中看看别人提交的议题,(如果有的话)看看你能在哪些方面提供帮助,你可以关注带有“good first issue”、“help-wanted”、“first-timers only”等标签的议题。
|
||||
* 在开始贡献之前,一定要先看一下贡献指南,这样你在贡献时就不会有冲突。
|
||||
|
||||
> 哪怕只是使用一个开源工具也是一种贡献;参加一个开源活动也是一种贡献;做开源项目的志愿者,或者为开源项目提供赞助也是一种贡献。
|
||||
|
||||
我想用非洲开源节的口号来结束:“未来是开放的”,所以快上车吧!
|
||||
|
||||
感谢阅读!
|
||||
|
||||
如果你还有疑问或需要帮助,请在 [这里][11] 联系我,我很乐意和你讨论开源,并帮助你做出首次贡献!
|
||||
|
||||
**LCTT 译注:读了这篇文章,你是不是想要马上投身于开源贡献呢?那么请考虑加入“Linux 中国翻译组(LCTT)”吧!我们有能帮助你快速上手翻译的 [维基][12] ,有热心友爱的 QQ 群,你甚至还能够在我们的官网上获得属于自己的译者专页……心动了吗?那就立刻行动起来吧!阅读 [维基][12] 以了解如何加入我们~**
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://ruthikegah.xyz/a-beginners-guide-to-open-source
|
||||
|
||||
作者:[Ruth Ikegah][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://hashnode.com/@ikegah_ruth
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://ruthikegah.xyz/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1596742204400%2Fk9AJL1oNC.jpeg%3Fw%3D1600%26h%3D840%26fit%3Dcrop%26crop%3Dentropy%26auto%3Dcompress%2Cformat%26format%3Dwebp&w=3840&q=75
|
||||
[2]: https://hashnode.com/@didicodes
|
||||
[3]: https://edidiongasikpo.com/open-source-contributions-a-catalyst-for-growth-b823fc5752b1
|
||||
[4]: https://summerofcode.withgoogle.com
|
||||
[5]: https://www.outreachy.org/
|
||||
[6]: https://developers.google.com/season-of-docs
|
||||
[7]: https://docs.opencollective.com/help/contributing/development/bounties
|
||||
[8]: https://www.firsttimersonly.com/
|
||||
[9]: https://opensourcedesign.net/
|
||||
[10]: https://github.com/Ruth-ikegah/opensource.guide
|
||||
[11]: https://twitter.com/IkegahRuth
|
||||
[12]: https://lctt.github.io/wiki/intro/lctt.html
|
@ -0,0 +1,93 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (hanszhao80)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14599-1.html)
|
||||
[#]: subject: (Explore the night sky with this open source astronomy app)
|
||||
[#]: via: (https://opensource.com/article/21/1/kstars)
|
||||
[#]: author: (Don Watkins https://opensource.com/users/don-watkins)
|
||||
|
||||
使用开源天文应用程序 KStars 探索夜空
|
||||
======
|
||||
|
||||
> 使用 KStars 从你的 Linux 桌面或安卓设备眺望星辰。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202205/16/104339d0u39oiyzugzjf86.jpg)
|
||||
|
||||
我一直对夜空很着迷。当我年轻的时候,唯一可用的参考资料是书籍,它们似乎描绘了一个与我从家里看到的不一样的天空。
|
||||
|
||||
五年多前,我曾介绍过两个开源天文馆应用程序 [Celestia 和 Stellarium][2] 的使用体验。最近,我又了解到一个应用 [KStars][3]。这是一个令人惊叹的开源应用程序,可以帮助儿童(和成人)参与科学和天文学。它的网站上说:
|
||||
|
||||
> “KStars 是一款自由开源的、跨平台的天文学软件。它提供了从地球上的任何位置、任何日期和时间对夜空的一个精确的图形化模拟。可展示包括多达 1 亿颗恒星,13,000 个深空天体,所有 8 个行星,太阳和月亮,以及数千颗彗星,小行星,超新星和卫星。“
|
||||
|
||||
KStars 是 [KDE 教育项目][4] 的一部分。最新版本可用于 Linux、Windows 和 MacOS,它集成了 [StellarSolver][5],这是一个跨平台的 SExtractor 程序,它可以从天文图像构建一个天体目录。
|
||||
|
||||
### 安装 KStars
|
||||
|
||||
KStars 采用 GPL 2.0 协议自由授权。源代码可以在官方的 [KDE GitLab 实例][6] 查看(这是 GitHub 的一个只读镜像)。KDE 教育项目有着优秀的 [安装文档][7]。
|
||||
|
||||
我用的系统是 [Pop!_OS][8],可以在 Pop!_Shop 找到这款应用程序。
|
||||
|
||||
可以从你的发行版的软件存储库中找到 KStars 在 Linux 上安装。而在安卓设备上,可以从 [Google Play 商店][9] 下载适配安卓的 KStars Lite。KDE 项目维护了一份优秀的 [KStars 手册][10] 来帮助用户。
|
||||
|
||||
### 使用 KStars
|
||||
|
||||
安装完后,从你的“<ruby>应用<rt>Applications</rt></ruby>”菜单启动程序。启动向导会指导你完成初始化设置。
|
||||
|
||||
![KStars 启动向导][11]
|
||||
|
||||
这些指示很容易理解。向导会提示设置你住所的位置。不幸的是,我所在的小村庄不在列表里,但附近一个更大的社区在里面。
|
||||
|
||||
![KStars 位置设置][13]
|
||||
|
||||
你还可以下载该程序的其他数据和额外功能。
|
||||
|
||||
![KStars 扩展][14]
|
||||
|
||||
这里有很多可用的选项。我选择“<ruby>在详细信息窗口中显示常见图像<rt>Common images displayed in the detail window</rt></ruby>”。
|
||||
|
||||
一旦完成设置,KStars 会呈现一张基于你的位置的夜空图。
|
||||
|
||||
![KStars 夜空显示][15]
|
||||
|
||||
左上角显示了当前时区(这张图里是 2020 年 11 月 30 日傍晚 5 点 58 分)。
|
||||
|
||||
使用鼠标左键,可以向左、向右、向上和向下移动显示。你可以使用鼠标滚轮进行放大和缩小。将鼠标光标放在天体上并右键单击可查看当前天体的描述。
|
||||
|
||||
![KStars 天体描述][16]
|
||||
|
||||
### 参与
|
||||
|
||||
KStars 正在积极寻求错误报告、天文学知识、代码、翻译等方面的帮助。主要开发者和维护者是 [Jasem Mutlaq][17]。如果你愿意贡献一份力量,请访问 [项目网站][18] 或加入邮件列表以了解更多信息。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/1/kstars
|
||||
|
||||
作者:[Don Watkins][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[hanszhao80](https://github.com/hanszhao80)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/don-watkins
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/osdc_520x292_opensourcestars.png?itok=hnrMETFh (Open source stars.)
|
||||
[2]: https://opensource.com/education/15/7/open-source-apps-explore-night-sky
|
||||
[3]: https://edu.kde.org/kstars/
|
||||
[4]: https://edu.kde.org/
|
||||
[5]: https://github.com/rlancaste/stellarsolver
|
||||
[6]: https://invent.kde.org/education/kstars
|
||||
[7]: https://edu.kde.org/kstars/install.php
|
||||
[8]: https://pop.system76.com/
|
||||
[9]: https://play.google.com/store/apps/details?id=org.kde.kstars.lite&hl=en
|
||||
[10]: https://docs.kde.org/trunk5/en/extragear-edu/kstars/index.html
|
||||
[11]: https://opensource.com/sites/default/files/uploads/kstars_startupwizard.png (KStars Startup Wizard)
|
||||
[12]: https://creativecommons.org/licenses/by-sa/4.0/
|
||||
[13]: https://opensource.com/sites/default/files/uploads/kstars_setlocation.png (KStars location setup)
|
||||
[14]: https://opensource.com/sites/default/files/uploads/kstars_addons.png (KStars add-ons)
|
||||
[15]: https://opensource.com/sites/default/files/uploads/kstars_sky.png (KStars night sky display)
|
||||
[16]: https://opensource.com/sites/default/files/uploads/kstars_objectdescription.png (KStars describes objects)
|
||||
[17]: https://github.com/knro
|
||||
[18]: https://edu.kde.org/kstars
|
@ -0,0 +1,242 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (TravinDreek)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14529-1.html)
|
||||
[#]: subject: (9 Decentralized, P2P and Open Source Alternatives to Mainstream Social Media Platforms Like Twitter, Facebook, YouTube and Reddit)
|
||||
[#]: via: (https://itsfoss.com/mainstream-social-media-alternaives/)
|
||||
[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
|
||||
|
||||
9 个去中心化、端到端、开源的主流社交媒体平台替代品
|
||||
======
|
||||
|
||||
你多半知道,Facebook 因可能从它的“端到端加密”的聊天服务 WhatsApp 那里共享用户数据而 [遭到抨击][1]。
|
||||
|
||||
这些有争议的隐私政策变化使无数人转而使用 WhatsApp 替代品。
|
||||
|
||||
注重隐私的人们,早就料到了会有这事。毕竟,[Facebook 可是花了 190 亿美元收购了 WhatsApp 这样的手机应用][2],而当时靠它还赚不到什么钱。现在,Facebook 该回本了 —— 回那之前投进去的 190 亿美元的本。他们可能打算把你的数据共享给广告商,这样的话,你看到的广告就会更加个性化(侵入性)了。
|
||||
|
||||
要是你受够了 Facebook、Google、Twitter 等科技公司的“我说了算”的态度,那你应该试试一些社交媒体平台的替代品。
|
||||
|
||||
这些社交平台的替代品都是开源的,它们都用了端到端或区块链技术来实现去中心化,而且你可能能够自己托管其中一些平台。
|
||||
|
||||
### 开源和去中心化的社交网络
|
||||
|
||||
![Image Credit: Datonel on DeviantArt][3]
|
||||
|
||||
先说句实话,这些替代平台的体验,可能会和你惯用平台的体验有所差异,但这些平台是不会侵犯你的隐私和言论自由的。这就是一种权衡。
|
||||
|
||||
#### 1、Minds
|
||||
|
||||
- 用于替代:Facebook 和 YouTube
|
||||
- 特点:代码开源、区块链
|
||||
- 自托管:否
|
||||
|
||||
在 Minds 上,你可以发视频、博客、图片,并设置当前状态。你也能向群聊,或者直接向好友,安全地发送消息或者进行视频聊天。通过热门内容和话题,你可以发现你感兴趣的文章。
|
||||
|
||||
还不止这些。你还能通过做贡献来赚取代币,这些代币可以用来升级你的频道。创作者可以从粉丝那里直接得到美元、比特币和以太坊的支付。
|
||||
|
||||
> **[Minds][4]**
|
||||
|
||||
#### 2、Aether
|
||||
|
||||
- 用于替代:Reddit
|
||||
- 特点:开源、端到端
|
||||
- 自托管:否
|
||||
|
||||
![][5]
|
||||
|
||||
Aether 是一个开源、端到端的平台,用于创建自我管理的社区,并可以审查管理记录以及选举版主。
|
||||
|
||||
Aether 上的内容,具有存在时间短的性质,并且内容只会留存六个月,除非有人把它保存下来。因为它是端到端的,所以中心服务器不复存在。
|
||||
|
||||
Aether 有趣的一点在于它的民主社区。社区可以选举版主,也能投票弹劾版主。
|
||||
|
||||
> **[Aether][6]**
|
||||
|
||||
#### 3、Mastodon
|
||||
|
||||
- 用于替代:Twitter
|
||||
- 特点:开源、去中心化
|
||||
- 自托管:是
|
||||
|
||||
![][7]
|
||||
|
||||
在自由开源软件爱好者中,[Mastodon][8] 已经很有名了。我们之前报道过 [Twitter 的开源替代品 Mastodon][9],并且 [你也可以在 Mastodon 上关注我们][10]。
|
||||
|
||||
Mastdon 并不像 Twitter 那样是一个单一网站,它是个由数千个社区组成的网络,这些社区都由不同的组织和个人运营,并且都提供无缝的社交媒体体验。这被称之为“Fediverse”。
|
||||
|
||||
你可以托管自己的 Mastodon 实例,并选择将其连接到其他 Mastodon 实例,或者直接加入一个已有的 Mastodon 实例,比如说 [Mastodon Social][11]。
|
||||
|
||||
> **[Mastodon][8]**
|
||||
|
||||
#### 4、LBRY
|
||||
|
||||
- 用于替代:YouTube
|
||||
- 特点:开源、去中心化、区块链
|
||||
- 自托管:否
|
||||
|
||||
![][12]
|
||||
|
||||
[LBRY][13] 的核心是一个基于区块链的去中心化协议。协议顶层,便是由其加密货币驱动的数字市场。
|
||||
|
||||
通过 LBRY,创作者可以提供多种数字化内容,例如影片、书籍和游戏。基本上,它是作为 YouTube 的替代而受到推崇的。你可以在 Odysee 上访问这个视频共享平台。
|
||||
|
||||
我们之前 [报道过 LBRY][14],你可以去读那篇文章了解详情。
|
||||
|
||||
> **[LBRY][15]**
|
||||
|
||||
|
||||
#### 5、Pixelfed
|
||||
|
||||
- 用于替代:Instagram
|
||||
- 特点:去中心化、区块链
|
||||
- 自托管:否
|
||||
|
||||
![][31]
|
||||
|
||||
Pixelfed 和 Mastodon 使用了相同的底层开放协议,即 ActivityPub。
|
||||
|
||||
因此,你也可以通过 Pixelfed 与 Mastodon 的实例进行互动。我还没有试过,但从理论上讲,你应该可以做到这一点。你应该找到几个活跃的 Pixelfed 实例来注册。
|
||||
|
||||
如果你想控制你的数据和隐私,Pixelfed 是 Instagram 的一个简单替代品。你可以控制你的图片的隐私,在平台上没有任何广告。
|
||||
|
||||
你可以得到与照片分享平台基本相同的功能。然而,它没有驱动时间线的算法,遵循时间顺序,不收集你的任何数据,以获得个性化的体验。
|
||||
|
||||
> **[Pixelfed][32]**
|
||||
|
||||
#### 6、Peertube
|
||||
|
||||
- 用于替代:YouTube
|
||||
- 特点:去中心化、端到端
|
||||
- 自托管:否
|
||||
|
||||
![][19]
|
||||
|
||||
PeerTube 由法国公司 Framasoft 开发,它是一个去中心化的视频平台。PeerTube 使用了 [BitTorrent 协议][20] 以在用户之间共享宽带。
|
||||
|
||||
PeerTube 旨在抵制企业的垄断,它不依靠广告,并且也不会追踪你。不过要注意,你的 IP 地址在这里不是匿名的。
|
||||
|
||||
目前有许多 PeerTube 的实例,你可以在那里托管你的视频。有些实例需要付费,不过大多数都是免费的。
|
||||
|
||||
> **[PeerTube][21]**
|
||||
|
||||
#### 7、Diaspora
|
||||
|
||||
- 用于替代:Facebook
|
||||
- 特点:去中心化、开源
|
||||
- 自托管:是
|
||||
|
||||
Diaspora 是最早的去中心化社交网络之一。最早可以追溯到 2010 年,当时 Diaspora 就作为 Facebook 的替代品而受到吹捧。最初几年,它确实得到了一些应得的关注,但它只在小众范围内得到了使用。
|
||||
|
||||
和 Mastodon 类似,Diaspora 由许多“<ruby>豆荚<rt>pod</rt></ruby>” (节点服务器)组成。你可以在一个“豆荚”上注册,或者托管你自己的“豆荚”。科技公司无法拥有你的数据,只有你可以。
|
||||
|
||||
> **[Diaspora][22]**
|
||||
|
||||
#### 8、Dtube
|
||||
|
||||
- 用于替代:YouTube
|
||||
- 特点:去中心化、区块链
|
||||
- 自托管:否
|
||||
|
||||
![][23]
|
||||
|
||||
Dtube 是一个基于区块链的去中心化 YouTube 复制品。之所以说它是 YouTube 复制品,是因为它界面太像 YouTube 了。
|
||||
|
||||
Dtube 像其他基于区块链的社交媒体一样,是由 DTube 币(DTC)驱动的。每当有人观看创作者的视频或者与之互动,创作者就会获得 DTC。这些硬币可以用于推广内容,或者通过合作的加密货币交换方来提现。
|
||||
|
||||
> **[DTube][24]**
|
||||
|
||||
#### 9、Signal
|
||||
|
||||
用于替代:WhatsApp、Facebook Messenger
|
||||
特点:开源
|
||||
自托管:否
|
||||
|
||||
![][25]
|
||||
|
||||
与端到端加密的 WhatsApp 聊天不同,Signal 不会跟踪你,不会共享你的数据,也不会侵犯你的隐私。
|
||||
|
||||
[Signal 一举成名][26],是在它得到 Edward Snowden 的认可之时。而当 WhatsApp 开始与 Facebook 共享数据时,Elon Musk 又发了关于 Signal 的推文,这便让 Signal 更受瞩目了。
|
||||
|
||||
Signal 使用了自己的开源 Signal 协议,以提供端到端加密的消息和通话服务。
|
||||
|
||||
> **[Signal][28]**
|
||||
|
||||
#### KARMA(已终止)
|
||||
|
||||
- 用于替代:Instagram
|
||||
- 特点:去中心化、区块链
|
||||
- 自托管:否
|
||||
|
||||
![][16]
|
||||
|
||||
这也是一个基于区块链的社交网络,由加密货币驱动。
|
||||
|
||||
KARMA 是 Instagram 的一个复制品,它构建于开源区块链平台 [EOSIO][17] 之上。每当你的内容获得了点赞和分享,你就会得到 KARMA 代币。你可以用这些代币来推广你的内容,或者通过一个合作的加密货币交换方,来将其转换为现实货币。
|
||||
|
||||
KARMA 只能在手机上使用,可以在 Play Store 及 App Store 上获取。
|
||||
|
||||
> **[KARMA][18]**
|
||||
|
||||
#### 还有别的吗?
|
||||
|
||||
还有一些其他的服务,它们虽然不是开源或者去中心化的,但也尊重你的隐私与言论自由。
|
||||
|
||||
* [MeWe][29]:Facebook 替代品
|
||||
* [Voice][30]:NFT 为数字艺术家赋能
|
||||
* [ProtonMail][33]:Gmail 替代品
|
||||
|
||||
还有一个基于 Matrix 协议的 [Element 聊天工具][34],你也可以试试。
|
||||
|
||||
我知道,应该还有几个别的社交媒体平台的替代品。也想分享一下?我可能会把他们加到列表中来。
|
||||
|
||||
要是你也得在这个列表中选一个平台,你想选哪个呢?
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/mainstream-social-media-alternaives/
|
||||
|
||||
作者:[Abhishek Prakash][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[Peaksol](https://github.com/TravinDreek)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/abhishek/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://arstechnica.com/tech-policy/2021/01/whatsapp-users-must-share-their-data-with-facebook-or-stop-using-the-app/
|
||||
[2]: https://money.cnn.com/2014/02/19/technology/social/facebook-whatsapp/index.html
|
||||
[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/1984-quote.png?resize=800%2C450&ssl=1
|
||||
[4]: https://www.minds.com/
|
||||
[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/aether-reddit-alternative.png?resize=800%2C600&ssl=1
|
||||
[6]: https://getaether.net
|
||||
[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/mastodon.png?resize=800%2C623&ssl=1
|
||||
[8]: https://joinmastodon.org/
|
||||
[9]: https://itsfoss.com/mastodon-open-source-alternative-twitter/
|
||||
[10]: https://mastodon.social/@itsfoss
|
||||
[11]: https://mastodon.social
|
||||
[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/lbry-interface.jpg?resize=800%2C420&ssl=1
|
||||
[13]: https://lbry.org
|
||||
[14]: https://itsfoss.com/lbry/
|
||||
[15]: https://lbry.tv/$/invite/@itsfoss:0
|
||||
[16]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/karma-app.jpg?resize=800%2C431&ssl=1
|
||||
[17]: https://eos.io
|
||||
[18]: https://karmaapp.io
|
||||
[19]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/peertube-federation-multiplicity.jpg?resize=600%2C341&ssl=1
|
||||
[20]: https://www.slashroot.in/what-bittorrent-protocol-and-how-does-bittorrent-protocol-work
|
||||
[21]: https://joinpeertube.org
|
||||
[22]: https://diasporafoundation.org
|
||||
[23]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/dtube.jpg?resize=800%2C516&ssl=1
|
||||
[24]: https://d.tube
|
||||
[25]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/12/signal-shot.jpg?resize=800%2C565&ssl=1
|
||||
[26]: https://itsfoss.com/signal-messaging-app/
|
||||
[27]: https://www.britannica.com/biography/Elon-Musk
|
||||
[28]: https://www.signal.org
|
||||
[29]: https://mewe.com
|
||||
[30]: https://www.voice.com
|
||||
[31]: https://itsfoss.com/wp-content/uploads/2022/04/pixelfed-decentralized.jpg
|
||||
[32]: https://pixelfed.org/
|
||||
[33]: https://itsfoss.com/recommends/protonmail/
|
||||
[34]: https://itsfoss.com/element/
|
94
published/20210112 8 tips for the Linux command line.md
Normal file
94
published/20210112 8 tips for the Linux command line.md
Normal file
@ -0,0 +1,94 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (FYJNEVERFOLLOWS)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14570-1.html)
|
||||
[#]: subject: (8 tips for the Linux command line)
|
||||
[#]: via: (https://opensource.com/article/21/1/linux-commands)
|
||||
[#]: author: (Jim Hall https://opensource.com/users/jim-hall)
|
||||
|
||||
分享 8 篇使用 Linux 命令行的技巧
|
||||
======
|
||||
|
||||
> 要好好利用无所不能的 Linux 命令行提供的所有功能
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202205/10/084827v23ia3wlkdirr6r5.jpg)
|
||||
|
||||
Linux 命令行是极其灵活的。无论你是管理服务器还是在桌面系统上启动终端窗口,都可以通过命令行无所不包的工具包来更新文件、调整系统性能或者管理进程。命令行里发生的事情是非常有趣的。
|
||||
|
||||
我们发布了许多关于如何充分利用系统的优秀文章,证明了命令行的流行。以下是 8 篇关于 Linux 命令阅读量最高的文章:
|
||||
|
||||
### 《使用这些技巧让 Bash 命令历史更加有用》
|
||||
|
||||
> **[文章地址][2]**
|
||||
|
||||
Bash 是大多数 Linux 系统上的默认命令行 Shell。Seth Kenlon 编写了该指南,用于帮助你了解 Bash 命令历史。修改 Bash 命令历史通常没有听起来那么危险,特别是当你带有目的地修改它的时候。告诉 Bash 你希望它记住什么,甚至还可以直接通过删除你不想要或不需要的条目来重写命令历史。根据需要使用你的历史会话,明智地行使你对命令历史的权力。
|
||||
|
||||
### 《如何在 Linux 终端中兼顾特性和性能》
|
||||
|
||||
> **[文章地址][3]**
|
||||
|
||||
Ricardo Gerardi 非常喜欢命令行应用程序,他花了很多时间在终端上工作。Ricardo 投入了一些时间,把命令行变成了一个令人愉快的工作环境。你可以通过了解如何自定义终端应用程序、主题和提示符,来创建一个功能丰富、易于使用系统资源的终端。
|
||||
|
||||
### 《放弃 Bash 转投拥有更优美配置的 fish》
|
||||
|
||||
> **[文章地址][4]**
|
||||
|
||||
Matt Broberg 最近放弃了默认的命令行解释器 —— Bash,转而支持 fish。fish 自豪地宣称自己是 “90 年代的命令行 shell”。这个以鱼为主题的 “友好的交互式 shell” 为命令行创造了更愉快的体验。阅读 Matt 的文章来进一步了解如何充分利用 fish。如果你不想再对你的终端修修补补,换一个更漂亮的默认 shell,把更多精力放在代码上,不妨试一试 fish。
|
||||
|
||||
### 《分析 Linux 里二进制文件的 10 种方式》
|
||||
|
||||
> **[文章地址][5]**
|
||||
|
||||
我们每天都在和二进制文件打交道,但我们对它们的了解甚少。Linux 提供了一组丰富的工具,使分析二进制文件变得轻而易举!这些简单的命令和工具可以帮助你顺利完成分析二进制文件的任务。无论你的工作角色是什么,了解这些工具的基本知识将帮助你更好地了解你的 Linux 系统。Gaurav Kamathe 介绍了一些最流行的用于管理二进制文件的 Linux 工具和命令,包括 `file`、`nm`、`strings` 和 `hexdump`。
|
||||
|
||||
### 《可用于 Linux 命令行的 4 种 Markdown 工具》
|
||||
|
||||
> **[文章地址][6]**
|
||||
|
||||
当涉及使用 Markdown 格式的文件时,命令行工具占据了主导地位。它们轻巧、快速、强大而又灵活,其中大多数遵循 Unix “把一件事情做好”的哲学。Scott Nesbitt 回顾了 4 种命令行实用工具,它们可以帮助你更高效地处理 Markdown 文件。
|
||||
|
||||
### 《禁用 atime 来提高 Linux 系统性能》
|
||||
|
||||
> **[文章地址][7]**
|
||||
|
||||
每当我在为家里的电脑升级 Linux 时,我都会把我通常要做的任务列出来。这些年来,它们已经成为了习惯:备份文件、还原系统、重新安装、恢复文件,然后重新安装额外的我最喜欢的应用程序。我还会对系统进行了一些调整。其中一个调整就是 `atime`,它是 Linux 里每个文件的三个时间戳之一。关掉 `atime` 是一种简单但有效的提升系统性能的方法。下面是关于 `atime` 的介绍,以及为什么它会有影响。
|
||||
|
||||
### 《使用 fstrim 延长固态硬盘的寿命》
|
||||
|
||||
> **[文章地址][8]**
|
||||
|
||||
在过去的十年中,固态硬盘(SSD)带来了一种全新的管理存储的方式。相比传统的机械硬盘,固态硬盘具有一些优点,比如安静、更酷的操作和更快的接口规格。当然,新技术带来了新的维护和管理方法。Alan Formy-Duval 写了一个新的 systemd 服务让你更容易管理固态硬盘。
|
||||
|
||||
### 《Linux 命令行工具的 5 种新式替代品》
|
||||
|
||||
> **[文章地址][9]**
|
||||
|
||||
在我们日常使用的 Linux 或 Unix 系统中,我们会使用许多命令行工具来完成我们的工作,并帮助我们更好地了解和管理我们的系统。多年来,这些工具已经现代化并移植到了不同的系统中。然而,总的来讲,它们仍然保持着最初的想法、外观和感觉。近年来,开源社区已经开发出了提供额外好处的替代工具。Ricardo Gerardi 向我们展示了如何通过这 5 种新的替代品改进旧的命令行工具来获得新的好处。
|
||||
|
||||
### 总结
|
||||
|
||||
把这些文章作为跳板,寻找你自己关于命令行的技巧和花招吧!这份清单里还缺少什么吗?请在下方评论,或者提交一篇你自己的文章!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/1/linux-commands
|
||||
|
||||
作者:[Jim Hall][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/jim-hall
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/terminal_command_linux_desktop_code.jpg?itok=p5sQ6ODE (Terminal command prompt on orange background)
|
||||
[2]: https://linux.cn/article-12344-1.html
|
||||
[3]: https://opensource.com/article/20/7/performance-linux-terminal
|
||||
[4]: https://opensource.com/article/20/3/fish-shell
|
||||
[5]: https://linux.cn/article-12187-1.html
|
||||
[6]: https://linux.cn/article-12048-1.html
|
||||
[7]: https://opensource.com/article/20/6/linux-noatime
|
||||
[8]: https://linux.cn/article-11959-1.html
|
||||
[9]: https://opensource.com/article/20/6/modern-linux-command-line-tools
|
316
published/20210122 Convert your filesystem to Btrfs.md
Normal file
316
published/20210122 Convert your filesystem to Btrfs.md
Normal file
@ -0,0 +1,316 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (hwlife)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14577-1.html)
|
||||
[#]: subject: (Convert your filesystem to Btrfs)
|
||||
[#]: via: (https://fedoramagazine.org/convert-your-filesystem-to-btrfs/)
|
||||
[#]: author: (Gergely Gombos https://fedoramagazine.org/author/gombosg/)
|
||||
|
||||
如何将你的文件系统转换为 Btrfs
|
||||
======
|
||||
|
||||
![][1]
|
||||
|
||||
### 引言
|
||||
|
||||
这篇概述文章将告诉你为何以及如何迁移你的当前分区到 Btrfs 文件系统。如果你对此感兴趣,请阅读这篇分步指南来完成。
|
||||
|
||||
从 Fedora 33 开始,新安装的 Fedora 操作系统默认文件系统为 Btrfs。我确信大部分用户现在已经听说了它的优势:写时复制、内置校验、灵活的压缩方式、简易的快照和回滚方式。它确实是一个现代化的文件系统,为桌面存储带来新的功能。
|
||||
|
||||
在升级到 Fedora 33 后,我想利用 Btrfs 的优势,但对我个人来说,我不想因为“只是为了改变文件系统”而去重装整个系统。我发现(只有)寥寥无几的具体如何做转换的教程,所以我决定在这里分享我的详细经验。
|
||||
|
||||
### 小心!
|
||||
|
||||
这样做你是在玩火。希望你阅读以下内容时不要感到惊讶:
|
||||
|
||||
> 在编辑分区和转换文件系统时,你的数据可能会被破坏和丢失。最终,你可能会得到一个不能启动的操作系统,并面临数据恢复的风险。你可能会无意删除你的分区,或者以其它方式破坏了你的操作系统。
|
||||
|
||||
这些转换过程即使对于生产系统来说也是安全的 —— 前提是你提前做好了计划,对关键数据做好了备份和回滚计划。作为一个 _可以执行超级权限的系统管理员_,你可以在没有限制、没有任何常规安全防护措施的情况下,做任何事情。
|
||||
|
||||
### 安全的方式:重装 Fedora
|
||||
|
||||
重装操作系统是转换文件系统到 Btrfs 的 “官方” 方式,推荐给大多数用户使用。因此,如果在这个教程中有那么一点不确定,就选择这种方式。步骤大致如下:
|
||||
|
||||
1. 备份你的主文件夹和你系统中可能会用到的任何数据,比如 `/etc`。(编者按:虚拟机也是这样)
|
||||
2. 将已安装的安装包以列表形式保存到到文件中。
|
||||
3. 重新安装 Fedora,删除你当前的分区,并选择新的 Btrfs 默认分区方案。
|
||||
4. 恢复主文件夹的内容,并使用软件包列表文件重装软件包。
|
||||
|
||||
对于详细的步骤和命令,请看一位社区用户在 [ask.fedoraproject.org][2] 站点的评论。如果正确完成,你将得到一个和之前一样的操作系统,使丢失数据的风险最小化。
|
||||
|
||||
### 转换的利弊
|
||||
|
||||
让我们快速澄清一下:这种文件系统转换有什么优势和劣势?
|
||||
|
||||
**优势:**
|
||||
|
||||
* 当然,不需要重新安装!你的系统里的所有文件和之前一模一样。
|
||||
* 技术上来说,没有备份的情况下,就地进行是可能的。
|
||||
* 你会学到许多关于 Btrfs 的知识!
|
||||
* 如果所有都按计划进行,会是相当快的一个过程。
|
||||
|
||||
**劣势:**
|
||||
|
||||
* 你必须熟悉终端环境和 shell 命令。
|
||||
* 你可能会丢失数据,参见上文。
|
||||
* 如果出了什么问题,你得自己解决。
|
||||
|
||||
**特别之处:**
|
||||
|
||||
* 你需要大约 20% 的可用磁盘空间才能成功转换。但对于完整的备份和重装方式,你可能需要的空间更多。
|
||||
* 你可以在转换过程中自定义你分区的所有参数,但如果选择重装,你也可以从 Anaconda 自定义。
|
||||
|
||||
### LVM 怎么办?
|
||||
|
||||
在近期几次 Fedora 安装中,LVM 布局一直是默认的。如果你有一个带有多个分区(例如 `/` 和 `/home`)的 LVM 分区布局,你得以某种方式合并它们,来获得 Btrfs 所有性能。
|
||||
|
||||
如果选择这样做,你可以单独转换分区到 Btrfs 文件系统,同时保留卷组。然而,迁移到 Btrfs 文件系统的优势之一是摆脱 LVM 分区布局强加的限制。你也可以利用 Btrfs 文件系统提供的收发功能在转换后来合并分区。
|
||||
|
||||
> 另见 《Fedora 杂志》: [利用 LVM 回收硬盘空间][3]、[从 Btrfs 快照中恢复文件][4] 以及 [在 Btrfs 和 LVM-ext4 两者之间做选择][5]。
|
||||
|
||||
### 了解 Btrfs
|
||||
|
||||
建议阅读以下内容对 Btrfs 文件系统是什么有一个基础的了解。如果你没有把握,只有选择重装 Fedora 这种安全的方式。
|
||||
|
||||
必须了解的:
|
||||
|
||||
* [Fedora Magazine:Btrfs 来到 Fedora 33][6]
|
||||
* [Btrfs 系统管理指南][7], _尤其是_ 关于子卷和 flat 子卷布局。
|
||||
* [btrfs-convert 指南][8]
|
||||
|
||||
有用的资源:
|
||||
|
||||
* [man 8 btrfs][9] – 命令行界面
|
||||
* [man 5 btrfs][10] – 挂载参数
|
||||
* [man btrfs-convert][11] – 要用到的转换工具
|
||||
* [man btrfs-subvolume][12] – 管理子卷
|
||||
|
||||
### 转换步骤
|
||||
|
||||
#### 创建一个实时镜像
|
||||
|
||||
由于不能转换已挂载的文件系统,我们将通过 Fedora <ruby>实时镜像<rt>Live Image</rt></ruby>进行。安装 [Fedora 镜像写入工具][13],然后 “烧录” Fedora 33 到你的 U 盘中来创建实时镜像。
|
||||
|
||||
#### 释放磁盘空间
|
||||
|
||||
`btrfs-convert` 会在分区的剩余空间重新创建文件系统的元数据,同时保持所有已有的 ext4 文件系统数据还在它当前的位置上。
|
||||
|
||||
不幸的是,所需的剩余空间的大小无法提前知道:如果没有足够的空间,转换将会失败(但不会破坏数据)。这里有一些释放空间有用的方法:
|
||||
|
||||
* 利用 `baobab` 来识别大容量的文件和文件夹,然后移除。如果可能的话,不要手动删除主文件夹以外的文件。
|
||||
* 清理旧的系统日志:`journalctl –vacuum-size=100M`。
|
||||
* 如果你正使用 Docker,请小心地使用类似 `docker volume prune`、`docker image prune -a` 这样的工具。
|
||||
* 清理 GNOME Boxes 之类的虚拟机内不用的镜像。
|
||||
* 清理不用的软件包和 Flatpak 包:`dnf autoremove`、`flatpak remove –unused`。
|
||||
* 清理软件包缓存:`pkcon refresh force -c -1`、`dnf clean all`。
|
||||
* 如果你有把握,你可以谨慎的清理 `~/.cache` 文件夹。
|
||||
|
||||
#### 转换到 Btrfs
|
||||
|
||||
备份你所有有价值的数据,确保你的系统已完全更新,然后重启到实时镜像。运行 `gnome-disks` 工具找到你所拥有的设备的路径,比如 `/dev/sda1`(如果你在使用 LVM,它可能看起来有所不同)。检查文件系统然后执行转换:(编者按:以下命令使用 root 用户运行,谨慎使用!)
|
||||
|
||||
```
|
||||
$ sudo su -
|
||||
# fsck.ext4 -fyv /dev/sdXX (请替换为你的具体的设备路径)
|
||||
# man btrfs-convert (阅读它)
|
||||
# btrfs-convert /dev/sdXX (请替换为你的具体的设备路径)
|
||||
```
|
||||
|
||||
这将会花十几分钟甚至几个小时,依据分区的大小和是机械硬盘还是固态硬盘。如果你看到错误,你可能需要更多剩余空间。作为最后的手段,你可以尝试 `btrfs-convert -n`。
|
||||
|
||||
#### 怎样回滚?
|
||||
|
||||
如果因为某些原因转换失败,你的分区将保持在 ext4 文件系统或者它之前的状态。如果你想在成功转换之后回滚,简单如下:
|
||||
|
||||
```
|
||||
# btrfs-convert -r /dev/sdXX
|
||||
```
|
||||
|
||||
> **警告!** 如果你做了以下这些事情之一,你将永久失去回滚的功能:碎片整理、均衡或者删除 `ext2_saved` 子卷。
|
||||
|
||||
由于 Btrfs 文件系统的写时复制特性,你可以安全的复制/移动甚至删除文件、创建子卷,因为 `ext2_saved` 会保持引用旧数据。
|
||||
|
||||
#### 挂载和检查
|
||||
|
||||
现在这个分区应该已经有了 Btrfs 文件系统。挂载它然后查看你的文件……和子卷!
|
||||
|
||||
```
|
||||
# mount /dev/sdXX /mnt (请替换为你的具体的设备路径)
|
||||
# man btrfs-subvolume (阅读它)
|
||||
# btrfs subvolume list / (使用 -t 以表格方式查看)
|
||||
```
|
||||
|
||||
因为你已经阅读了 [相关的手册页][14],你应该知道创建子卷快照是安全的,并且有 `ext2-saved` 子卷作为你之前数据的简易备份。
|
||||
|
||||
> 是时候阅读 [Btrfs 系统管理指南][7]了,这样你就不会把常规文件夹和子卷混淆了。
|
||||
|
||||
#### 创建子卷
|
||||
|
||||
我们希望实现一个“扁平”子卷布局,这和 Anaconda 默认创建的布局相同:
|
||||
|
||||
```
|
||||
toplevel (卷根目录,不能被默认挂载)
|
||||
+-- root (子卷根目录,被挂载到 /)
|
||||
+-- home (子卷根目录,被挂载到 /home)
|
||||
```
|
||||
|
||||
你可以跳过这个步骤,或者使用一个不同的布局。这种特殊结构的优势是你可以轻松的创建 `/home` 的快照,并且对每个子卷使用不同的压缩和挂载参数。
|
||||
|
||||
```
|
||||
# cd /mnt
|
||||
# btrfs subvolume snapshot ./ ./root2
|
||||
# btrfs subvolume create home2
|
||||
# cp -a home/* home2/
|
||||
```
|
||||
|
||||
这里我们已经创建了两个子卷。`root2` 是一个完整的分区快照,而 `home2` 开始是一个空子卷,然后我们往里复制内容。(这个 `cp` 命令不会重复数据,所以会很快。)
|
||||
|
||||
* 在 `/mnt` 目录(顶层子卷),删除除了 `root2`、`home2` 和 `ext2_saved` 之外的所有内容。
|
||||
* 重命名 `root2` 和 `home2` 子卷为 `root` 和 `home`。
|
||||
* 在 `root` 子卷里,清空 `home` 目录,以便之后我们能够挂载 `home` 子卷。
|
||||
|
||||
如果都做对了,那就很简单了!
|
||||
|
||||
#### 修改 fstab 分区表
|
||||
|
||||
为了重启之后挂载新卷,必须要修改 `fstab`,用新的行来代替旧的 ext4 文件系统挂载行。
|
||||
|
||||
你可以使用 `blkid` 命令来找到你的分区的 UUID。
|
||||
|
||||
```
|
||||
UUID=xx / btrfs subvol=root 0 0 (请替换为你的具体 UUID)
|
||||
UUID=xx /home btrfs subvol=home 0 0 (请替换为你的具体 UUID)
|
||||
```
|
||||
|
||||
(注意如果指向的是同一个分区,那么这两个 UUID 是相同的。)
|
||||
|
||||
这些都是新安装的 Fedora 33 的默认值。在 `fstab` 中,你也可以选择自定义压缩和添加类似 `noatime` 这样的参数。
|
||||
|
||||
> 可以查看 [关于压缩参数的维基页面][15] 和 [man 5 btrfs][10] 了解所有相关的参数。
|
||||
|
||||
#### chroot 到系统
|
||||
|
||||
如果你曾经做过系统恢复,我想你肯定知道这些命令。这里,我们将得到一个 _基本上_ 在你系统里的 shell 提示符,可以访问网络。
|
||||
|
||||
首先,我们必须重新挂载 `root` 子卷到 `/mnt` 目录,然后挂载 `/boot` 和 `/boot/efi` 分区(它们可能有所不同,这取决于你的文件系统布局):
|
||||
|
||||
```
|
||||
# umount /mnt
|
||||
# mount -o subvol=root /dev/sdXX /mnt (请替换为你的具体的设备路径)
|
||||
# mount /dev/sdXX /mnt/boot (请替换为你的具体的设备路径)
|
||||
# mount /dev/sdXX /mnt/boot/efi (请替换为你的具体的设备路径)
|
||||
```
|
||||
|
||||
然后我们继续挂载系统设备:
|
||||
|
||||
```
|
||||
# mount -t proc /proc /mnt/proc
|
||||
# mount --rbind /dev /mnt/dev
|
||||
# mount --make-rslave /mnt/dev
|
||||
# mount --rbind /sys /mnt/sys
|
||||
# mount --make-rslave /mnt/sys
|
||||
# cp /mnt/etc/resolv.conf /mnt/etc/resolv.conf.chroot
|
||||
# cp -L /etc/resolv.conf /mnt/etc
|
||||
# chroot /mnt /bin/bash
|
||||
$ ping www.fedoraproject.org
|
||||
```
|
||||
|
||||
#### 重装 GRUB 及内核
|
||||
|
||||
最容易的方法就是重装 GRUB 和 内核,因为它完成了所有必要的配置 —— 现在我们可以访问网络了。所以,在 chroot 环境内部:
|
||||
|
||||
```
|
||||
# mount /boot/efi
|
||||
# dnf reinstall grub2-efi shim
|
||||
# grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg
|
||||
# dnf reinstall kernel-core
|
||||
...或者干脆重新生成 initramfs:
|
||||
# dracut --kver $(uname -r) --force
|
||||
```
|
||||
|
||||
如果你是支持 UEFI 的系统,这里是适用的。如果你是 BIOS 的系统,请查看下面的文档。重启之前,让我们查看是否一切正常:
|
||||
|
||||
```
|
||||
# cat /boot/grub2/grubenv
|
||||
# cat /boot/efi/EFI/fedora/grub.cfg
|
||||
# lsinitrd /boot/initramfs-$(uname -r).img | grep btrfs
|
||||
```
|
||||
|
||||
你应该在 `grubenv` 和 `grub.cfg` 有正确的分区 UUID 或指向(`grubenv` 可能没有更新,如有必要可以编辑它),并在 `grub.cfg` 中看到 `insmod btrfs` 配置和在 initramfs 镜像中有 btrfs 模块。
|
||||
|
||||
> 参见: Fedora 系统管理指南中的 [重装 GRUB 2][16] 和 [验证初始 RAM 磁盘镜像][17] 。
|
||||
|
||||
#### 重启
|
||||
|
||||
现在系统能够正常启动。如果不能,别慌,回到实时镜像修复这个问题。最坏的情况下,你可以从那里重装 Fedora 。
|
||||
|
||||
#### 首次启动之后
|
||||
|
||||
检查你的新 Btrfs 文件系统一切都正常。如果你觉得没问题,你需要回收旧的 ext4 快照使用的空间,进行碎片整理和平衡子卷。后两者可能要花一些时间,并且相当耗费资源。
|
||||
|
||||
对此你必须这样挂载顶级子卷:
|
||||
|
||||
```
|
||||
# mount /dev/sdXX -o subvol=/ /mnt/someFolder
|
||||
# btrfs subvolume delete /mnt/someFolder/ext2_saved
|
||||
```
|
||||
|
||||
然后,当机器有空闲时间时,运行这些命令:
|
||||
|
||||
```
|
||||
# btrfs filesystem defrag -v -r -f /
|
||||
# btrfs filesystem defrag -v -r -f /home
|
||||
# btrfs balance start -m /
|
||||
```
|
||||
|
||||
最后,有一个 “非写时复制” [属性][18],对于新系统,这个属性是为虚拟机镜像文件夹自动设置的。如果你使用虚拟机的话,可以设置它:
|
||||
|
||||
```
|
||||
# chattr +C /var/lib/libvirt/images
|
||||
```
|
||||
|
||||
```
|
||||
$ chattr +C ~/.local/share/gnome-boxes/images
|
||||
```
|
||||
|
||||
这个属性只会对在这些文件夹里的新文件生效。复制镜像并删除原镜像,你可以通过 `lsattr` 确认结果。
|
||||
|
||||
### 总结
|
||||
|
||||
我真心希望你发现这个教程是有用的,并且能够对是否在你的系统上转换为 Btrfs 做出谨慎而明智的决定。祝你成功转换!
|
||||
|
||||
欢迎在评论中分享你的经验,或者遇到更深层次的问题,请在 [ask.fedoraproject.org][19] 提问。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://fedoramagazine.org/convert-your-filesystem-to-btrfs/
|
||||
|
||||
作者:[Gergely Gombos][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[hwlife](https://github.com/hwllife)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://fedoramagazine.org/author/gombosg/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://fedoramagazine.org/wp-content/uploads/2020/08/butterfs-816x346.png
|
||||
[2]: https://ask.fedoraproject.org/t/conversion-of-an-existing-ext4-fedora-32-system-completely-to-btrfs/9446/6?u=gombosghttps://ask.fedoraproject.org/t/conversion-of-an-existing-ext4-fedora-32-system-completely-to-btrfs/9446/6?u=gombosg
|
||||
[3]: https://fedoramagazine.org/reclaim-hard-drive-space-with-lvm/
|
||||
[4]: https://fedoramagazine.org/recover-your-files-from-btrfs-snapshots/
|
||||
[5]: https://fedoramagazine.org/choose-between-btrfs-and-lvm-ext4/
|
||||
[6]: https://fedoramagazine.org/btrfs-coming-to-fedora-33/
|
||||
[7]: https://btrfs.wiki.kernel.org/index.php/SysadminGuide
|
||||
[8]: https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3
|
||||
[9]: https://www.mankier.com/8/btrfs
|
||||
[10]: https://www.mankier.com/5/btrfs
|
||||
[11]: https://www.mankier.com/8/btrfs-convert
|
||||
[12]: https://www.mankier.com/8/btrfs-subvolume
|
||||
[13]: https://getfedora.org/en/workstation/download/
|
||||
[14]: https://www.mankier.com/8/btrfs-subvolume#Subvolume_and_Snapshot
|
||||
[15]: https://btrfs.wiki.kernel.org/index.php/Compression
|
||||
[16]: https://docs.fedoraproject.org/en-US/fedora/f33/system-administrators-guide/kernel-module-driver-configuration/Working_with_the_GRUB_2_Boot_Loader/#sec-Reinstalling_GRUB_2
|
||||
[17]: https://docs.fedoraproject.org/en-US/fedora/f33/system-administrators-guide/kernel-module-driver-configuration/Manually_Upgrading_the_Kernel/#sec-Verifying_the_Initial_RAM_Disk_Image
|
||||
[18]: https://www.mankier.com/1/chattr#Attributes-C
|
||||
[19]: https://ask.fedoraproject.org/
|
@ -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 的旧文本编辑应用程序。如果你不熟悉 Wordstar,JOE 也可以模仿 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 OS(90 年代那个古怪的孩子 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
|
@ -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
|
@ -0,0 +1,203 @@
|
||||
[#]: subject: "Troubleshoot WiFi problems with Go and a Raspberry Pi"
|
||||
[#]: via: "https://opensource.com/article/21/3/troubleshoot-wifi-go-raspberry-pi"
|
||||
[#]: author: "Chris Collins https://opensource.com/users/clcollins"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "lkxed"
|
||||
[#]: reviewer: "turbokernel"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14560-1.html"
|
||||
|
||||
使用 Go 和树莓派排查 WiFi 问题
|
||||
======
|
||||
|
||||
> 实现一个 WiFi 扫描器玩玩~
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202205/08/085020czfsvsfpdg0usuph.jpg)
|
||||
|
||||
去年夏天,我和妻子变卖了家产,带着我们的两只狗移居了夏威夷。这里有美丽的阳光、温暖的沙滩、凉爽的冲浪等你能想到的一切。我们同样遇到了一些意料之外的事:WiFi 问题。
|
||||
|
||||
不过,这不是夏威夷的问题,而是我们租住公寓的问题。我们住在一个单身公寓里,与房东的公寓仅一墙之隔。我们的租房协议中包含了免费的网络连接!好耶!只不过,它是由房东的公寓里的 WiFi 提供的,哇哦……
|
||||
|
||||
说实话,它的效果还不错……吧?好吧,我承认它不尽如人意,并且不知道是哪里的问题。路由器明明就在墙的另一边,但我们的信号就是很不稳定,经常会自动断开连接。在家的时候,我们的 WiFi 路由器的信号能够穿过层层墙壁和地板。事实上,它所覆盖的区域比我们居住的 600 平方英尺(大约 55 平方米)的公寓还要大。
|
||||
|
||||
在这种情况下,一个优秀的技术人员会怎么做呢?既然想知道为什么,当然是开始排查咯!
|
||||
|
||||
幸运的是,我们在搬家之前并没有变卖掉树莓派 Zero W。它是如此小巧便携! 我当然就把它一起带来了。我有一个机智的想法:通过树莓派和它内置的 WiFi 适配器,使用 Go 语言编写一个小程序来测量并显示从路由器收到的 WiFi 信号。我打算先简单快速地把它实现出来,以后再去考虑优化。真是麻烦!我现在只想知道这个 WiFi 是怎么回事!
|
||||
|
||||
谷歌搜索了一番后,我发现了一个比较有用的 Go 软件包 [mdlayher/wifi][2],它专门用于 WiFi 相关操作,听起来很有希望!
|
||||
|
||||
### 获取 WiFi 接口的信息
|
||||
|
||||
我的计划是查询 WiFi 接口的统计数据并返回信号强度,所以我需要先找到设备上的接口。幸运的是,`mdlayher/wifi` 包有一个查询它们的方法,所以我可以创建一个 `main.go` 来实现它,具体代码如下:
|
||||
|
||||
```
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/mdlayher/wifi"
|
||||
)
|
||||
|
||||
func main() {
|
||||
c, err := wifi.New()
|
||||
defer c.Close()
|
||||
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
interfaces, err := c.Interfaces()
|
||||
|
||||
for _, x := range interfaces {
|
||||
fmt.Printf("%+v\n", x)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
让我们来看看上面的代码都做了什么吧!首先是导入依赖包,导入后,我就可以使用 `mdlayher/wifi` 模块就在 `main` 函数中创建一个新的客户端(类型为 `*Client`)。接下来,只需要调用这个新的客户端(变量名为 `c`)的 `c.Interfaces()` 方法就可以获得系统中的接口列表。接着,我就可以遍历包含接口指针的切片(变长数组),然后打印出它们的具体信息。
|
||||
|
||||
注意到 `%+v` 中有一个 `+` 了吗?它意味着程序会详细输出 `*Interface` 结构体中的属性名,这将有助于我标识出我看到的东西,而不用去查阅文档。
|
||||
|
||||
运行上面的代码后,我得到了机器上的 WiFi 接口列表:
|
||||
|
||||
```
|
||||
&{Index:0 Name: HardwareAddr:5c:5f:67:f3:0a:a7 PHY:0 Device:3 Type:P2P device Frequency:0}
|
||||
&{Index:3 Name:wlp2s0 HardwareAddr:5c:5f:67:f3:0a:a7 PHY:0 Device:1 Type:station Frequency:2412}
|
||||
```
|
||||
|
||||
注意,两行输出中的 MAC 地址(`HardwareAddr`)是相同的,这意味着它们是同一个物理硬件。你也可以通过 `PHY: 0` 来确认。查阅 Go 的 [wifi 模块文档][3],`PHY` 指的就是接口所属的物理设备。
|
||||
|
||||
第一个接口没有名字,类型是 `TYPE: P2P`。第二个接口名为 `wpl2s0`,类型是 `TYPE: Station`。`wifi` 模块的文档列出了 [不同类型的接口][4],以及它们的用途。根据文档,`P2P`(点对点传输) 类型表示“该接口属于点对点客户端网络中的一个设备”。我认为这个接口的用途是 [WiFi 直连][5] ,这是一个允许两个 WiFi 设备在没有中间接入点的情况下直接连接的标准。
|
||||
|
||||
`Station`(基站)类型表示“该接口是具有<ruby>控制接入点<rt>controlling access point</rt></ruby>的客户端设备管理的<ruby>基本服务集<rt>basic service set</rt></ruby>(BSS)的一部分”。这是大众熟悉的无线设备标准功能:作为一个客户端来连接到网络接入点。这是测试 WiFi 质量的重要接口。
|
||||
|
||||
### 利用接口获取基站信息
|
||||
|
||||
利用该信息,我可以修改遍历接口的代码来获取所需信息:
|
||||
|
||||
```
|
||||
for _, x := range interfaces {
|
||||
if x.Type == wifi.InterfaceTypeStation {
|
||||
// c.StationInfo(x) returns a slice of all
|
||||
// the staton information about the interface
|
||||
info, err := c.StationInfo(x)
|
||||
if err != nil {
|
||||
fmt.Printf("Station err: %s\n", err)
|
||||
}
|
||||
for _, x := range info {
|
||||
fmt.Printf("%+v\n", x)
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
首先,这段程序检查了 `x.Type`(接口类型)是否为 `wifi.InterfaceTypeStation`,它是一个基站接口(也是本练习中唯一涉及到的类型)。不幸的是名字出现了冲突,这个接口“类型”并不是 Golang 中的“类型”。事实上,我在这里使用了一个叫做 `interfaceType` 的 Go 类型来代表接口类型。呼,我花了一分钟才弄明白!
|
||||
|
||||
然后,假设接口的类型正确,我们就可以调用 `c.StationInfo(x)` 来检索基站信息,`StationInfo()` 方法可以获取到关于这个接口 `x` 的信息。
|
||||
|
||||
这将返回一个包含 `*StationInfo` 指针的切片。我不大确定这里为什么要用切片,或许是因为接口可能返回多个 `StationInfo`?不管怎么样,我都可以遍历这个切片,然后使用之前提到的 `+%v` 技巧格式化打印出 `StationInfo` 结构的属性名和属性值。
|
||||
|
||||
运行上面的程序后,我得到了下面的输出:
|
||||
|
||||
```
|
||||
&{HardwareAddr:70:5a:9e:71:2e:d4 Connected:17m10s Inactive:1.579s ReceivedBytes:2458563 TransmittedBytes:1295562 ReceivedPackets:6355 TransmittedPackets:6135 ReceiveBitrate:2000000 TransmitBitrate:43300000 Signal:-79 TransmitRetries:2306 TransmitFailed:4 BeaconLoss:2}
|
||||
```
|
||||
|
||||
我感兴趣的是 `Signal`(信号)部分,可能还有 `TransmitFailed`(传输失败)和 `BeaconLoss`(信标丢失)部分。信号强度是以 dBm(<ruby>分贝-毫瓦<rt>decibel-milliwatts</rt><ruby>)为单位来报告的。
|
||||
|
||||
#### 简短科普:如何读懂 WiFi dBm
|
||||
|
||||
根据 [MetaGeek][6] 的说法:
|
||||
|
||||
* -30 最佳,但它既不现实也没有必要
|
||||
* -67 非常好,它适用于需要可靠数据包传输的应用,例如流媒体
|
||||
* -70 还不错,它是实现可靠数据包传输的底线,适用于电子邮件和网页浏览
|
||||
* -80 很差,只是基本连接,数据包传输不可靠
|
||||
* -90 不可用,接近“<ruby>背景噪声<rt>noise floor</rt></ruby>”
|
||||
|
||||
*注意:dBm 是对数尺度,-60 比 -30 要低 1000 倍。*
|
||||
|
||||
### 使它成为一个真的“扫描器”
|
||||
|
||||
所以,看着上面输出显示的我的信号:-79。哇哦,感觉不大好呢。不过单看这个结果并没有太大帮助,它只能提供某个时间点的参考,只对 WiFi 网络适配器在特定物理空间的某一瞬间有效。一个连续的读数会更有用,借助于它,我们观察到信号随着树莓派的移动而变化。我可以再次修改 `main` 函数来实现这一点。
|
||||
|
||||
```
|
||||
var i *wifi.Interface
|
||||
|
||||
for _, x := range interfaces {
|
||||
if x.Type == wifi.InterfaceTypeStation {
|
||||
// Loop through the interfaces, and assign the station
|
||||
// to var x
|
||||
// We could hardcode the station by name, or index,
|
||||
// or hardwareaddr, but this is more portable, if less efficient
|
||||
i = x
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
for {
|
||||
// c.StationInfo(x) returns a slice of all
|
||||
// the staton information about the interface
|
||||
info, err := c.StationInfo(i)
|
||||
if err != nil {
|
||||
fmt.Printf("Station err: %s\n", err)
|
||||
}
|
||||
|
||||
for _, x := range info {
|
||||
fmt.Printf("Signal: %d\n", x.Signal)
|
||||
}
|
||||
|
||||
time.Sleep(time.Second)
|
||||
}
|
||||
```
|
||||
|
||||
首先,我命名了一个 `wifi.Interface` 类型的变量 `i`。因为它在循环的范围外,所以我可以用它来存储接口信息。循环内创建的任何变量在该循环的范围外都是不可访问的。
|
||||
|
||||
然后,我可以把这个循环一分为二。第一个遍历了 `c.Interfaces()` 返回的接口切片,如果元素是一个 `Station` 类型,它就将其存储在先前创建的变量 `i` 中,并跳出循环。
|
||||
|
||||
第二个循环是一个死循环,它将不断地运行,直到我按下 `Ctrl + C` 来结束程序。和之前一样,这个循环内部获取接口信息、检索基站信息,并打印出信号信息。然后它会休眠一秒钟,再次运行,反复打印信号信息,直到我退出为止。
|
||||
|
||||
运行上面的程序后,我得到了下面的输出:
|
||||
|
||||
```
|
||||
[chris@marvin wifi-monitor]$ go run main.go
|
||||
Signal: -81
|
||||
Signal: -81
|
||||
Signal: -79
|
||||
Signal: -81
|
||||
```
|
||||
|
||||
哇哦,感觉不妙。
|
||||
|
||||
### 绘制公寓信号分布图
|
||||
|
||||
不管怎么说,知道这些信息总比不知道要好。让树莓派连接上显示器或者电子墨水屏,并接上电源,我就可以让它在公寓里移动,并绘制出信号死角的位置。
|
||||
|
||||
剧透一下:由于房东的接入点在隔壁的公寓里,对我来说最大的死角是以公寓厨房的冰箱为顶点的一个圆锥体形状区域......这个冰箱与房东的公寓靠着一堵墙!
|
||||
|
||||
我想如果用《龙与地下城》里的黑话来说,它就是一个“<ruby>沉默之锥<rt>Cone of Silence</rt></ruby>”。或者至少是一个“<ruby>糟糕的网络连接之锥<rt>Cone of Poor Internet</rt></ruby>”。
|
||||
|
||||
总之,这段代码可以直接在树莓派上运行 `go build -o wifi_scanner` 来编译,得到的二进制文件 `wifi_scanner` 可以运行在其他同样的ARM 设备上。另外,它也可以在常规系统上用正确的 ARM 设备库进行编译。
|
||||
|
||||
祝你扫描愉快!希望你的 WiFi 路由器不在你的冰箱后面!你可以在 [我的 GitHub 存储库][7] 中找到这个项目所用的代码。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/3/troubleshoot-wifi-go-raspberry-pi
|
||||
|
||||
作者:[Chris Collins][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[turbokernel](https://github.com/turbokernel)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/clcollins
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://opensource.com/sites/default/files/lead-images/coffee_tea_selfcare_wfh_porch_520.png
|
||||
[2]: https://github.com/mdlayher/wifi
|
||||
[3]: https://godoc.org/github.com/mdlayher/wifi#Interface
|
||||
[4]: https://godoc.org/github.com/mdlayher/wifi#InterfaceType
|
||||
[5]: https://en.wikipedia.org/wiki/Wi-Fi_Direct
|
||||
[6]: https://www.metageek.com/training/resources/wifi-signal-strength-basics.html
|
||||
[7]: https://github.com/clcollins/goPiWiFi
|
@ -0,0 +1,87 @@
|
||||
[#]: subject: (WebAssembly Security, Now and in the Future)
|
||||
[#]: via: (https://www.linux.com/news/webassembly-security-now-and-in-the-future/)
|
||||
[#]: author: (Dan Brown https://training.linuxfoundation.org/announcements/webassembly-security-now-and-in-the-future/)
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (hanszhao80)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14592-1.html)
|
||||
|
||||
WebAssembly 安全的现在和未来
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202205/14/144316bb8kbwjephjyb427.jpg)
|
||||
|
||||
### 简介
|
||||
|
||||
正如我们 [最近解释的][1],WebAssembly 是一种用于以任何语言编写的二进制格式的软件,旨在最终无需更改就能在任意平台运行。WebAssembly 的第一个应用是在 Web 浏览器中,以使网站更快、更具交互性。WebAssembly 有计划推向 Web 之外,从各种服务器到物联网(IoT),其创造了很多机会,但也存在很多安全问题。这篇文章是对这些问题和 WebAssembly 安全模型的一篇介绍性概述。
|
||||
|
||||
### WebAssembly 跟 JavaScript 很像
|
||||
|
||||
在 Web 浏览器内部,WebAssembly 模块由执行 JavaScript 代码的同一 <ruby>虚拟机<rt>VM</rt></ruby> 管理。因此,WebAssembly 和 JavaScript 一样,造成的危害也是相同的,只是效率更高,更不易被察觉。由于 JavaScript 是纯文本,运行前需要浏览器编译,而 WebAssembly 是一种可立即运行的二进制格式,运行速度更快,也更难被扫描出(即使使用杀毒软件)其中的恶意指令。
|
||||
|
||||
WebAssembly 的这种 “代码混淆” 效果已经被用来弹出不请自来的广告,或打开假的 “技术支持” 窗口,要求提供敏感数据。另一个把戏则是自动将浏览器重定向到包含真正危险的恶意软件的 “落地” 页。
|
||||
|
||||
最后,就像 JavaScript 一样,WebAssembly 可能被用来 “窃取” 处理能力而不是数据。2019 年,[对 150 个不同的 WASM 模块的分析][2] 发现,其中约 _32%_ 被用于加密货币挖掘。
|
||||
|
||||
### WebAssembly 沙盒和接口
|
||||
|
||||
WebAssembly 代码在一个由虚拟机(而不是操作系统)管理的 [沙盒][3] 中封闭运行。这使它无法看到主机,也无法直接与主机交互。对系统资源(文件、硬件或互联网连接)的访问只能通过该虚拟机提供的 <ruby>WebAssembly 系统接口<rt>WebAssembly System Interface</rt></ruby>(WASI) 进行。
|
||||
|
||||
WASI 不同于大多数其他应用程序编程接口(API),它具有独特的安全特性,真正推动了 WASM 在传统服务器和<ruby>边缘<rt>Edge</rt></ruby>计算场景中的采用,这将是下一篇文章的主题。在这里,可以说,当从 Web 迁移到其他环境时,它的安全影响会有很大的不同。现代 Web 浏览器是极其复杂的软件,但它是建立在数十年的经验和数十亿人的日常测试之上的。与浏览器相比,服务器或物联网(IoT)设备几乎是未知领域。这些平台的虚拟机将需要扩展 WASI,因此,肯定会带来新的安全挑战。
|
||||
|
||||
### WebAssembly 中的内存和代码管理
|
||||
|
||||
与普通的编译程序相比,WebAssembly 应用程序对内存的访问非常受限,对它们自己也是如此。WebAssembly 代码不能直接访问尚未调用的函数或变量,不能跳转到任意地址,也不能将内存中的数据作为字节码指令执行。
|
||||
|
||||
在浏览器内部,WASM 模块只能获得一个连续字节的全局数组(<ruby>线性内存<rt>linear memory</rt></ruby>)进行操作。WebAssembly 可以直接读写该区域中的任意位置,或者请求增加其大小,但仅此而已。这个<ruby>线性内存<rt>linear memory</rt></ruby>也与包含其实际代码、执行堆栈、当然还有运行 WebAssembly 的虚拟机的区域分离。对于浏览器来说,所有这些数据结构都是普通的 JavaScript 对象,使用标准过程与所有其他对象隔离。
|
||||
|
||||
### 结果还好,但不完美
|
||||
|
||||
所有这些限制使得 WebAssembly 模块很难做出不当行为,但也并非不可能。
|
||||
|
||||
沙盒化的内存使 WebAssembly 几乎不可能接触到 __外部__ 的东西,也使操作系统更难防止 __内部__ 发生不好的事情。传统的内存监测机制,比如 <ruby>[堆栈金丝雀][4]<rt>Stack Canaries</rt></ruby> 能注意到是否有代码试图扰乱它不应该接触的对象,[但在这里没用][5]。
|
||||
|
||||
事实上,WebAssembly 只能访问自己的<ruby>线性内存<rt>linear memory</rt></ruby>,但可以直接访问,这也可能为攻击者的行为 _提供便利_。有了这些约束和对模块源代码的访问,就更容易猜测覆盖哪些内存位置可能造成最大的破坏。破坏局部变量似乎也是 [可能的][6],因为它们停留在<ruby>线性内存<rt>linear memory</rt></ruby>中的无监督堆栈中。
|
||||
|
||||
2020 年的一篇关于 [WebAssembly 的二进制安全性][5] 的论文指出,WebAssembly 代码仍然可以在设定的常量内存中覆盖字符串文字。同一篇论文描述了在三个不同的平台(浏览器、Node.JS 上的服务端应用程序,和独立 WebAssembly 虚拟机的应用程序)上,WebAssembly 可能比编译为原生二进制文件时更不安全的其他方式。建议进一步阅读此主题。
|
||||
|
||||
通常,认为 WebAssembly 只能破坏其自身沙盒中的内容的想法可能会产生误导。WebAssembly 模块为调用它们的 JavaScript 代码做繁重的工作,每次都会交换变量。如果模块在这些变量中的任意一处写入不安全的调用 WebAssembly 的 JavaScript 代码,就 _会_ 导致崩溃或数据泄露。
|
||||
|
||||
### 未来的方向
|
||||
|
||||
WebAssembly 的两个新出现的特性:[并发][7] 和内部垃圾收集,肯定会影响其安全性(如何影响以及影响多少,现在下结论还为时过早)。
|
||||
|
||||
并发允许多个 WebAssembly 模块在同一个虚拟机中并行。目前,只有通过 JavaScript [web workers][8] 才能实现这一点,但更好的机制正在开发中。安全方面,他们可能会带来 [以前不需要的大量的代码][9],也就是更多出错的方法。
|
||||
|
||||
为了提高性能和安全性,我们需要一个 [本地的垃圾收集器][10],但最重要的是,要在经过良好测试的浏览器的 Java 虚拟机之外使用 WebAssembly,因为这些虚拟机无论如何都会在自己内部收集所有的垃圾。当然,甚至这个新代码也可能成为漏洞和攻击的另一个入口。
|
||||
|
||||
往好处想,使 WebAssembly 比现在更安全的通用策略也是存在的。再次引用 [这篇文章][5],这些策略包括:编译器改进、栈/堆和常量数据的 _分离_ 的线性存储机制,以及避免使用 **不安全的语言**(如 C)编译 WebAssembly 模块代码。
|
||||
|
||||
*本文 [WebAssembly 安全的现在和未来][11] 首次发表在 [Linux 基金会 - 培训][12]。*
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.linux.com/news/webassembly-security-now-and-in-the-future/
|
||||
|
||||
作者:[Dan Brown][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[hanszhao80](https://github.com/hanszhao80)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://training.linuxfoundation.org/announcements/webassembly-security-now-and-in-the-future/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://training.linuxfoundation.org/announcements/an-introduction-to-webassembly/
|
||||
[2]: https://www.sec.cs.tu-bs.de/pubs/2019a-dimva.pdf
|
||||
[3]: https://webassembly.org/docs/security/
|
||||
[4]: https://ctf101.org/binary-exploitation/stack-canaries/
|
||||
[5]: https://www.usenix.org/system/files/sec20-lehmann.pdf
|
||||
[6]: https://spectrum.ieee.org/tech-talk/telecom/security/more-worries-over-the-security-of-web-assembly
|
||||
[7]: https://github.com/WebAssembly/threads
|
||||
[8]: https://en.wikipedia.org/wiki/Web_worker
|
||||
[9]: https://googleprojectzero.blogspot.com/2018/08/the-problems-and-promise-of-webassembly.html
|
||||
[10]: https://github.com/WebAssembly/gc/blob/master/proposals/gc/Overview.md
|
||||
[11]: https://training.linuxfoundation.org/announcements/webassembly-security-now-and-in-the-future/
|
||||
[12]: https://training.linuxfoundation.org/
|
@ -0,0 +1,235 @@
|
||||
[#]: subject: (Share files between Linux and Windows computers)
|
||||
[#]: via: (https://opensource.com/article/21/4/share-files-linux-windows)
|
||||
[#]: author: (Stephan Avenwedde https://opensource.com/users/hansic99)
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (hanszhao80)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14537-1.html)
|
||||
|
||||
如何在 Linux 和 Windows 电脑之间共享文件
|
||||
======
|
||||
|
||||
> 使用 Samba 设置跨平台文件共享。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202205/02/233859oqqjvfr6tqz9bfqp.jpg)
|
||||
|
||||
如果你使用不同的操作系统,能够在它们之间共享文件会让你倍感方便。这篇文章介绍如何使用 [Samba][3] 和 [mount.cifs][4] 在 Linux ([Fedora 33][2])和 Windows 10 之间设置文件共享。
|
||||
|
||||
Samba 是 [SMB/CIFS][5] 协议的 Linux 实现,允许通过网络连接直接访问共享的文件夹和打印机。 mount.cifs 是 Samba 套件的一部分,可让你在 Linux 下挂载 [CIFS][5] 文件系统。
|
||||
|
||||
> **注意**: 这些说明适用于在你的私有本地网络内,或在 Linux 宿主机和虚拟化的 Windows 访客机之间的虚拟主机专用网络中共享文件。不要将本文视为你公司网络的操作指南,因为本文没有实现必要的网络安全考虑。
|
||||
|
||||
### 从 Windows 访问 Linux
|
||||
|
||||
本节介绍从 Windows 文件资源管理器访问用户的 Linux 主目录。
|
||||
|
||||
#### 1、安装和配置 Samba
|
||||
|
||||
进入你的系统安装 Samba:
|
||||
|
||||
```
|
||||
dnf install samba
|
||||
```
|
||||
|
||||
Samba 是一个系统守护进程,其配置文件位于 `/etc/samba/smb.conf`。它的默认配置应该就可以工作。如果不行,下面这个最小化配置应该可以解决问题:
|
||||
|
||||
```
|
||||
[global]
|
||||
workgroup = SAMBA
|
||||
server string = %h server (Samba %v)
|
||||
invalid users = root
|
||||
security = user
|
||||
[homes]
|
||||
comment = Home Directories
|
||||
browseable = no
|
||||
valid users = %S
|
||||
writable = yes
|
||||
```
|
||||
|
||||
你可以在该项目网站的 [smb.conf][6] 部分找到参数的详细说明。
|
||||
|
||||
#### 2、修改 LinuxSE
|
||||
|
||||
如果你的 Linux 发行版受 [SELinux][7] 保护(比如 Fedora),必须通过以下命令才能通过 Samba 共享主目录:
|
||||
|
||||
```
|
||||
setsebool -P samba_enable_home_dirs on
|
||||
```
|
||||
|
||||
通过以下命令查看这个值:
|
||||
|
||||
```
|
||||
getsebool samba_enable_home_dirs
|
||||
```
|
||||
|
||||
输出如下:
|
||||
|
||||
![Sebool][8]
|
||||
|
||||
#### 3、启用你的用户
|
||||
|
||||
Samba 使用一组用户/密码来管理连接权限。通过键入以下命令将你的 Linux 用户添加到该集合中:
|
||||
|
||||
```
|
||||
smbpasswd -a <你的用户名>
|
||||
```
|
||||
|
||||
系统提示你输入密码。这是一个 _全新_ 的密码;而不是你账户的当前密码。请输入你想用来登录 Samba 的密码。
|
||||
|
||||
键入以下命令得到有 Samba 使用权限的用户列表:
|
||||
|
||||
```
|
||||
pdbedit -L -v
|
||||
```
|
||||
|
||||
键入以下命令删除一个用户:
|
||||
|
||||
```
|
||||
smbpasswd -x <用户名>
|
||||
```
|
||||
|
||||
#### 4、开启 Samba
|
||||
|
||||
既然 Samba 是一个系统守护进程,你可以在 Fedora 上键入以下命令启动它:
|
||||
|
||||
```
|
||||
systemctl start smb
|
||||
```
|
||||
|
||||
这将为当前会话开启 Samba 服务。如果想让它自启动,键入以下命令:
|
||||
|
||||
```
|
||||
systemctl enable smb
|
||||
```
|
||||
|
||||
在某些系统上,Samba 守护进程注册为 `smbd`。
|
||||
|
||||
#### 4、配置防火墙
|
||||
|
||||
你的防火墙会默认阻拦 Samba。通过配置防火墙允许 Samba 能永久访问网络。
|
||||
|
||||
你可以在命令行执行如下操作:
|
||||
|
||||
```
|
||||
firewall-cmd --add-service=samba --permanent
|
||||
```
|
||||
|
||||
或者,你可以使用 `firewall-config` 工具以图形化方式进行操作:
|
||||
|
||||
![firewall-config][10]
|
||||
|
||||
#### 5、从 Windows 访问 Samba
|
||||
|
||||
在 Windows 中,打开文件资源管理器。在地址栏中,键入两个反斜杠(`\\`),紧跟你的 Linux 机器的地址(IP 地址或主机名):
|
||||
|
||||
![从 Windows 访问 Linux][11]
|
||||
|
||||
系统将提示你输入登录信息。输入第 3 步中的用户名和密码组合。你现在应该可以访问 Linux 机器上的主目录:
|
||||
|
||||
![从 Windows 访问 Linux][12]
|
||||
|
||||
### 从 Linux 访问 Windows
|
||||
|
||||
以下步骤说明了如何从 Linux 访问共享的 Windows 文件夹。要实现这一点,需要你的 Windows 用户帐户具有管理员权限。
|
||||
|
||||
#### 1、启用文件共享
|
||||
|
||||
通过点击 “Windows 按钮” > “<ruby>设置<rt>Settings</rt></ruby>” > “<ruby>网络和 Internet<rt>Network & Internet</rt></ruby>” ,或者右键单击任务栏右下角的小监视器图标,<ruby>打开网络和共享中心<rt>Open Network an d Sharing Center</rt></ruby>:
|
||||
|
||||
![打开网络和共享中心][13]
|
||||
|
||||
在打开的窗口中,找到你要使用的连接并记下其配置文件。我使用了 **以太网 3**,它被标记为 <ruby>公用网络<rt>Public Network</rt></ruby>。
|
||||
|
||||
> **注意**:如果你的 PC 经常连接公用网络,请考虑将本地计算机的连接配置文件更改为 **私有**。
|
||||
|
||||
记住你的网络配置,然后单击 <ruby>更改高级共享设置<rt>Change advanced sharing settings</rt></ruby>:
|
||||
|
||||
![更改高级共享设置][14]
|
||||
|
||||
选择与你的连接对应的配置文件并打开 <ruby>网络发现<rt>network discovery</rt></ruby> 和 <ruby>文件和打印机共享<rt>file and printer sharing</rt></ruby>:
|
||||
|
||||
![网络共享设置][15]
|
||||
|
||||
#### 2、定义一个共享文件夹
|
||||
|
||||
通过右键单击你要共享的文件夹打开上下文菜单,导航到 <ruby>授予访问权限<rt>Give access to</rt></ruby>,然后选择 <ruby>特定用户...<rt>Specific people...</rt></ruby>:
|
||||
|
||||
![授予访问权限][16]
|
||||
|
||||
检查你当前的用户名是否在列表中。点击 <ruby>共享<rt>Share</rt></ruby> 将此文件夹标记为共享:
|
||||
|
||||
![标记为共享][17]
|
||||
|
||||
你可以通过在文件资源管理器的地址栏中输入 `\\localhost` 来显示所有共享文件夹的列表:
|
||||
|
||||
![共享文件夹][18]
|
||||
|
||||
![共享文件夹][19]
|
||||
|
||||
#### 3、在 Linux 下挂载共享文件夹
|
||||
|
||||
回到你的 Linux 系统,打开一个命令行,然后创建一个新文件夹,用于挂载 Windows 共享:
|
||||
|
||||
```
|
||||
mkdir ~/WindowsShare
|
||||
```
|
||||
|
||||
挂载 Windows 共享是使用 `mount.cifs` 完成的,它应该被默认安装。使用如下命令临时挂载你的共享文件夹:
|
||||
|
||||
```
|
||||
sudo mount.cifs //<address-of-windows-pc>/MySharedFolder ~/WindowsShare/ -o user=<Windows-user>,uid=$UID
|
||||
```
|
||||
|
||||
在这个命令里:
|
||||
|
||||
* `<address-of-windows-pc>` 是 Windows PC 的地址信息(IP 或主机名)
|
||||
* `<Windows-user>` 是允许访问共享文件夹的用户(见步骤 2)
|
||||
|
||||
系统将提示你输入 Windows 密码。之后,你将能够使用普通 Linux 用户访问 Windows 上的共享文件夹。
|
||||
|
||||
要卸载共享文件夹:
|
||||
|
||||
```
|
||||
sudo umount ~/WindowsShare/
|
||||
```
|
||||
|
||||
你还可以在系统启动时挂载 Windows 共享文件夹。按照 [这些步骤][20] 相应地配置你的系统。
|
||||
|
||||
### 总结
|
||||
|
||||
在这里展示了如何建立临时的文件夹共享访问权限,每次重启后都要重新设置,因此修改成永久访问会更便利。我经常在不同的系统之间来回切换,对我而言设置直接文件访问非常实用。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/4/share-files-linux-windows
|
||||
|
||||
作者:[Stephan Avenwedde][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[hanszhao80](https://github.com/hanszhao80)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/hansic99
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003499_01_cloud21x_cc.png?itok=5UwC92dO (Blue folders flying in the clouds above a city skyline)
|
||||
[2]: https://getfedora.org/en/workstation/download/
|
||||
[3]: https://www.samba.org/
|
||||
[4]: https://linux.die.net/man/8/mount.cifs
|
||||
[5]: https://en.wikipedia.org/wiki/Server_Message_Block
|
||||
[6]: https://www.samba.org/samba/docs/current/man-html/smb.conf.5.html
|
||||
[7]: https://www.redhat.com/en/topics/linux/what-is-selinux
|
||||
[8]: https://opensource.com/sites/default/files/uploads/sebool.png (Enabling Samba to enable user directory access)
|
||||
[9]: https://creativecommons.org/licenses/by-sa/4.0/
|
||||
[10]: https://opensource.com/sites/default/files/uploads/firewall_configuration.png (firewall-config tool)
|
||||
[11]: https://opensource.com/sites/default/files/uploads/windows_access_shared_1.png (Accessing Linux machine from Windows)
|
||||
[12]: https://opensource.com/sites/default/files/uploads/windows_acess_shared_2.png (Accessing Linux machine from Windows)
|
||||
[13]: https://opensource.com/sites/default/files/uploads/open_network_and_sharing_center.png (Open network and sharing center)
|
||||
[14]: https://opensource.com/sites/default/files/uploads/network_and_sharing_center_2.png (Change advanced sharing settings)
|
||||
[15]: https://opensource.com/sites/default/files/uploads/network_sharing.png (Network sharing settings)
|
||||
[16]: https://opensource.com/sites/default/files/pictures/give_access_to.png (Give access)
|
||||
[17]: https://opensource.com/sites/default/files/pictures/tag_as_shared.png (Tag as shared)
|
||||
[18]: https://opensource.com/sites/default/files/uploads/show_shared_folder_1.png (Shared folders)
|
||||
[19]: https://opensource.com/sites/default/files/uploads/show_shared_folder_2.png (Shared folders)
|
||||
[20]: https://timlehr.com/auto-mount-samba-cifs-shares-via-fstab-on-linux/
|
95
published/20210615 Listen to music on FreeDOS.md
Normal file
95
published/20210615 Listen to music on FreeDOS.md
Normal file
@ -0,0 +1,95 @@
|
||||
[#]: subject: (Listen to music on FreeDOS)
|
||||
[#]: via: (https://opensource.com/article/21/6/listen-music-freedos)
|
||||
[#]: author: (Jim Hall https://opensource.com/users/jim-hall)
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (hanszhao80)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14603-1.html)
|
||||
|
||||
在 FreeDOS 中聆听音乐
|
||||
======
|
||||
|
||||
> Mplayer 是 Linux、Windows、Mac 和 DOS 等操作系统上常见的一款开源媒体播放器。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202205/17/092828vffyeliiz33hqf31.jpg)
|
||||
|
||||
听音乐是放松心情的好方法。在 Linux 上,我使用 Rhythmbox 听音乐。但是你可能不知道在 FreeDOS 上也可以听音乐。让我们看一下两款流行的音乐播放器吧:
|
||||
|
||||
### 用 Mplayer 听音乐
|
||||
|
||||
[Mplayer][2] 是一款开源的媒体播放器,通常安装于 Linux、Windows 和 Mac 上,但也有 DOS 版本可用。这里我们讨论的就是在 FreeDOS 版本。虽然其 DOS 移植版基于旧版(2007 年的 1.0rc2-3-3-2 版),但它完全适用于在 DOS 上播放媒体。
|
||||
|
||||
我使用 MPlayer 在 FreeDOS 上听音乐文件。在这个例子中,我复制了我最喜欢的有声读物之一,[Big Finish Productions][3] 的<ruby>神秘博士:闪点行动<rt>Doctor Who: Flashpoint</rt></ruby>,并在我的 FreeDOS 计算机上将其保存为 `C:\MUSIC\FLASHPNT.MP3`。为了在 FreeDOS 上收听闪点行动,我从 FreeDOS 命令行启动 MPlayer 并指定要播放的 MP3 文件名。MPlayer 的基本用法是 `mplayer [options] filename`,如果默认设置可用,你应该可以直接使用该文件名启动 MPlayer。在本例中,我运行以下命令将工作目录切换为 `\MUSIC`,然后使用 MPlayer 播放我的 MP3 有声读物文件:
|
||||
|
||||
```
|
||||
CD \MUSIC
|
||||
MPLAYER FLASHPNT.MP3
|
||||
```
|
||||
|
||||
FreeDOS _不区分大小写_,因此它将忽略 DOS 命令和任何文件或目录的大小写字母的区别。你键入 `cd \music` 或 `Cd \Music` 都可以切换到 Music 目录,效果相同。
|
||||
|
||||
![FreeDOS 上的 Mplayer][4]
|
||||
|
||||
*你可以用 Mplayer 播放 MP3 文件*
|
||||
|
||||
使用 MPlayer 在 FreeDOS 播放音乐文件时没有花哨的界面。但同时,它也不会分散注意力。所以我可以一边让 FreeDOS 在我的 DOS 计算机上播放 MP3 文件,一边使用另一台计算机做其他事情。然而,FreeDOS 一次只运行一个任务(换句话说,DOS 是一个<ruby>单任务<rt>single-tasking</rt></ruby>操作系统),所以我不能将 MPlayer 置于 FreeDOS 的“后台”运行,而在 _同一台 FreeDOS 机_ 上处理其他事情。
|
||||
|
||||
请注意,MPlayer 是一个需要大量内存才能运行的大程序。虽然 DOS 本身并不需要太多的内存来运行,但我建议至少有 16M 的内存来运行 MPlayer。
|
||||
|
||||
### 使用 Open Cubic Player 听音频文件
|
||||
|
||||
FreeDOS 不止提供了 MPlayer 来播放媒体。还有 [Open Cubic Player][6],它支持多种文件格式,包括 Midi 和 WAV 文件。
|
||||
|
||||
1999 年,我录制了一段简短的音频文件,内容是我说:“你好,我是 Jim Hall,我把 ‘FreeDOS’ 发音为 _FreeDOS_。"这是一个玩笑,借鉴了 Linus Torvalds 录制的演示他如何发音 Linux 的 [类似的音频文件][7](`English.au`,包含在 1994 年的 Linux 源代码树中)中的创意。我们不会在 FreeDOS 中分发这段 FreeDOS 音频剪辑,但欢迎你从我们的 [Silly Sounds][8] 目录中下载它,该目录位于 [Ibiblio][9] 的 FreeDOS 文件存档中。
|
||||
|
||||
你可以使用 Open Cubic Player 收听 _FreeDOS_ 音频剪辑。通常从 `\APPS\OPENCP` 目录键入 `CP` 命令运行 Open Cubic Player。但 Open Cubic Player 是 32 位应用程序,运行它需要 32 位 DOS 扩展器。常见的 DOS 扩展器是 DOS/4GW。虽然可以免费使用,但 DOS/4GW 不是开源程序,因此我们不会将其作为 FreeDOS 包分发。
|
||||
|
||||
相反,FreeDOS 提供了另一个名为 DOS/32A 的开源32位扩展器。如果你在安装 FreeDOS 时没有安装所有内容,则可能需要使用 [FDIMPLES][10] 进行安装。我使用这两行命令切换到 `\APPS\OPENCP` 路径,并使用 DOS/32A 扩展器运行 Open Cubic Player:
|
||||
|
||||
```
|
||||
CD \APPS\OPENCP
|
||||
DOS32A CP
|
||||
```
|
||||
|
||||
Open Cubic Player 没有花哨的用户界面,但你可以使用方向键将 <ruby>文件选择器<rt>File Selector</rt></ruby> 导航到包含要播放的媒体文件的目录。
|
||||
|
||||
![Open Cubic Player][11]
|
||||
|
||||
*Open Cubic Player 打开文件选择器*
|
||||
|
||||
文本比在其他 DOS 应用程序中显示的要小,因为 Open Cubic Player 会自动将显示更改为使用 50 行文本,而不是通常的 25 行。当你退出程序时,Open Cubic Player 会将显示重置为 25 行。
|
||||
|
||||
选择媒体文件后,Open Cubic Player 将循环播放该文件(按键盘上的 `Esc` 键退出)。当文件通过扬声器播放时,Open Cubic Player 会显示一个频谱仪,以便你可以观察左右声道的音频。FreeDOS 音频剪辑是以单声道录制的,因此左右声道是相同的。
|
||||
|
||||
![Open Cubic Player][12]
|
||||
|
||||
*Open Cubic Player 中播放 FreeDOS 音频文件*
|
||||
|
||||
DOS 可能来自较早的年代,但这并不意味着你不能使用 FreeDOS 来执行现代任务或播放当前的媒体。如果你喜欢听数字音乐,试一试在 FreeDOS上 使用 Open Cubic Player 或 MPlayer 吧!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/6/listen-music-freedos
|
||||
|
||||
作者:[Jim Hall][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[hanszhao80](https://github.com/hanszhao80)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/jim-hall
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/programming-code-keyboard-laptop-music-headphones.png?itok=EQZ2WKzy (Woman programming)
|
||||
[2]: https://en.wikipedia.org/wiki/MPlayer
|
||||
[3]: https://bigfinish.com/
|
||||
[4]: https://opensource.com/sites/default/files/uploads/mplayer.png (You can use Mplayer to listen to MP3 files)
|
||||
[5]: https://creativecommons.org/licenses/by-sa/4.0/
|
||||
[6]: https://www.cubic.org/player/
|
||||
[7]: https://commons.wikimedia.org/wiki/File:Linus-linux.ogg
|
||||
[8]: https://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/util/sillysounds/
|
||||
[9]: https://www.ibiblio.org/
|
||||
[10]: https://opensource.com/article/21/6/freedos-package-manager
|
||||
[11]: https://opensource.com/sites/default/files/uploads/opencp1.png (Open Cubic Player opens with a file selector)
|
||||
[12]: https://opensource.com/sites/default/files/uploads/opencp2.png (Open Cubic Player playing the "FreeDOS" audio clip)
|
177
published/20210617 Linux package management with dnf.md
Normal file
177
published/20210617 Linux package management with dnf.md
Normal file
@ -0,0 +1,177 @@
|
||||
[#]: subject: (Linux package management with dnf)
|
||||
[#]: via: (https://opensource.com/article/21/6/dnf-linux)
|
||||
[#]: author: (Seth Kenlon https://opensource.com/users/seth)
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (hanszhao80)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14542-1.html)
|
||||
|
||||
使用 dnf 进行 Linux 包管理
|
||||
======
|
||||
|
||||
> 了解如何在 Linux 上使用 `dnf` 命令安装软件包,然后下载我们的速查表,让正确的命令触手可及。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202205/04/101526nlsnpu34ppgscsch.jpg)
|
||||
|
||||
在计算机系统上安装应用程序非常简单:就是将档案(如 `.zip` 文件)中的文件复制到目标计算机上,放在操作系统预期放应用程序的位置。因为我们中的许多人习惯于使用花哨的安装“向导”来帮助我们在计算机上安装软件,所以这个过程似乎在技术上应该比实际更复杂。
|
||||
|
||||
然而,复杂的是,是什么构成了一个程序?用户认为的单个应用程序实际上包含了分散在操作系统中的软件库的各种依赖代码(例如:Linux 上的 .so 文件、Windows 上的 .dll 文件和 macOS 上的 .dylib 文件)。
|
||||
|
||||
为了让用户不必担心这些程序代码之间的复杂的互相依赖关系, Linux 使用 <ruby>包管理系统<rt>package management system</rt></ruby> 来跟踪哪些应用程序需要哪些库,哪些库或应用程序有安全或功能更新,以及每个软件会附带安装哪些额外的数据文件。包管理器本质上是一个安装向导。它们易于使用,提供了图形界面和基于终端的界面,让你的生活更轻松。你越了解你的发行版的包管理器,你的生活就会越轻松。
|
||||
|
||||
### 在 Linux 上安装应用程序
|
||||
|
||||
如果你在使用 Linux 桌面时,偶尔想要安装一个应用程序,那么你可能正在寻找 [GNOME “软件”][2],它是一个桌面应用程序浏览器。
|
||||
|
||||
![GNOME “软件” 程序][3]
|
||||
|
||||
它会按你的预期工作:点击它的界面,直到你找到一个看起来有用的应用程序,然后单击 “安装” 按钮。
|
||||
|
||||
或者,你可以在 GNOME “软件” 中打开从网络下载的 `.rpm` 或 `.flatpakref` 软件包,以便它进行安装。
|
||||
|
||||
但如果你更倾向于使用命令行,请继续阅读。
|
||||
|
||||
### 用 dnf 搜索软件
|
||||
|
||||
在安装应用程序之前,你可能需要确认它是否存在于你的发行版的服务器上。通常,使用 `dnf` 搜索应用程序的通用名称就足够了。例如,假设你最近阅读了 [一篇关于 Cockpit 的文章][4],并决定尝试一下。你可以搜索 `cockpit` 验证该发行版是否包含它:
|
||||
|
||||
```
|
||||
$ dnf search cockpit
|
||||
Last metadata expiration check: 0:01:46 ago on Tue 18 May 2021 19:18:15 NZST.
|
||||
==== Name Exactly Matched: cockpit ====
|
||||
cockpit.x86_64 : Web Console for Linux servers
|
||||
|
||||
==== Name & Summary Matched: cockpit ==
|
||||
cockpit-bridge.x86_64 : Cockpit bridge server-side component
|
||||
cockpit-composer.noarch : Composer GUI for use with Cockpit
|
||||
[...]
|
||||
```
|
||||
|
||||
有一个精确的匹配。上面列出的匹配的软件包名为 `cockpit.x86_64`,但名称中的 `.x86_64` 部分仅表示它兼容该 CPU 架构。默认情况下,你的系统会安装适配当前 CPU 架构的软件包,因此你可以忽略该扩展名。所以你确认你要查找的软件包确实简称为 `cockpit`。
|
||||
|
||||
现在你可以放心地使用 `dnf install` 安装它。 此步骤需要管理员权限:
|
||||
|
||||
```
|
||||
$ sudo dnf install cockpit
|
||||
```
|
||||
|
||||
一般来说,这就是典型的 `dnf` 工作流:搜索并安装。
|
||||
|
||||
然而,有时 `dnf search` 的结果并不清晰,或者你想要关于一个软件包的更多信息,而不仅仅是它的通用名称。有一些相关的 `dnf` 子命令,具体取决于你想要的信息。
|
||||
|
||||
### 软件包的元数据
|
||||
|
||||
如果你觉得你的搜索已 _接近_ 想要的结果,但还不确定,查看软件包的元数据通常会有所帮助,例如项目的网址和描述。要获取此信息,请使用顾名思义的 `dnf info` 命令:
|
||||
|
||||
```
|
||||
$ dnf info terminator
|
||||
Available Packages
|
||||
Name : terminator
|
||||
Version : 1.92
|
||||
Release : 2.el8
|
||||
Architecture : noarch
|
||||
Size : 526 k
|
||||
Source : terminator-1.92-2.el8.src.rpm
|
||||
Repository : epel
|
||||
Summary : Store and run multiple GNOME terminals in one window
|
||||
URL : https://github.com/gnome-terminator
|
||||
License : GPLv2
|
||||
Description : Multiple GNOME terminals in one window. This is a project to produce
|
||||
: an efficient way of filling a large area of screen space with
|
||||
: terminals. This is done by splitting the window into a resizeable
|
||||
: grid of terminals. As such, you can produce a very flexible
|
||||
: arrangements of terminals for different tasks.
|
||||
```
|
||||
|
||||
这个信息告诉你可用软件包的版本、在你系统中注册的哪一个存储库提供了它、该项目的网站以及详细的功能描述。
|
||||
|
||||
### 哪个软件包提供的这个文件?
|
||||
|
||||
软件包名称并不总是与你要查找的内容相匹配。例如,假设你正在阅读的文档告诉你必须安装名为 `qmake-qt5` 的东西:
|
||||
|
||||
```
|
||||
$ dnf search qmake-qt5
|
||||
No matches found.
|
||||
```
|
||||
|
||||
`dnf` 数据库非常广泛,因此你不要局限于搜索完全匹配的内容。你可以使用 `dnf provides` 命令来了解你正在寻找的东西是否作为某个更大的软件包的一部分而提供:
|
||||
|
||||
```
|
||||
$ dnf provides qmake-qt5
|
||||
qt5-qtbase-devel-5.12.5-8.el8.i686 : Development files for qt5-qtbase
|
||||
Repo : appstream
|
||||
Matched from:
|
||||
Filename : /usr/bin/qmake-qt5
|
||||
|
||||
qt5-qtbase-devel-5.15.2-3.el8.x86_64 : Development files for qt5-qtbase
|
||||
Repo : appstream
|
||||
Matched from:
|
||||
Filename : /usr/bin/qmake-qt5
|
||||
```
|
||||
|
||||
可以确认应用程序 `qmake-qt5` 是名为 `qt5-qtbase-devel` 的软件包的一部分。它还告诉你,该应用程序会安装到 `/usr/bin`,因此你知道了安装后它的确切位置。
|
||||
|
||||
### 软件包中包含哪些文件?
|
||||
|
||||
有时我发现自己会从完全不同的角度来对待 `dnf`。有时,我已经确认我的系统上安装了一个应用程序;我只是不知道我是怎么得到它的。还有一些时候,我知道我安装了一个特定的软件包,但我不清楚这个软件包到底在我的系统上安装了什么。
|
||||
|
||||
如果你需要对包的<ruby>有效负载<rt>payload</rt></ruby>进行 “<ruby>逆向工程<rt>reverse engineer</rt></ruby>”,可以使用 `dnf repoquery` 命令和 `--list` 选项。这将查看存储库中有关软件包的元数据,并列出该软件包提供的所有文件:
|
||||
|
||||
```
|
||||
$ dnf repoquery --list qt5-qtbase-devel
|
||||
/usr/bin/fixqt4headers.pl
|
||||
/usr/bin/moc-qt5
|
||||
/usr/bin/qdbuscpp2xml-qt5
|
||||
/usr/bin/qdbusxml2cpp-qt5
|
||||
/usr/bin/qlalr
|
||||
/usr/bin/qmake-qt5
|
||||
/usr/bin/qvkgen
|
||||
/usr/bin/rcc-qt5
|
||||
[...]
|
||||
```
|
||||
|
||||
这些列表可能很长,使用 `less` 或你喜欢的分页命令配合管道操作会有所帮助。
|
||||
|
||||
### 移除应用程序
|
||||
|
||||
如果你决定系统中不再需要某个应用程序,可以使用 `dnf remove` 卸载它,该软件包本身安装的文件以及不再需要的任何依赖项都会被移除:
|
||||
|
||||
```
|
||||
$ dnf remove bigapp
|
||||
```
|
||||
|
||||
有时,你发现随着一个应用程序一起安装的依赖项对后来安装的其他应用程序也有用。如果两个包需要相同的依赖项,`dnf remove` _不会_ 删除依赖项。在安装和卸载大量应用程序之后,孤儿软件包散落各处的现象并不少见。大约每年我都要执行一次 `dnf autoremove` 来清除所有未使用的软件包:
|
||||
|
||||
```
|
||||
$ dnf autoremove
|
||||
```
|
||||
|
||||
这不是必需的,但这是一个让我的电脑感觉更好的大扫除步骤。
|
||||
|
||||
### 了解 dnf
|
||||
|
||||
你对包管理器的工作方式了解得越多,在必要时安装和查询应用程序就越容易。即便你不是 `dnf` 的重度使用者,当你发现自己与基于 RPM 的发行版交互时,了解它也会很有用。
|
||||
|
||||
告别 `yum` 后,我最喜欢的包管理器之一是 `dnf` 命令。虽然我不喜欢它的所有子命令,但我发现它是目前最健壮的 <ruby>包管理系统<rt>package management system</rt></ruby> 之一。 [下载我们的 dnf 速查表][5] 习惯该命令,不要害怕尝试一些新技巧。一旦熟悉了它,你可能会发现很难使用其他任何东西替代它。
|
||||
|
||||
> **[dnf 速查表][5]**
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/6/dnf-linux
|
||||
|
||||
作者:[Seth Kenlon][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[hanszhao80](https://github.com/hanszhao80)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/seth
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/brown-package-red-bow.jpg?itok=oxZYQzH- (Package wrapped with brown paper and red bow)
|
||||
[2]: https://wiki.gnome.org/Apps/Software
|
||||
[3]: https://opensource.com/sites/default/files/gnome-software.png (The GNOME Software app)
|
||||
[4]: https://opensource.com/article/20/11/cockpit-server-management
|
||||
[5]: https://opensource.com/downloads/dnf-cheat-sheet
|
184
published/20210624 Linux package management with apt.md
Normal file
184
published/20210624 Linux package management with apt.md
Normal file
@ -0,0 +1,184 @@
|
||||
[#]: subject: (Linux package management with apt)
|
||||
[#]: via: (https://opensource.com/article/21/6/apt-linux)
|
||||
[#]: author: (Chris Hermansen https://opensource.com/users/clhermansen)
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (hanszhao80)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14558-1.html)
|
||||
|
||||
使用 apt 进行 Linux 包管理
|
||||
======
|
||||
|
||||
> 学习如何使用 apt 命令在基于 Debian 的 Linux 发行版上安装软件包,然后下载我们的速查表,让正确的命令触手可及。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202205/07/104236md5zqhpub9vqeaah.jpg)
|
||||
|
||||
[包管理器][2] 可帮助你处理 Linux 系统的计算机上软件的更新、卸载、故障排除等问题。Seth Kenlon 写了 [使用 dnf 进行 Linux 包管理][3] 一文,介绍了如何使用 `dnf` 这款命令行包管理工具,在 RHEL、CentOS、Fedora、Mageia、OpenMandriva 等 Linux 发行版中安装软件。
|
||||
|
||||
Debian 和基于 Debian 的发行版(例如 MX Linux、Deepin、Ubuntu)以及基于 Ubuntu 的发行版(例如 Linux Mint 和 Pop!_OS)都有 `apt`,这是一个“相似但不同”的工具。在本文中,我将按照 Seth 的示例(但使用 `apt`)向你展示如何使用它。
|
||||
|
||||
在一开始,我想先提一下四个跟 `apt` 相关的软件安装工具:
|
||||
|
||||
* [Synaptic][4] 是为 `apt` 服务的一个基于 GTK+ 的图形用户界面(GUI)的前端工具。
|
||||
* [Aptitude][5] 是为 `apt` 服务的一个基于 Ncurses 的全屏命令行前端工具。
|
||||
* `apt` 的前身有 `apt-get`、`apt-cache` 等工具。
|
||||
* [Dpkg][6] 是在 `apt` 包管理器背后处理繁杂事务的”幕后工作者“。
|
||||
|
||||
还有其他的包管理系统,例如 [Flatpak][7] 和 [Snap][8],你可能会在 Debian 和基于 Debian 的系统上遇到它们,但我不打算在这里讨论。还有一些应用程序“商店”,例如 [GNOME “软件”][9],与 `apt` 和其他打包技术重叠;我也不打算在这里讨论它们。最后,还有其他 Linux 发行版,例如 [Arch][10] 和 [Gentoo][11] 既不使用 `dnf` 也不使用 `apt`,我也不打算在这里讨论它们!
|
||||
|
||||
上面我讲了这么多我不想提及的内容,你可能怀疑 `apt` 到底还能处理多少软件。这么说吧,在我的 Ubuntu 20.04 上,`apt` 可以让我使用 69,371 个软件包,从 `0ad`(一款古代战争题材的即时战略游戏)到 `zzuf`(一个透明的应用程序模糊测试工具),一点也不差。
|
||||
|
||||
### 使用 apt 搜索软件
|
||||
|
||||
使用 `apt` 软件包管理器的第一步是找到感兴趣的软件包。Seth 的 `dnf` 文章以 [Cockpit][12] 服务器管理应用程序为例。用 `apt` 我会输入如下命令:
|
||||
|
||||
```
|
||||
$ apt search cockpit
|
||||
Sorting... Done
|
||||
Full Text Search... Done
|
||||
389-ds/hirsute,hirsute 1.4.4.11-1 all
|
||||
389 Directory Server suite - metapackage
|
||||
|
||||
cockpit/hirsute,hirsute 238-1 all
|
||||
Web Console for Linux servers
|
||||
|
||||
...
|
||||
$
|
||||
```
|
||||
|
||||
上面的第二个包就是你要的那个(以 `cockpit/hirsute` 开头的那一行)。如果你决定要安装它,输入:
|
||||
|
||||
```
|
||||
$ sudo apt install cockpit
|
||||
```
|
||||
|
||||
`apt` 将负责安装 Cockpit 以及使其工作所需的所有部件或 _依赖_。有时我们不太确定这是我们所需要的。了解更多的信息可能有助于你决定是否真的要安装此应用程序。
|
||||
|
||||
### 包元数据
|
||||
|
||||
要了解有关软件包的更多信息,使用 `apt show` 命令:
|
||||
|
||||
```
|
||||
$ apt show cockpit
|
||||
Package: cockpit
|
||||
Version: 238-1
|
||||
Priority: optional
|
||||
Section: universe/admin
|
||||
Origin: Ubuntu
|
||||
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
|
||||
Original-Maintainer: Utopia Maintenance Team <pkg-utopia-maintainers@lists.alioth.debian.org>
|
||||
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
|
||||
Installed-Size: 88.1 kB
|
||||
Depends: cockpit-bridge (>= 238-1), cockpit-ws (>= 238-1), cockpit-system (>= 238-1)
|
||||
Recommends: cockpit-storaged (>= 238-1), cockpit-networkmanager (>= 238-1), cockpit-packagekit (>= 238-1)
|
||||
Suggests: cockpit-doc (>= 238-1), cockpit-pcp (>= 238-1), cockpit-machines (>= 238-1), xdg-utils
|
||||
Homepage: https://cockpit-project.org/
|
||||
Download-Size: 21.3 kB
|
||||
APT-Sources: http://ca.archive.ubuntu.com/ubuntu hirsute/universe amd64 Packages
|
||||
Description: Web Console for Linux servers
|
||||
The Cockpit Web Console enables users to administer GNU/Linux servers using a
|
||||
web browser.
|
||||
.
|
||||
It offers network configuration, log inspection, diagnostic reports, SELinux
|
||||
troubleshooting, interactive command-line sessions, and more.
|
||||
|
||||
$
|
||||
```
|
||||
|
||||
特别要注意的是 `Description` 字段,它会告诉你更多关于应用程序的信息。`Depends` 字段说明还必须安装什么,而 `Recommends` 则显示建议安装的其他(如果有的话)合作组件。`Homepage` 字段会提供一个网址,通过它你可以了解更多。
|
||||
|
||||
### 哪个包提供的这个文件?
|
||||
|
||||
有时你并不知道包名,但你知道包里一定包含着的某个文件。Seth 以 `qmake-qt5` 程序作为示例。使用 `apt search` 找不到它:
|
||||
|
||||
```
|
||||
$ apt search qmake-qt5
|
||||
Sorting... Done
|
||||
Full Text Search... Done
|
||||
$
|
||||
```
|
||||
|
||||
但是,另一个有关联的命令 `apt-file` 可以用来探索包内部:
|
||||
|
||||
```
|
||||
$ apt-file search qmake-qt5
|
||||
qt5-qmake-bin: /usr/share/man/man1/qmake-qt5.1.gz
|
||||
$
|
||||
```
|
||||
|
||||
这时会显示一个 `qmake-qt5` 的手册页。它是一个名为 `qt5-qmake-bin` 的包的一部分。注意,此包名称颠倒了字符串 `qmake` 和 `qt5` 的顺序。
|
||||
|
||||
### 包里包含哪些文件?
|
||||
|
||||
方便的 `apt-file` 命令会列出给定的包中包含哪些文件。例如:
|
||||
|
||||
```
|
||||
$ apt-file list cockpit
|
||||
cockpit: /usr/share/doc/cockpit/TODO.Debian
|
||||
cockpit: /usr/share/doc/cockpit/changelog.Debian.gz
|
||||
cockpit: /usr/share/doc/cockpit/copyright
|
||||
cockpit: /usr/share/man/man1/cockpit.1.gz
|
||||
cockpit: /usr/share/metainfo/cockpit.appdata.xml
|
||||
cockpit: /usr/share/pixmaps/cockpit.png
|
||||
$
|
||||
```
|
||||
|
||||
注意,这与 `apt show` 命令提供的信息不同,后者列出了包的依赖(其他必须安装的包)。
|
||||
|
||||
### 移除一个应用程序
|
||||
|
||||
你还可以使用 `apt` 移除软件包。例如,要移除`apt-file` 应用程序:
|
||||
|
||||
```
|
||||
$ sudo apt purge apt-file
|
||||
```
|
||||
|
||||
注意必须由超级用户运行 `apt` 才能安装或移除应用程序。
|
||||
|
||||
移除一个包并不会自动移除 `apt` 在此过程中安装的所有依赖项。不过,一点点的工作就很容易去除这些残留:
|
||||
|
||||
```
|
||||
$ sudo apt autoremove
|
||||
```
|
||||
|
||||
### 认识一下 apt
|
||||
|
||||
正如 Seth 所写的,“你对包管理器的工作方式了解得越多,在需要安装和查询应用程序时就会越容易。”
|
||||
|
||||
即便你不是 `apt` 的重度使用者,当你需要在命令行中安装或删除软件包时(例如,在一台远程服务器上或遵循某些热心肠发布的操作指南时),掌握一些 `apt` 的知识也会很有用。在某些软件创作者仅提供了一个裸 `.pkg` 文件的情况下,可能还需要了解一些关于 dpkg 的知识(如上所述)。
|
||||
|
||||
我发现 Synaptic 包管理器在我的桌面上是一个非常有用的工具,但出于各种目的,我也在少数维护的服务器上使用着 `apt`。
|
||||
|
||||
[下载我们的 apt 速查表][15] 习惯该命令并尝试一些新技巧。一旦你这样做了,你可能会发现很难再使用其他任何东西。
|
||||
|
||||
> **[apt 速查表][15]**
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/6/apt-linux
|
||||
|
||||
作者:[Chris Hermansen][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[hanszhao80](https://github.com/hanszhao80)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/clhermansen
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/bash_command_line.png?itok=k4z94W2U (bash logo on green background)
|
||||
[2]: https://opensource.com/article/21/2/linux-package-management
|
||||
[3]: https://linux.cn/article-14542-1.html
|
||||
[4]: https://www.nongnu.org/synaptic/
|
||||
[5]: https://wiki.debian.org/Aptitude
|
||||
[6]: https://wiki.debian.org/Teams/Dpkg
|
||||
[7]: https://flatpak.org/
|
||||
[8]: https://snapcraft.io/
|
||||
[9]: https://wiki.gnome.org/Apps/Software
|
||||
[10]: https://archlinux.org/
|
||||
[11]: https://www.gentoo.org/
|
||||
[12]: https://opensource.com/article/20/11/cockpit-server-management
|
||||
[13]: mailto:ubuntu-devel-discuss@lists.ubuntu.com
|
||||
[14]: mailto:pkg-utopia-maintainers@lists.alioth.debian.org
|
||||
[15]: https://opensource.com/downloads/apt-cheat-sheet
|
@ -0,0 +1,91 @@
|
||||
[#]: subject: (A new open source operating system for embedded systems)
|
||||
[#]: via: (https://opensource.com/article/21/7/rt-thread-smart)
|
||||
[#]: author: (Zhu Tianlong https://opensource.com/users/zhu-tianlong)
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (tendertime)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14552-1.html)
|
||||
|
||||
一种新的开源嵌入式操作系统
|
||||
======
|
||||
|
||||
> RT-Thread Smart 致力于物联网和边缘计算领域的开源。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202205/06/131909kdb7f966j22qf7o9.jpg)
|
||||
|
||||
目前对 [嵌入式操作系统][2] 有巨大的需求,你建立的操作系统最好是开源的。[RT-Thread][3] 项目的研发团队花了两年时间,研发出了该项目的最新成果:RT-Thread Smart。这是一款微内核的操作系统,主要针对中高端的处理器,如具有内存管理单元(MMU)的 RISC-V 或 Arm Cortex-A,为嵌入式领域的所有行业提供了一个具有竞争力的、基于 POSIX 的软件平台。
|
||||
|
||||
### 谁需要 RT-Thread Smart?
|
||||
|
||||
RT-Thread Smart 是一款专业的、高性能的微内核操作系统,用于实时应用。它为所有市场的嵌入式设备提供了开源基础,如安全(IP 摄像头)、工业控制、车载设备、消费电子及其他嵌入式科技应用,可谓一切场景。它的意义在于:不像传统的物联网操作系统,一个微内核的操作系统可以填补传统实时操作系统 RTOS 和相对大型的操作系统如 Linux 之间的空白,实现实时性能、成本、安全、启动速度等等各方面之间的最佳平衡。
|
||||
|
||||
### RT-Thread Smart 的架构
|
||||
|
||||
RT-Thread Smart 通过 MMU 和系统调用将系统分割为内核模式和用户模式,并为每种模式区分了地址空间(一个 32 位系统可以提供 4G 地址空间)。
|
||||
|
||||
![RT-Thread Smart 架构][4]
|
||||
|
||||
(RT-Thread, [CC BY-SA 4.0][5])
|
||||
|
||||
RT-Thread Smart 内核包括平台的基础功能,并支持定制化。RT-Thread Smart 的用户应用环境使用 [musl libc][6] 来提供 [POSIX][7] 接口调用和 C 语言的运行时支持。它也继承了原始的 RT-Thread 生态系统,使用 [SCons][8] 或者其他编译工具如 [Autotools][9]、Makefile、[CMake][10] 等等来支持开发,以及 RT-Thread 开箱即用的在线软件包(撰写本文时超过 342 个)。你甚至可以将 Linux 应用程序(如 wget/cURL、BusyBox、OpenSSL 和 Simple DirectMedia Layer)移植到你的平台。
|
||||
|
||||
压缩的 RT-Thread Smart 内核仅 217 KB,搭配一个 127 KB 的根文件系统。大约 2 MB的存储占用。包括了对文件系统、网络协议栈、多媒体的完整支持。RT-Thread 只需要 3 到 5 秒完成启动,而在不运行其他功能组件时,RT-Thread Smart 需要的启动及准备时间不到 500ms。
|
||||
|
||||
通过其集成的 Persimmon 用户界面(UI)组件,RT-Thread Smart 从上电到运行 UI 需要大约 1 秒。换句话说,这是一个非常轻巧快速的系统。当然,“实时”不是指启动,而是指系统随着时间推进而表现出的一致性。对于 RT-Thread ,实时性能需要优先考虑,中断时延小于 1μs,满足大部分实时性要求严格的场景需求。
|
||||
|
||||
### RT-Thread Smart 和 RT-Thread
|
||||
|
||||
你可能想知道 RT-Thread Smart 和 RT-Thread 之间的不同。简单来说, RT-Thread Smart 是一个基于 RT-Thread RTOS 的操作系统,但它整合了用户态的处理过程。RT-Smart 的内核部分本质上是 RT-Thread RTOS,它在虚拟地址上运行,增加了进程管理,使用进程间通信机制(IPC)、虚拟内存/地址空间管理、ELF 加载器等等,以上特性全部在 RT-Thread RTOS 内实现,当这些组件被禁用时,RT-Smart 会回归 RT-Thread RTOS。
|
||||
|
||||
以下是对比:
|
||||
|
||||
| | RT-Thread | RT-Thread Smart
|
||||
:-----| :----: | :----:
|
||||
支持芯片 | Cortex-M/R、RISC-V RV32IMAC(以及类似)、Cortex-A MPU | Cortex-A 等具有 MMU 的 MPU
|
||||
编译 | 内核和应用都编译到一个镜像 | 内核和应用可以被分开编译和运行
|
||||
存储 | 使用线性地址空间(即使有 MMU),使用物理地址的虚拟寻址 | 运行在内核占用超过 1GB 的 32 位操作系统,拥有完整 4G 地址空间的用户态进程彼此隔离,外设驱动程序必须通过虚拟地址访问外设
|
||||
运行错误 | 当一个应用程序失败时,整个系统就会崩溃 | 当应用程序失败时,它不会影响内核和其他进程的执行
|
||||
运行模式 | 多线程模型 | 多进程模型(进程内支持多线程,内核线程由内核支持)
|
||||
用户模型 | 单用户模型 | 单用户模型
|
||||
API | RT-Thread API、POSIX PSE52 | RT-Thread API(内核态和用户态),以及完整的 POSIX API
|
||||
实时性 | 抢占式硬实时系统 | 抢占式硬实时系统
|
||||
资源使用 | 非常小 | 相对小
|
||||
调试 | 通常需要模拟器调试 | 支持 GDB 调试,不需要模拟器
|
||||
|
||||
RT-Thread RTOS 非常紧凑,它的所有应用和子系统都编译到镜像中,多线程应用运行并分享相同的地址空间。
|
||||
|
||||
RT-Thread Smart 是独立的。系统和应用是分别编译和运行的。应用拥有完整且互相隔离的地址空间。它也继承了 RT-Thread 优秀的实时性,同时也具有 POSIX 环境的特性。
|
||||
|
||||
类似地,它们都与 RT-Thread API 兼容。RT-Thread RTOS 的应用可以被平滑移植到 RT-Thread Smart。
|
||||
|
||||
### 嵌入式开源
|
||||
|
||||
RT-Thread Smart 是一个开源项目,项目地址:[GitHub][11]。你可以下载代码和文档,尝试一下,并提交评论和反馈,将该项目传播给更多开源倡导者。嵌入式系统属于它们的用户,有太多的嵌入式开发人员没有找到太多可用的嵌入式系统。
|
||||
|
||||
如果你是开发人员,请帮助改进 RT-Thread Smart。随着 RT-Thread 项目的不断推进,我们希望创建物联网和边缘计算的令人激动的开源世界。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/7/rt-thread-smart
|
||||
|
||||
作者:[Zhu Tianlong][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[tendertime](https://github.com/tendertime)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/zhu-tianlong
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/LAW-Internet_construction_9401467_520x292_0512_dc.png?itok=RPkPPtDe (An intersection of pipes.)
|
||||
[2]: https://opensource.com/article/20/6/open-source-rtos
|
||||
[3]: https://www.rt-thread.io/
|
||||
[4]: https://opensource.com/sites/default/files/uploads/rt-thread-smart.png (RT-Thread Smart architecture)
|
||||
[5]: https://creativecommons.org/licenses/by-sa/4.0/legalcode
|
||||
[6]: https://musl.libc.org/
|
||||
[7]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains
|
||||
[8]: https://scons.org/
|
||||
[9]: https://opensource.com/article/19/7/introduction-gnu-autotools
|
||||
[10]: https://opensource.com/article/21/5/cmake
|
||||
[11]: https://github.com/RT-Thread/rt-thread/tree/rt-smart
|
@ -0,0 +1,111 @@
|
||||
[#]: subject: "How I use open source to design my own card games"
|
||||
[#]: via: "https://opensource.com/article/21/12/open-source-card-game"
|
||||
[#]: author: "Seth Kenlon https://opensource.com/users/seth"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "hadisi1993"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14551-1.html"
|
||||
|
||||
我如何利用开源设计自己的卡牌游戏
|
||||
======
|
||||
|
||||
> 开源并不仅仅指的是软件。开源是一种文化现象,自然也适合桌面游戏。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202205/06/094320k8uug3i84pg8u0w2.jpg)
|
||||
|
||||
我喜欢优秀的游戏,尤其是桌游,因为桌游的很多特性都和开源相同。在现实生活中,当你和朋友围坐在桌旁一起玩卡牌游戏时,作为一个团队,你们可以一起决定小丑牌是不是万能的。还有,你们可以随意地决定当出了小丑牌后,手上有 Ace 牌的人的要不要舍弃 Ace 牌,或者出了方块皇后以后,每个人是不是都要把手上的牌传给右手边的人。换句话说,你们可以随心所欲地重新制定规则,因为游戏不过是参与者们一致认同的条件集合罢了。对我来说,更棒的是你可以发明自己的游戏,而不用破坏别人的游戏规则。有时候,我会作为一个业余爱好者来开发桌游。因为我喜欢把自己的爱好结合起来,所以我倾向于只使用开源和开放的文化资源来设计游戏。
|
||||
|
||||
首先,游戏有大致有两个关键特征,风格和机制,理解这一点非常重要。游戏风格指的是游戏的故事或者主题,游戏机制指的是游戏的规则和条件。这两者并不总是完全脱离的,举个例子,在设计一款以赛车为主题的游戏时,自然而然就会要求玩家迅速完成动作。然而,风格和机制通常是被分开对待的,所以我们完全可以为了好玩就去创造一款使用标准扑克牌,却以太空羊驼为主题的游戏。
|
||||
|
||||
### 开源美术
|
||||
|
||||
如果你去过现代艺术博物馆,你可能会发现自己站在一幅纯蓝色的画布前,无意中听到有人说起老话:“见鬼,这我也能做!”。但事实是,艺术是一项艰巨的工作。创作赏心悦目的艺术品需要付出大量的思考、时间、信心和技巧。这也意味着艺术是你在设计游戏时中最难采购的部分之一。
|
||||
|
||||
我有一些“技巧”来解决这个典型难题。
|
||||
|
||||
#### 1、寻找同类素材
|
||||
|
||||
现在有很多免费、开放的艺术作品,而且大部分质量上佳。问题在于,游戏通常需要不止一件作品。如果你正在设计一款纸牌游戏,你大概至少需要四到六个不同的元素(假设你的纸牌遵循塔罗牌风格),有可能还需要更多。如果你花足够多的时间在这上面,你可以在 [OpenGameArt.org][3]、[FreeSVG.org][4]、[ArtStation.com][5]、[DeviantArt.com][6] 等网站上找到<ruby>[知识共享和公共领域][2]<rt>Creative Commons and Public Domain</rt></ruby>的艺术作品。
|
||||
|
||||
如果你使用的网站没有专门搜索<ruby>知识共享<rt>Creative Commons</rt></ruby>的功能,输入以下文字到任何搜索引擎当中,`"This work is licensed under a Creative Commons"` 或 `"本工作处于知识共享许可协议之下"`(引号很重要,不要把它们漏了),并用搜索引擎要求的语法,以便将搜索限制到一个具体的站点当中(举个例子,`site:deviantart.com`)。
|
||||
|
||||
一旦你有了一个可供挑选素材的艺术库,那就去辨别这些作品的主题,并根据主题分类。两个不同的人拍摄的机器人的照片可能看起来一点都不像,但它们的主题都是机器人。如果提供给你足够多机器人相关的美术素材,你可以围绕机器人这个主题构建你的游戏风格。
|
||||
|
||||
#### 2、委托创作知识共享艺术
|
||||
|
||||
你可以雇艺术家来为你定制艺术作品。我与使用开源绘画程序(如 [Krita][7] 和 Mypaint)的艺术家一起合作。同时,作为合同的一部分,我规定艺术作品必须在<ruby>知识共享署名-相同方式许可证<rt>Creative Commons Attribution-ShareAlike</rt></ruby>(CC BY-SA)下授权。迄今为止,只有一位艺术家因为许可证的限制拒绝了我的提议,并且大多数人都很高兴自己的美术作品有可能有更大的生命力,而不仅仅是作为业余爱好者自己发行的游戏的一部分。
|
||||
|
||||
#### 3、创作自己的艺术
|
||||
|
||||
就像现代艺术馆之旅展示的那样,艺术是一个非常灵活的词。我发现只要我给自己设定一个目标,也就是我需要为一款游戏创造多少纸牌或令牌,我便能够从 Linux 上的丰富图像创造工具中选择一种去创作。这并不需要什么高难度的东西。就像现代艺术一样,你可以用蓝色和黄色的条纹,或者红色和白色的圆点花纹,或者绿色和紫色的锯齿线来涂一张卡片,只要你能把它们画出来,那么除了你以外,其他人永远不会知道你暗地里把它们当做仙宫里的贵族和小姐。想想看,通过运用图形应用程序,描摹日常物品的照片,重组经典的扑克花色和塔罗牌主题等一系列方式,你可以创造出的简单作品吧。
|
||||
|
||||
### 版面设计
|
||||
|
||||
我用 [Inkscape][8]、Scribus 或者 [GIMP][9] 来进行版面设计,这取决与我有什么素材以及我追求的设计方式是什么。
|
||||
|
||||
对于卡牌,我发现简单的版面设计很容易实现,看上去也更好,纯色比渐变色更容易印刷,还有,直观的图像是最棒的。
|
||||
|
||||
![layout in Inkscape][10]
|
||||
|
||||
(Seth Kenlon, CC BY-SA 4.0)
|
||||
|
||||
我在一个单独的 Inkscape 文件中为我最新的游戏做了版面设计,这个游戏只使用了来自 OpenGameArt.com 上三四个不同艺术家的九张图片。在有着更大的美工集,更好的卡牌多样性的游戏中,我会在游戏中的每一种卡片的文件中为它们设计版面。
|
||||
|
||||
在为你的游戏素材做任何版面设计之前,要先了解你的目标输出是什么。如果你打算在家里打印游戏,那就做一些计算,搞清楚默认的纸张大小(有些是 US Letter,或者是 A4)可以容纳多少卡牌、令牌或卡片。如果你使用 [TheGameCrafter][11] 之类的桌游打印机打印,请下载好模板文件。
|
||||
|
||||
![printed cards][12]
|
||||
|
||||
(Seth Kenlon, CC BY-SA 4.0)
|
||||
|
||||
### 游戏机制
|
||||
|
||||
游戏机制是游戏中最重要的部分。它们使一款游戏成为游戏。开发游戏规则并不一定是一个正式的过程。你可以一时兴起地创造了一款游戏,可以拿一个现有的游戏重组它的规则,直到它和原来不同,可以修改一款你不喜欢的游戏,也可以将两款不同的游戏组合在一起。从简单容易的地方做起,拿索引卡,标准扑克牌,或塔罗牌去试着模拟你的想象中游戏是如何工作的。你可以自己尝试早期的游戏创意,但最终,让朋友来帮忙是找出意外故障和进行优化的好方法。
|
||||
|
||||
经常测试游戏。与不同类型的玩家一起玩游戏,并听取他们的反馈。你的游戏可能会激发许多玩家去创造新的规则和想法,因此要将关于 _哪些搞砸了_ 的反馈与关于 _哪些可以做修改_ 的反馈分开。你不一定要去真的实施这些反馈意见,只需迭代你的想法,但还是要仔细考虑错误报告。
|
||||
|
||||
一旦确定了你想要让你的规则如何运作,就把它们写下来,让它们 [简短且容易解析][13]。你定的规则不必说服玩家去玩这款游戏,不必向他们解释策略,你也不必允许玩家重新设置规则,只要告诉玩家为了让游戏玩起来,他们应该采取的步骤就可以了。
|
||||
|
||||
最重要的是,考虑一下,将你的规则开源。分享经验是游戏的一切,这其中也应该包括规则。知识共享或<ruby>开放游戏许可证<rt>Open Gaming License</rt></ruby>的规则集合允许其他玩家在你的作品上进行迭代、混合和构建。你永远不会知道,有人可能会因此想出一个你更喜欢的游戏变体!
|
||||
|
||||
### 开源游戏
|
||||
|
||||
开源不仅仅指的是软件。开源是一种文化现象,自然也适合桌面游戏。花几个晚上的时间来尝试制作游戏。如果你是新手,那就从一些简单的开始,比如下面的这个空白卡牌游戏:
|
||||
|
||||
1. 找来一些朋友。
|
||||
2. 给每个人几张空白的索引卡,告诉他们在每张卡片上写一条规则。规则可以是任何东西(“如果你穿着红色衣服,你就赢了”或“第一个站起来的人赢”等等)。
|
||||
3. 在你自己的索引卡片上,写上 “和”、“但是”、“但是不要”、“而且不要”、“除了”,以及其他的条件短语。
|
||||
4. 洗牌并将牌发给所有玩家。
|
||||
5. 每个玩家轮到的时候出一张牌。
|
||||
6. 最终目标是获胜,但是玩家可以通过出 “和”、“但是”、“或者” 卡片来修改决定胜负的条件。
|
||||
|
||||
这是一个有趣的聚会游戏,同时是一份很好的介绍,告诉你如何像游戏设计者一样思考,它帮助你认识到什么适合作为游戏机制,什么不适合。
|
||||
|
||||
还有,当然的,这是开源的。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/12/open-source-card-game
|
||||
|
||||
作者:[Seth Kenlon][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[hadisi1993](https://github.com/hadisi1993)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/seth
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rich-smith-unsplash.jpg?itok=uzzS0gRa (Deck of playing cards)
|
||||
[2]: https://opensource.com/article/20/1/what-creative-commons
|
||||
[3]: https://opensource.com/article/21/12/opengameart.org/
|
||||
[4]: http://freesvg.org
|
||||
[5]: http://artstation.com
|
||||
[6]: http://deviantart.com
|
||||
[7]: https://opensource.com/article/21/12/krita-digital-paint
|
||||
[8]: https://opensource.com/article/21/12/linux-draw-inkscape
|
||||
[9]: https://opensource.com/content/cheat-sheet-gimp
|
||||
[10]: https://opensource.com/sites/default/files/inkscape-layout.jpg (Layout in Inkscape)
|
||||
[11]: https://www.thegamecrafter.com/
|
||||
[12]: https://opensource.com/sites/default/files/cards-printed_0.jpg (Printed cards)
|
||||
[13]: https://opensource.com/life/16/11/software-documentation-tabletop-gaming
|
275
published/20220113 Learn Rust in 2022.md
Normal file
275
published/20220113 Learn Rust in 2022.md
Normal file
@ -0,0 +1,275 @@
|
||||
[#]: subject: "Learn Rust in 2022"
|
||||
[#]: via: "https://opensource.com/article/22/1/rust-cheat-sheet"
|
||||
[#]: author: "Seth Kenlon https://opensource.com/users/seth"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "hanszhao80"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14563-1.html"
|
||||
|
||||
2022 Rust 入门指南
|
||||
======
|
||||
|
||||
> 如果你打算在今年探索 Rust,请下载我们的免费 Rust 速查表,以供快速参考基础知识。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202205/08/161625lvo8v82ell9l3xmm.jpg)
|
||||
|
||||
Rust 是一门相对较新的编程语言,受到各个企业的 [程序员的欢迎][2]。尽管如此,它仍是一门建立在之前所有事物之上的语言。毕竟,Rust 不是一天做出来的,所以即便 Rust 中的一些概念看起来与你从 Python、Java、C++ 等编程语言学到的东西大不相同,但它们都是基于同一个基础,那就是你一直与之交互(无论你是否知道)的 CPU 和 NUMA(<ruby>非统一内存访问<rt>Non Uniform Memory Access</rt></ruby>)架构,因此 Rust 中的一些新功能让人感觉有些熟悉。
|
||||
|
||||
现在,我的职业不是程序员。我没耐心但我又有点儿强迫症。当我需要完成某件事时,如果一门语言不能帮助我相对较快地获得想要的结果,那么我很少会受到鼓舞而使用它。Rust 试图平衡两个矛盾:现代计算机对安全和结构化代码的需求,和现代程序员对编码工作事半功倍的渴望。
|
||||
|
||||
### 安装 Rust
|
||||
|
||||
[rust-lang.org][3] 网站有丰富的的文档指导如何安装 Rust,但通常,它就像下载 `sh.rustup.rs` 脚本并运行它一样简单。
|
||||
|
||||
```
|
||||
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs
|
||||
$ less sh.rustup.sh
|
||||
$ sh ./sh.rustup.rs
|
||||
```
|
||||
|
||||
### 没有类
|
||||
|
||||
Rust 没有类,也不使用 `class` 关键字。Rust 确实有 `struct` 数据类型,但它的作用是充当数据集合的一种模板。因此,你可以使用<ruby>结构体<rt>struct</rt></ruby>,而不是创建一个类来表示虚拟对象:
|
||||
|
||||
```
|
||||
struct Penguin {
|
||||
genus: String,
|
||||
species: String,
|
||||
extinct: bool,
|
||||
classified: u64,
|
||||
}
|
||||
```
|
||||
|
||||
你可以像使用类一样使用它。例如,当定义完 `Penguin` 结构,你就可以创建它的实例,并与该实例进行交互:
|
||||
|
||||
```
|
||||
struct Penguin {
|
||||
genus: String,
|
||||
species: String,
|
||||
extinct: bool,
|
||||
classified: u64,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let p = Penguin { genus: "Pygoscelis".to_owned(),
|
||||
species: "R adeliæ".to_owned(),
|
||||
extinct: false,
|
||||
classified: 1841 };
|
||||
|
||||
println!("Species: {}", p.species);
|
||||
println!("Genus: {}", p.genus);
|
||||
println!("Classified in {}", p.classified);
|
||||
if p.extinct == true {
|
||||
println!("Sadly this penguin has been made extinct.");
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
将 `impl` 数据类型与 `struct` 数据类型结合使用,你可以实现一个包含函数的结构体,并且可以添加继承和其他与类相似的特性。
|
||||
|
||||
### 函数
|
||||
|
||||
Rust 中的函数很像其他语言中的函数。每个函数都代表一组严谨的任务,你可以在需要时调用它们。主函数名必须是 `main`。
|
||||
|
||||
用 `fn` 关键字声明函数,后跟函数名称和函数接受的所有参数。
|
||||
|
||||
```
|
||||
fn foo() {
|
||||
let n = 8;
|
||||
println!("Eight is written as {}", n);
|
||||
}
|
||||
```
|
||||
|
||||
通过参数,将信息从一个函数传递到另一个函数。例如,我已经创建了一个 `Penguin` 类(结构),并且我有一个 `Penguin` 的实例为 `p`,将目标函数的参数指定为 `Penguin` 类型,就可把 `p` 的属性从一个函数传递到另一个函数。
|
||||
|
||||
```
|
||||
fn main() {
|
||||
let p = Penguin { genus: "Pygoscelis".to_owned(),
|
||||
species: "R adeliæ".to_owned(),
|
||||
extinct: false, classified: 1841 };
|
||||
printer(p);
|
||||
}
|
||||
|
||||
fn printer(p: Penguin) {
|
||||
println!("Species: {}", p.species);
|
||||
println!("Genus: {}", p.genus);
|
||||
println!("Classified in {}", p.classified);
|
||||
if p.extinct == true {
|
||||
println!("Sadly this penguin has been made extinct.");
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 变量
|
||||
|
||||
Rust 默认创建的为<ruby>不可变<rt>immutable</rt></ruby>变量。这意味着你创建的变量以后无法更改。这段代码虽然看起来没问题,但无法编译:
|
||||
|
||||
```
|
||||
fn main() {
|
||||
let n = 6;
|
||||
let n = 5;
|
||||
}
|
||||
```
|
||||
|
||||
但你可以使用关键字 `mut` 声明一个<ruby>可变<rt>mutable</rt></ruby>变量,因此下面这段代码可以编译成功:
|
||||
|
||||
```
|
||||
fn main() {
|
||||
let mut n = 6;
|
||||
println!("Value is {}", n);
|
||||
n = 5;
|
||||
println!("Value is {}", n);
|
||||
}
|
||||
```
|
||||
|
||||
### 编译
|
||||
|
||||
Rust 编译器,至少就其报错信息而言,是可用的最好的编译器之一。当你在 Rust 中出错时,编译器会真诚地告诉你做错了什么。实际上,仅通过从编译器错误消息中学习,我就了解了 Rust 的许多细微差别(就我理解到的 Rust 的任何细微差别而言)。即便有时错误消息太过于模糊,而不知所以然,互联网搜索几乎总能得到解释。
|
||||
|
||||
启动 Rust 程序的最简单方法是使用 `cargo`,它是 Rust 的包管理和构建系统。
|
||||
|
||||
```
|
||||
$ mkdir myproject
|
||||
$ cd myproject
|
||||
$ cargo init
|
||||
```
|
||||
|
||||
以上命令为项目创建了基本的基础架构,最值得注意的是 `src` 子目录中的 `main.rs` 文件。打开此文件,把我为本文生成的示例代码粘贴进去:
|
||||
|
||||
```
|
||||
struct Penguin {
|
||||
genus: String,
|
||||
species: String,
|
||||
extinct: bool,
|
||||
classified: u64,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let p = Penguin { genus: "Pygoscelis".to_owned(), species: "R adeliæ".to_owned(), extinct: false, classified: 1841 };
|
||||
printer(p);
|
||||
foo();
|
||||
}
|
||||
|
||||
fn printer(p: Penguin) {
|
||||
println!("Species: {}", p.species);
|
||||
println!("Genus: {}", p.genus);
|
||||
println!("Classified in {}", p.classified);
|
||||
if p.extinct == true {
|
||||
println!("Sadly this penguin has been made extinct.");
|
||||
}
|
||||
}
|
||||
|
||||
fn foo() {
|
||||
let mut n = 6;
|
||||
println!("Value is {}", n);
|
||||
n = 8;
|
||||
println!("Eight is written as {}", n);
|
||||
}
|
||||
```
|
||||
|
||||
使用 `cargo build` 命令进行编译:
|
||||
|
||||
```
|
||||
$ cargo build
|
||||
```
|
||||
|
||||
执行 `target` 子目录下的二进制程序,或者直接运行 `cargo run` 命令来运行你的项目:
|
||||
|
||||
```
|
||||
$ cargo run
|
||||
Species: R adeliæ
|
||||
Genus: Pygoscelis
|
||||
Classified in 1841
|
||||
Value is 6
|
||||
Eight is written as 8
|
||||
```
|
||||
|
||||
### Crates
|
||||
|
||||
任何语言的大部分便利都来自于它的库或模块。在 Rust 中,进行分发和跟踪的库称为 “crate”(箱子)。[crates.io][4] 是一个很好的社区 crate 注册网站。
|
||||
|
||||
把一个 crate 添加到你的 Rust 项目,首先要在 `Cargo.toml` 文件中添加这个 crate。例如,要安装随机数函数,我使用名为 `rand` 的 crate,使用 `*` 作为通配符,以确保在编译时获得最新版本:
|
||||
|
||||
```
|
||||
[package]
|
||||
name = "myproject"
|
||||
version = "0.1.0"
|
||||
authors = ["Seth <seth@opensource.com>"]
|
||||
edition = "2022"
|
||||
|
||||
[dependencies]
|
||||
rand = "*"
|
||||
```
|
||||
|
||||
在 Rust 代码中使用它需要在最顶行使用 `use` 语句:
|
||||
|
||||
```
|
||||
use rand::Rng;
|
||||
```
|
||||
|
||||
以下是一些创建随机种子和随机范围的示例代码:
|
||||
|
||||
```
|
||||
fn foo() {
|
||||
let mut rng = rand::thread_rng();
|
||||
let mut n = rng.gen_range(1..99);
|
||||
|
||||
println!("Value is {}", n);
|
||||
n = rng.gen_range(1..99);
|
||||
println!("Value is {}", n);
|
||||
}
|
||||
```
|
||||
|
||||
你可以使用 `cargo run` 来运行它,它会检测代码是否被更改并触发一个新的构建。构建过程中下载名为 `rand` 的 `crete` 和它依赖的所有 `crate`,编译代码,然后运行它:
|
||||
|
||||
```
|
||||
$ cargo run
|
||||
Updating crates.io index
|
||||
Downloaded ppv-lite86 v0.2.16
|
||||
Downloaded 1 crate (22.2 KB) in 1.40s
|
||||
Compiling libc v0.2.112
|
||||
Compiling cfg-if v1.0.0
|
||||
Compiling ppv-lite86 v0.2.16
|
||||
Compiling getrandom v0.2.3
|
||||
Compiling rand_core v0.6.3
|
||||
Compiling rand_chacha v0.3.1
|
||||
Compiling rand v0.8.4
|
||||
Compiling rustpenguin v0.1.0 (/home/sek/Demo/rustpenguin)
|
||||
Finished dev [unoptimized + debuginfo] target(s) in 13.97s
|
||||
Running `target/debug/rustpenguin`
|
||||
|
||||
Species: R adeliæ
|
||||
Genus: Pygoscelis
|
||||
Classified in 1841
|
||||
Value is 70
|
||||
Value is 35
|
||||
```
|
||||
|
||||
### Rust 速查表
|
||||
|
||||
Rust 是一门令人非常愉快的语言。集成了在线注册网站、有用的编译器和几乎直观的语法,它给人的适当的现代感。
|
||||
|
||||
但请不要误会,Rust 仍是一门复杂的语言,它具有严格的数据类型、强作用域变量和许多内置方法。Rust 值得一看,如果你要探索它,那么你应该下载我们的免费 [Rust 速查表][6],以便快速了解基础知识。越早开始,就越早了解 Rust。当然,你应该经常练习以避免生疏。
|
||||
|
||||
> **[Rust 速查表][6]**
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/22/1/rust-cheat-sheet
|
||||
|
||||
作者:[Seth Kenlon][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[hanszhao80](https://github.com/hanszhao80)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/seth
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/coverimage_cheat_sheet.png?itok=lYkNKieP (Cheat Sheet cover image)
|
||||
[2]: https://opensource.com/article/20/5/rust-java
|
||||
[3]: http://rust-lang.org
|
||||
[4]: https://crates.io/
|
||||
[5]: mailto:seth@opensource.com
|
||||
[6]: https://opensource.com/downloads/rust-cheat-sheet
|
@ -0,0 +1,100 @@
|
||||
[#]: subject: "5 levels of transparency for open source communities"
|
||||
[#]: via: "https://opensource.com/article/22/2/transparency-open-source-communities"
|
||||
[#]: author: "Emilio Galeano Gryciuk https://opensource.com/users/egaleano"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "aREversez"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14596-1.html"
|
||||
|
||||
开源社区透明度的五个层次
|
||||
======
|
||||
|
||||
> 如果想让开源社区繁荣发展,管理者需要达到透明度的五个层次。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202205/15/150842yrvm9v5qbbd7a355.jpg)
|
||||
|
||||
开源社区的管理者必须意识到社区有五个层次的透明度,这对于建设繁荣发展的开源社区来说至关重要。
|
||||
|
||||
本文将详细介绍各个层次及其目标与作用。不过首先,我想谈一谈透明度对开源社区的重要性。
|
||||
|
||||
### 为什么开源社区需要保证透明度?
|
||||
|
||||
* 透明能够增进社区成员之间的信任,促进合作。
|
||||
* 开放是社区合作和交流的前提。
|
||||
* 只有在开放透明的环境下,开源工作才能避免矛盾与冲突。
|
||||
* 社区管理者需要向参与者报告社区情况。
|
||||
* 向成员公开社区各项情况,营造信任氛围,有利于社区健康发展。
|
||||
|
||||
### 透明度的五个层次
|
||||
|
||||
#### 层次一:发布源码
|
||||
|
||||
在这一层次,社区需要遵循 [OSI 认可的许可证][2],在 [Git][3] 等公开的版本控制系统上发布源码。
|
||||
|
||||
层次一的目标在于创建开源项目。
|
||||
|
||||
* 建立开源社区,理应达到这一层次。因为没有公开源代码,也就无所谓开源项目。
|
||||
* 开源项目的核心便是参与者们编写的源码,并在 OSI 批准的许可证下授权。
|
||||
* 公开的版本控制系统能够促进合作,使得每一位开发者都能了解项目情况,理解合作模式。
|
||||
|
||||
#### 层次二:发布社区指南
|
||||
|
||||
达到这一层次,需要发布相关文档以及资源。也可通过组织活动来指导社区成员。
|
||||
|
||||
层次二的目标在于为一个开源项目建立和发展一个开源社区。
|
||||
|
||||
* 建立一个活跃的社区需要的不仅仅是源代码。
|
||||
* 公开项目开展方式和贡献方式,能够吸引更多的开发者参与到项目当中。
|
||||
* 为了推动社区的发展,管理者可能需要举办一些重要活动,并为贡献者们筹办一些特殊的活动。
|
||||
|
||||
#### 层次三:继往开来
|
||||
|
||||
到了这个层次,管理者有必要分享自己对于社区的见解,发布项目进展情况报告。
|
||||
|
||||
层次三的目标在于继往开来,确保社区进入后续阶段后能够更上一层楼,实现长远发展。
|
||||
|
||||
* 随着开源社区的发展,社区内的情况将会越来越难以把握。
|
||||
* 公开社区活动,让成员意识到自己的付出能够为公众所见,为公众所识。
|
||||
* 在这一层次,无论是报告还是分析,发布的时间并不固定,使用的工具也无定法。
|
||||
|
||||
#### 层次四:掌握社区的动态
|
||||
|
||||
这一层次就在于倾听社区声音:通过观察社区活动,关注项目发展;跟进软件开发进度,据此采取合适的应对措施。
|
||||
|
||||
层次四的目标在于保持科学严谨的态度,持续把握社区的发展情况及发展轨迹,引导社区朝着下一个层次迈进。
|
||||
|
||||
* 建立报告机制,运用分析工具,掌握社区动态。
|
||||
* 将社区的各项活动与社区成员的反响与基线和社区内的其他活动进行比较。
|
||||
* 坚持倾听社区声音,形成对于社区更深刻的见解。
|
||||
|
||||
#### 层次五:维护社区,长久发展
|
||||
|
||||
最后一个层次就是依据社区各项指标,提高社区成员的参与度。
|
||||
|
||||
层次五的目标在于制定行之有效、能够产生积极影响的决策方案,让开发者更好地参与社区项目。
|
||||
|
||||
* 适当调整系统,以适应社区各项指标的变动。
|
||||
* 跟进这些变动,理解它们是如何通过各项指标和数据分析体现出来的。
|
||||
* 针对社区维护者与开发者,制定服务等级协议和问责制度,为其设立参与度目标,确保项目整体顺利进行。
|
||||
|
||||
### 总结
|
||||
|
||||
开源社区管理者需要做到上述五个层次,保证透明度,才能构建起一个繁荣发展的社区。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/22/2/transparency-open-source-communities
|
||||
|
||||
作者:[Emilio Galeano Gryciuk][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[aREversez](https://github.com/aREversez)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/egaleano
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/OSDC_dandelion_520x292.png?itok=-xhFQvUj (Person in a field of dandelions)
|
||||
[2]: https://opensource.org/licenses
|
||||
[3]: https://opensource.com/tags/git
|
@ -0,0 +1,120 @@
|
||||
[#]: subject: "Crop and resize photos on Linux with Gwenview"
|
||||
[#]: via: "https://opensource.com/article/22/2/crop-resize-photos-gwenview-kde"
|
||||
[#]: author: "Seth Kenlon https://opensource.com/users/seth"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14550-1.html"
|
||||
|
||||
用 Gwenview 在 Linux 上裁剪和调整照片大小
|
||||
======
|
||||
|
||||
> Gwenview 是一个优秀的照片编辑器,适合业余摄影师在 Linux KDE 桌面上使用。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202205/05/221207dtkjbbe1jets7n3u.jpg)
|
||||
|
||||
一张好的照片可以蕴含很多信息。表面上它表达了你所看到的,但它也讲述了你所经历的。细微之处也能说明很多问题:你在拍照时选择的角度、取景中隐约可见的的东西有多大,以及,相比之下,那些有意识选择忽略的部分。
|
||||
|
||||
照片通常并不意味着记录真实发生的事情,相反,它们会成为你(摄影师)如何看待发生的事情的洞察力。
|
||||
|
||||
这就是照片编辑如此普遍的原因之一。当你把照片发布到你的在线图片库或社交网络时,你不应该发布一张不能准确表达照片所包含的感受的照片。但同样的道理,你也不应该成为一个专业的照片合成师,而只是为了剪掉在最后时刻将头伸进你的家庭快照的路人。如果你使用的是 KDE,你可以使用 Gwenview 这种休闲照片编辑器。
|
||||
|
||||
### 在 Linux 上安装 Gwenview
|
||||
|
||||
如果你正在运行 KDE Plasma 桌面,你可能已经安装了 Gwenview。如果你没有安装,或者你正在使用一个不同的桌面,而你想尝试 Gwenview,那么你可以用你的软件包管理器安装它。
|
||||
|
||||
我建议同时安装 Gwenview 和 Kipi 插件集,它可以将 Gwenview 与几个在线照片服务连接起来,这样你就可以轻松上传照片。在 Fedora、Mageia 和类似发行版上:
|
||||
|
||||
```
|
||||
$ sudo dnf install gwenview kipi-plugins
|
||||
```
|
||||
|
||||
在 Debian、Elementary 和类似版本上:
|
||||
|
||||
```
|
||||
$ sudo apt install gwenview kipi-plugins
|
||||
```
|
||||
|
||||
### 使用 Gwenview
|
||||
|
||||
Gwenview 通常有两种启动方式。你可以在 Dolphin 中点击图片文件,并选择在 Gwenview 中打开它;或者你可以启动 Gwenview,并在文件夹中寻找照片,Gwenview 或多或少可以充当你的文件管理器。第一种方法是直接的方法,很适合快速方便地预览图片文件。第二种方法是当你浏览大量照片,不确定哪一个版本的照片是“正确的”时,你可能会使用。
|
||||
|
||||
无论你如何启动 Gwenview,界面和功能都是一样的:右边有一个工作区,左边有一个面板。
|
||||
|
||||
![Gwenview][2]
|
||||
|
||||
(Seth Kenlon [CC BY-SA 4.0][3], Photo courtesy [Andrea De Santis][4])
|
||||
|
||||
在左边的面板下面,有三个标签:
|
||||
|
||||
* <ruby>文件夹<rt>Folders</rt></ruby>:显示你电脑上的文件夹的树状视图,以便你可以浏览你的文件,寻找更多的照片。
|
||||
* <ruby>信息<rt>Information</rt></ruby>:提供关于你目前正在查看的照片的元数据。
|
||||
* <ruby>操作<rt>Operations</rt></ruby>:允许你对当前的照片进行小的修改,如在横向和纵向之间旋转、调整大小和裁剪等。
|
||||
|
||||
Gwenview 能理解文件系统,所以你可以按键盘上的**右**或**左**箭头,查看文件夹中的上一张或下一张照片。
|
||||
|
||||
要离开单张照片视图并查看一个文件夹中的所有图片,请点击顶部工具栏中的“<ruby>浏览<rt>Browse</rt></ruby>”按钮。
|
||||
|
||||
![Browsing photos in a folder][5]
|
||||
|
||||
(Seth Kenlon,[CC BY-SA 4.0][3])
|
||||
|
||||
你也可以同时拥有两种视图。点击 Gwenview 底部的“<ruby>缩略图栏<rt>Thumbnail Bar</rt></ruby>”按钮,可以以电影胶片的形式看到当前文件夹中的其他图片,而当前选择的照片则在主面板中。
|
||||
|
||||
![Thumbnail view][6]
|
||||
|
||||
(Seth Kenlon,[CC BY-SA 4.0][3])
|
||||
|
||||
### 用 Gwenview 编辑照片
|
||||
|
||||
数码照片是很常见的,因此在网上发布或与朋友分享之前,需要对照片进行细微的调整也是同样常见。有非常好的应用可以编辑照片,事实上,其中最好的一个是另一个 KDE 应用,叫做 Krita(你可以在我的 [给摄影者的 Krita][7] 文章中阅读我如何使用它来处理照片),但是小的调整不应该需要艺术学位。这正是 Gwenview 所确保的:用一个休闲但功能强大的应用进行简单而快速的照片调整,并与你的 Plasma 桌面的其他部分整合。
|
||||
|
||||
我们大多数人对照片进行的最常见的调整是:
|
||||
|
||||
* **旋转**:当你的相机没有提供正确的元数据让你的电脑知道一张照片是要以横向还是纵向观看时,你可以手动修复它。
|
||||
* **镜像**:许多笔记本电脑或面部摄像头模仿镜子,这很有用,因为这是我们习惯于看到自己的方式。但是,它会使文字逆转。**镜像**功能可以从右到左翻转图像。
|
||||
* **翻转**:在数码相机和笔记本电脑上不太常见,但在手机上,无论你怎么拿手机,使用倒置设备拍照的现象在屏幕翻转的手机中并不少见。**翻转**功能可将图像旋转 180 度。
|
||||
* **调整大小**:数字图像现在通常具有超高清尺寸,有时这比你需要的要多得多。如果你通过电子邮件发送照片或将其发布在你想要优化加载时间的网页上,你可以将尺寸(和相应的文件大小)缩小到更小的尺寸。
|
||||
* **裁剪**:你有一张很棒的自己的照片,但不小心偶然发现了一个你认为不合适的人。用裁剪工具剪掉你不想要的所有东西。
|
||||
* **红眼**:当你的视网膜将相机的闪光灯反射回相机时,会得到红眼效果。Gwenview 可以通过在可调节区域中对红色通道进行去饱和和变暗来减少这种情况。
|
||||
|
||||
所有这些工具都在“<ruby>操作<rt>Operations</rt></ruby>”侧面板或“<ruby>编辑<rt>Edit</rt></ruby>”菜单中可用。这些操作具有破坏性,因此在你进行更改后,单击“<ruby>另存为<rt>Save As</rt></ruby>”以保存图像的 _副本_。
|
||||
|
||||
![Cropping a photo in Gwenview][8]
|
||||
|
||||
(Seth Kenlon,[CC BY-SA 4.0][3],照片由 [Elise Wilcox][9] 提供)
|
||||
|
||||
### 分享照片
|
||||
|
||||
当你准备好分享照片时,单击顶部工具栏中的“<ruby>分享<rt>Share</rt></ruby>”按钮,或转到“<ruby>插件<rt>Plugins</rt></ruby>”菜单并选择“<ruby>导出<rt>Export</rt></ruby>”。Gwenview 与 Kipi 插件集成在一起,可以在 [Nextcloud][10]、[Piwigo][11]、普通旧电子邮件以及 Google Drive、Flickr、Dropbox 等服务共享照片。
|
||||
|
||||
### Linux 上的照片编辑要点
|
||||
|
||||
Gwenview 拥有桌面照片管理器的所有必需功能。如果你需要的不仅仅是基本功能,你可以在 Krita 或 [Digikam][12] 中打开一张照片,并根据需要进行重大修改。对于其他一切,从浏览、排名、标记和小调整,Gwenview 都很方便。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/22/2/crop-resize-photos-gwenview-kde
|
||||
|
||||
作者:[Seth Kenlon][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/seth
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/design_photo_art_polaroids.png?itok=SqPLgWxJ (Polaroids and palm trees)
|
||||
[2]: https://opensource.com/sites/default/files/kde-gwenview-ui.jpg (Gwenview)
|
||||
[3]: https://creativecommons.org/licenses/by-sa/4.0/
|
||||
[4]: http://unsplash.com/@santesson89
|
||||
[5]: https://opensource.com/sites/default/files/kde-gwenview-browse.jpg (Browsing photos in a folder)
|
||||
[6]: https://opensource.com/sites/default/files/kde-gwenview-thumbnail.jpg (Thumbnail view)
|
||||
[7]: https://opensource.com/article/21/12/open-source-photo-editing-krita
|
||||
[8]: https://opensource.com/sites/default/files/kde-gwenview-crop.jpg (Cropping a photo in Gwenview)
|
||||
[9]: http://unsplash.com/@elise_outside
|
||||
[10]: https://opensource.com/article/20/7/nextcloud
|
||||
[11]: https://opensource.com/alternatives/google-photos
|
||||
[12]: https://opensource.com/life/16/5/how-use-digikam-photo-management
|
179
published/20220221 3 steps to start running containers today.md
Normal file
179
published/20220221 3 steps to start running containers today.md
Normal file
@ -0,0 +1,179 @@
|
||||
[#]: subject: "3 steps to start running containers today"
|
||||
[#]: via: "https://opensource.com/article/22/2/start-running-containers"
|
||||
[#]: author: "Seth Kenlon https://opensource.com/users/seth"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "MjSeven"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14584-1.html"
|
||||
|
||||
当下运行容器的 3 个步骤
|
||||
======
|
||||
|
||||
> 在本教程中,你将学习如何在一个“吊舱”中运行两个容器来托管一个 WordPress 站点。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202205/12/121429y2s9v96rxxk2litk.jpg)
|
||||
|
||||
无论你是将其作为工作的一部分、未来的工作机会或者仅仅是出于对新技术的兴趣,容器对很多人,即使是经验丰富的系统管理员,可能是非常难以应付的。那么如何真正开始使用容器呢?从容器到 [Kubernetes][2] 的成长路径是什么?另外,为什么有不止一条路径?如你所料,最好的起点就是现在。
|
||||
|
||||
### 1、了解容器
|
||||
|
||||
略一回忆,容器的开端可以追溯到早期 BSD 及其特殊的 chroot 监狱,但让我们直接跳到发展中期讲起。
|
||||
|
||||
之前,Linux 内核引入了 “<ruby>控制组<rt>cgroup</rt></ruby>”,允许你能够使用 “<ruby>命名空间<rt>namespace</rt></ruby>” 来“标记”进程。当你将进程分组到一个命名空间时,这些进程的行为就像在命名空间之外的东西不存在一样,这就像你把这些进程放入某种容器中。当然,这种容器是虚拟的,它位于计算机内部,它和你操作系统的其余进程使用相同的内核、内存和 CPU,但你用容器包含了这些进程。
|
||||
|
||||
分发的预制容器仅包含运行它所包含的应用程序必须的内容。使用容器引擎,如 [Podman][3]、Docker 或 CRI-O,你可以运行一个容器化应用程序,而无需进行传统意义上的安装。容器引擎通常是跨平台的,因此即使容器运行在 Linux 上,你也可以在其他 Linux、MacOS 或 Windows 上启动容器。
|
||||
|
||||
更重要的是,当需求量很大时,你可以运行同一应用程序的多个容器。
|
||||
|
||||
现在你知道了什么是容器,下一步是运行一个容器。
|
||||
|
||||
### 2、运行一个容器
|
||||
|
||||
在运行容器之前,你应该有一个想要运行它的理由。你可以编一个,这有助于你对让容器创建过程感兴趣,这样你就会受到鼓舞,真正去使用你所运行的容器。毕竟,运行容器但不使用它提供的应用程序,只能证明你没有注意到任何故障,但使用容器证明它可以工作。
|
||||
|
||||
我推荐从 WordPress 开始,它是一个很流行的 Web 应用程序,容易使用,所以一旦容器运行起来,你就可以测试使用它。虽然你可以轻松地配置一个 WordPress 容器,但还是有很多配置选项可以引导你发现更多运行容器的方式(例如运行数据库容器)以及容器如何通信。
|
||||
|
||||
我使用 Podman,它是一个友好、方便且无守护进程的容器引擎。如果你没有安装 Podman,可以改用 Docker 命令。它们都是很棒的开源容器引擎,而且它们的语法是相同的(只需输入 `docker` 而不是 `podman`)。因为 Podman 没有守护进程,所以它需要更多的配置,但为了这种运行免 root、无守护进程的容器的能力是值得的。
|
||||
|
||||
如果你使用 Docker,可以跳到下面的 [运行 WordPress 容器][5] 小节,否则,打开终端安装并配置 Podman:
|
||||
|
||||
```
|
||||
$ sudo dnf install podman
|
||||
```
|
||||
|
||||
容器会产生许多进程,通常只有 root 用户有权创建数千个进程 ID。创建一个名为 `/etc/subuid` 的文件,定义一个适当的起始 UID 和大量合法的 PID,这样就可以为你添加一些额外的进程 ID:
|
||||
|
||||
```
|
||||
seth:200000:165536
|
||||
```
|
||||
|
||||
在名为 `/etc/subgid` 的文件中对你的组执行相同的操作。在这个例子中,我的主要组是 `staff`(对你来说可能是 `users`,或者和你的用户名一样,这取决于你的系统)。
|
||||
|
||||
```
|
||||
staff:200000:165536
|
||||
```
|
||||
|
||||
最后,确认你的用户可以管理很多命名空间:
|
||||
|
||||
```
|
||||
$ sysctl --all --pattern user_namespaces
|
||||
user.max_user_namespaces = 28633
|
||||
```
|
||||
|
||||
如果你的用户无权管理超过 28,000 个命名空间,创建 `/etc/sysctl.d/userns.conf` 文件来增加数量并输入:
|
||||
|
||||
```
|
||||
user.max_user_namespaces=28633
|
||||
```
|
||||
|
||||
#### 运行 WordPress 容器
|
||||
|
||||
现在,无论你使用的是 Podman 还是 Docker,你都可以从在线容器仓库中下载 WordPress 容器并运行它。你可以使用以下 Podman 命令完成所有这些操作:
|
||||
|
||||
```
|
||||
$ podman run --name mypress \
|
||||
-p 8080:80 -d wordpress
|
||||
```
|
||||
|
||||
给 Podman 一会时间来找到容器、从互联网下载它,然后启动。
|
||||
|
||||
在收到终端返回提示符后,启动 Web 浏览器,打开 `localhost:8080`。WordPress 正在运行,等待你进行设置。
|
||||
|
||||
![WordPress 容器][6]
|
||||
|
||||
不过,你很快就会遇到障碍,因为 WordPress 使用数据库来存储数据,因此你需要为其提供一个数据库。
|
||||
|
||||
在继续之前,停止并删除 WordPress 容器:
|
||||
|
||||
```
|
||||
$ podman stop mypress
|
||||
$ podman rm mypress
|
||||
```
|
||||
|
||||
### 3、在吊舱中运行容器
|
||||
|
||||
正如名字所暗示的那样,容器在设计上是独立的。在容器中运行的应用程序不应该与在容器外的应用程序或基础设施进行交互。因此,当一个容器需要另一个容器才能运行时,一种解决方案是将这两个容器放在一个更大的容器中,称为 “<ruby>吊舱<rt>pod</rt></ruby>”。吊舱确保其容器可以共享重要的命名空间以便相互通信。
|
||||
|
||||
创建一个新的吊舱,为它提供一个名称,以及希望能够访问的端口:
|
||||
|
||||
```
|
||||
$ podman pod create \
|
||||
--name wp_pod \
|
||||
--publish 8080:80
|
||||
```
|
||||
|
||||
确认吊舱存在:
|
||||
|
||||
```
|
||||
$ podman pod list
|
||||
POD ID NAME STATUS INFRA ID # OF CONTAINERS
|
||||
100e138a29bd wp_pod Created 22ace92df3ef 1
|
||||
```
|
||||
#### 将容器添加到吊舱
|
||||
|
||||
现在你已经为相互依赖的容器创建了一个吊舱,你可以通过指定一个运行的吊舱来启动每个容器。
|
||||
|
||||
首先,启动一个数据库容器。你可以创建自己的凭据,只要在 WordPress 连接到数据库时使用相同的凭据。
|
||||
|
||||
```
|
||||
$ podman run --detach \
|
||||
--pod wp_pod \
|
||||
--restart=always \
|
||||
-e MYSQL_ROOT_PASSWORD="badpassword0" \
|
||||
-e MYSQL_DATABASE="wp_db" \
|
||||
-e MYSQL_USER="tux" \
|
||||
-e MYSQL_PASSWORD="badpassword1" \
|
||||
--name=wp_db mariadb
|
||||
```
|
||||
|
||||
接下来,在同一个吊舱中启动 WordPress 容器:
|
||||
|
||||
```
|
||||
$ podman run --detach \
|
||||
--restart=always --pod=wp_pod \
|
||||
-e WORDPRESS_DB_NAME="wp_db" \
|
||||
-e WORDPRESS_DB_USER="tux" \
|
||||
-e WORDPRESS_DB_PASSWORD="badpassword1" \
|
||||
-e WORDPRESS_DB_HOST="127.0.0.1" \
|
||||
--name mypress wordpress
|
||||
```
|
||||
|
||||
现在启动你最喜欢的网络浏览器并打开 `localhost:8080`。
|
||||
|
||||
这一次,设置会正常进行。WordPress 会连接到数据库,因为你在启动容器时传递了这些环境变量。
|
||||
|
||||
![WordPress 启动][8]
|
||||
|
||||
创建用户账户后,你可以登录查看 WordPress 仪表板。
|
||||
|
||||
![WordPress dashboard running in a container][9]
|
||||
|
||||
### 下一步
|
||||
|
||||
你已经创建了两个容器,并在一个吊舱中运行了它们。你现在已经了解了如何在自己的服务器上运行容器及服务。如果你想迁移到云,容器非常适合你。使用像 Kubernetes 和 OpenShift 这样的工具,你可以自动化启动 [集群上的容器和吊舱][10]。如果你正在考虑采取下一步行动,阅读 Kevin Casey 的 [3 个开始使用 Kubernetes 的方法][11],并尝试他提到的 Minikube 教程。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/22/2/start-running-containers
|
||||
|
||||
作者:[Seth Kenlon][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[MjSeven](https://github.com/MjSeven)
|
||||
校对:[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/bus-containers.png?itok=d_4QhZxT (Shipping containers stacked)
|
||||
[2]: https://opensource.com/tags/kubernetes
|
||||
[3]: https://www.redhat.com/sysadmin/podman-guides-2020
|
||||
[4]: https://enterprisersproject.com/cheat-sheet-what-s-difference-between-pod-cluster-and-container
|
||||
[5]: tmp.1zBHYsK8TH#wp
|
||||
[6]: https://opensource.com/sites/default/files/uploads/podman-wordpress.jpg (WordPress running in a container)
|
||||
[7]: https://creativecommons.org/licenses/by-sa/4.0/
|
||||
[8]: https://opensource.com/sites/default/files/uploads/wordpress-setup.jpg (WordPress setup)
|
||||
[9]: https://opensource.com/sites/default/files/uploads/wordpress-welcome.jpg (WordPress dashboard running in a container)
|
||||
[10]: https://enterprisersproject.com/article/2020/9/pod-cluster-container-what-is-difference
|
||||
[11]: https://enterprisersproject.com/article/2019/11/kubernetes-3-ways-get-started
|
140
published/202203/20200330 Why I switched from Mac to Linux.md
Normal file
140
published/202203/20200330 Why I switched from Mac to Linux.md
Normal file
@ -0,0 +1,140 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14356-1.html)
|
||||
[#]: subject: (Why I switched from Mac to Linux)
|
||||
[#]: via: (https://opensource.com/article/20/3/mac-linux)
|
||||
[#]: author: (Lee Tusman https://opensource.com/users/leeto)
|
||||
|
||||
我为什么从 Mac 转到 Linux
|
||||
======
|
||||
|
||||
> 25 年后,我转到了 Linux,简直不能更爽了。以下是我的经历。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202203/14/093159h433g7j2ytz4g4xz.jpg)
|
||||
|
||||
1994 年,我的家人买了一台 Macintosh Performa 475 作为家用电脑。我在学校时曾使用过 Macintosh SE 电脑,并通过《[Mavis Beacon 教你打字][2]》学会了打字,所以我成为 Mac 用户已经超过 25 年了。早在上世纪 90 年代中期,我就被 Mac 的易用性所吸引。它不是以 DOS 命令提示符开始的;它打开的是一个友好的桌面。它很有趣。尽管 Macintosh 的软件比 PC 少得多,但我认为 Mac 的生态系统更好,就凭着 KidPix 和 Hypercard,我仍然认为它们是无与伦比的、最直观的 _创意工厂_。
|
||||
|
||||
即便如此,我仍然感觉到,与 Windows 相比,Mac 只是个弟弟。我曾觉得这个公司或许有一天会消失。但几十年后的今天,苹果已经成为一个庞然大物,一个价值万亿美元的公司。但随着发展,它发生了重大变化。有些变化是为了更好的发展,比如更好的稳定性,更简单的硬件选择,更高的安全性,以及更多的可访问性选项。其他的变化让我恼火 —— 不是一下子,而是慢慢地不满意。最重要的是,我对苹果的封闭生态系统感到厌烦 —— 没有 iPhoto 就很难访问照片;必须使用 iTunes;即使我不想使用苹果商店的生态系统,也得强制捆绑。
|
||||
|
||||
随着时间的推移,我发现自己主要是在终端上工作。我使用 iTerm2 和 [Homebrew][3] 软件包管理器。虽然我不能让我所有的 Linux 软件都工作,但大部分软件都工作了。我认为我拥有两个世界中最好的东西:macOS 的图形操作系统和用户界面,以及快速打开终端会话的能力。
|
||||
|
||||
后来,我开始使用通过 Raspbian 启动的树莓派电脑。我还收集了一些从大学的垃圾堆中抢救出来的非常旧的笔记本电脑,因此,出于需要,我决定尝试各种 Linux 发行版。虽然它们都没有成为我的主用机器,但我开始真正喜欢使用 Linux。我开始考虑尝试运行 Linux 发行版作为我的日常用机,但我认为 Macbook 的舒适性和便利性,特别是硬件的尺寸和重量,在非 Mac 笔记本电脑中很难找到。
|
||||
|
||||
### 是时候进行转换了?
|
||||
|
||||
大约两年前,我开始在工作中使用一台戴尔电脑。那是一台较大的笔记本电脑,集成了 GPU,可以双启动 Linux 和 Windows。我用它来进行游戏开发、3D 建模、一些机器学习,以及用 C# 和 Java 进行基本编程。我曾考虑把它作为我的主用机器,但我喜欢我的 Macbook Air 的便携性,所以也继续使用它。
|
||||
|
||||
去年秋天,我开始注意到我的 Air 运行时很热,而且风扇开得越来越频繁。我的主用机器开始显得垂垂老矣。多年来,我使用 Mac 的终端来访问类 Unix 的 Darwin 操作系统,我在终端和网页浏览器之间切换的时间越来越多。是时候进行转换了吗?
|
||||
|
||||
我开始探索一个类似 Macbook 的 Linux 笔记本电脑的可能性。在做了一些研究、阅读测评和留言板之后,我选择了长期以来备受赞誉的戴尔 XPS 13 开发者版 7390,选择了第十代 i7。我选择它是因为我喜欢 Macbook(尤其是超薄的 Macbook Air)的感觉,而对 XPS 13 的评论表明它似乎是类似的笔记本电脑,对其触控板和键盘的评价也真的很好。
|
||||
|
||||
最重要的是,它装载了 Ubuntu。虽然买一台电脑,擦掉它,然后安装一个新的 Linux 发行版是很容易的,但我被这种配合得当的操作系统和硬件所吸引,而且它允许我们进行大量的定制,就像我们在 Linux 中了解而喜爱的一样。因此,当有促销活动时,我毅然决然地购买了它。
|
||||
|
||||
### 每天运行 Linux 是什么感觉
|
||||
|
||||
如今,我使用 XPS 13 已经有三个月了,我的双启动的 Linux 工作笔记本也有两年了。起初,我以为我会花更多的时间寻找一个更像 Mac 的替代桌面环境或窗口管理器,比如 [Enlightenment][4]。我试过几个,但我不得不说,我喜欢开箱即用的 [GNOME][5] 的简单性。首先,它是精简的;没有太多的 GUI 元素会吸引你的注意力。事实上,它很直观,这份 [概览][6] 只需要几分钟就能看完。
|
||||
|
||||
我可以通过应用程序仪表盘或按网格排布的按钮访问我的应用程序,从而进入应用程序视图。要访问我的文件系统,我点击仪表盘上的“文件”图标。要打开 GNOME 终端,我输入 `Ctrl+Alt+T` 或者直接按下 `Alt+Tab` 来在打开的应用程序和打开的终端之间切换。定义你自己的 [自定义热键快捷方式][7] 也很容易。
|
||||
|
||||
除此以外,没有太多要说的。与 Mac 的桌面不同,没有那么多的东西会让人迷失,这意味着让我从工作或我想运行的应用程序中分心的东西更少。我没有看到我在 Mac 上浏览窗口的那么多选项,也不必在导航时花费那么多时间。在 Linux 中,只有文件、应用程序和终端。
|
||||
|
||||
我安装了 [i3 平铺式窗口管理器][8] 来做一个测试。我在配置上遇到了一些问题,因为我是用 [德沃夏克键盘][9] 键入的,而 i3 并不适应另一种键盘配置。我想,如果再努力一点,我可以在 i3 中找出一个新的键盘映射,但我主要想找的是简单的平铺功能。
|
||||
|
||||
我看了 GNOME 的平铺功能,并感到非常惊喜。你按下 `Super` 键(对我来说,就是有 Windows 标志的那个键 —— 我应该用贴纸盖住它!),然后按一个修饰键。例如,按 `Super + ←` 将你当前的窗口移动到屏幕左侧的贴片上。`Super + →` 移动到右半边。`Super + ↑` 使当前窗口最大化。`Super + ↓` 则恢复到之前的大小。你可以用 `Alt+Tab` 在应用程序窗口之间移动。这些都是默认行为,可以在键盘设置中自定义。
|
||||
|
||||
插上耳机或连接到 HDMI 的工作方式与你预期的一样。有时,我打开声音设置,在 HDMI 声音输出或我的外部音频线之间进行切换,就像我在 Mac 或 PC 上那样。触控板的反应很灵敏,我没有注意到与 Macbook 的有什么不同。当我插入一个三键鼠标时,它可以立即工作,即使是用我的蓝牙鼠标和键盘。
|
||||
|
||||
#### 软件
|
||||
|
||||
我在几分钟内安装了 Atom、VLC、Keybase、Brave 浏览器、Krita、Blender 和 Thunderbird。我在终端用 Apt 软件包管理器安装了其他软件(和平常一样),它比 macOS 的 Homebrew 软件包管理器提供了更多软件包。
|
||||
|
||||
#### 音乐
|
||||
|
||||
我有许多种听音乐的选择。我使用 Spotify 和 [PyRadio][10] 来串流播放音乐。[Rhythmbox][11] 在 Ubuntu 上是默认安装的;这个简单的音乐播放器可以立即启动,而且毫不臃肿。只需点击菜单,选择“添加音乐”,然后导航到一个音乐目录(它会递归搜索)。你也可以轻松地串流播客或在线广播。
|
||||
|
||||
#### 文本和 PDF
|
||||
|
||||
我倾向于在带有一些插件的 [Neovim][12] 中用 Markdown 写作,然后用 Pandoc 将我的文档转换为任何最终需要的格式。对于一个带有预览功能的漂亮的 Markdown 编辑器,我下载了 [Ghostwriter][13],一个最集中注意力的写作应用程序。
|
||||
|
||||
如果有人给我发了一个微软 Word 文档,我可以用默认的 LibreOffice Writer 应用程序打开它。
|
||||
|
||||
偶尔,我也要签署一份文件。用 macOS 的“预览”应用程序和我的 PNG 格式的签名,这很容易,我需要一个 Linux 的对应工具。我发现默认的 PDF 查看器应用程序没有我需要的注释工具。LibreOffice 绘图程序是可以接受的,但不是特别容易使用,而且它偶尔会崩溃。做了一些研究后,我安装了 [Xournal][14],它有我需要的简单的注释工具,可以添加日期、文字和我的签名,而且与 Mac 的预览程序相当。它完全能满足我的需要。
|
||||
|
||||
#### 从我的手机中导入图片
|
||||
|
||||
我有一个 iPhone。为了把我的图片从手机上拿下来,有很多方法可以同步和访问你的文件。如果你有一个不同的手机,你的过程可能是不同的。下面是我的方法:
|
||||
|
||||
1. 用 `sudo apt install gvfs-backends` 来安装 `gvfs-backends`,它是 GNOME 虚拟文件系统的一部分。
|
||||
2. 获取你的手机的序列号。将你的手机插入你的电脑,在你的 iPhone 上点击“信任”。在你电脑的终端输入:
|
||||
```
|
||||
lsusb -v 2> /dev/null | grep -e "Apple Inc" -A 2
|
||||
```
|
||||
(感谢 Stack Oveflow 用户 [complistic][15] 提供的这个代码技巧)。
|
||||
3. 现在打开你的文件系统。
|
||||
- 按 `Ctrl+L` 打开一个位置并输入:`afc://<你的序列号>`,(请替换 `<你的序列号>`)来打开并导航到你的 DCIM 文件夹。我的照片和视频在 DCIM 文件夹的五个子文件夹内,而不是在照片文件夹内。从这里你可以手动将它们移到你的电脑上。
|
||||
- 挂载手机文件系统后,你也可以在终端中通过以下方式导航到你的文件:
|
||||
```
|
||||
cd /run/user/1001/gvfs/afc:host=<你的序列号>
|
||||
```
|
||||
|
||||
#### 图形、照片、建模和游戏引擎
|
||||
|
||||
我是一名教育工作者,教授各种新媒体课程。我的许多同事和学生都订阅了价格昂贵的专有的 Adobe Creative Suite。我喜欢让我的学生知道他们还有其他选择。
|
||||
|
||||
对于绘图和图形编辑,我使用 [Krita][16]。这绝对是我的 Photoshop 替代品。对于插图工作,还有 [Inkscape][17] 和 Scribus 的出版软件。对于自动编辑,我使用命令行 [ImageMagick][18] 程序,它已经预装在 Ubuntu 中。
|
||||
|
||||
为了管理我的图像,我使用简单的 [Shotwell][19] 应用程序。
|
||||
|
||||
对于 3D 建模,我使用并教授开源的 [Blender][20] 软件。在我的学校,我们教 [Unity 3d][21],它有 Linux 版本。它运行良好,但我一直想试试 [Godot][22],一个开源的替代品。
|
||||
|
||||
#### 开发
|
||||
|
||||
我的 XPS 13 安装了 Chrome 和 Chromium。我还添加了 Firefox 和 [Brave][23] 浏览器。所有都和你在 Mac 或 PC 上习惯的一样。大多数时候,我在 Atom 中进行开发工作,有时在 Visual Studio Code 中进行,这两种软件都很容易安装在 Linux 上。Vim 已经预装在终端,而我首选的终端文本编辑器 Neovim,也很容易安装。
|
||||
|
||||
几周后,我开始尝试其他终端。我目前最喜欢的是 Enlightenment 基金会的 Terminology。首先,它允许你在终端中 [查看图片][24],这在 Mac 的终端中是很难做到的。
|
||||
|
||||
### 留在这里
|
||||
|
||||
我看不出自己会转回 Mac 作为我的日用电脑。现在,当我使用 Mac 时,我注意到超多的选项和运行一个应用程序或浏览某个地方所需的额外步骤。我还注意到它的运行速度有点慢,或许这只是我个人的感受?
|
||||
|
||||
现在我已经转到了一个开源的生态系统和 Linux,我很高兴,没有必要再转回去。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/20/3/mac-linux
|
||||
|
||||
作者:[Lee Tusman][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/leeto
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/code_computer_development_programming.png?itok=4OM29-82
|
||||
[2]: https://en.wikipedia.org/wiki/Mavis_Beacon_Teaches_Typing
|
||||
[3]: https://brew.sh/
|
||||
[4]: https://www.enlightenment.org/
|
||||
[5]: https://opensource.com/downloads/cheat-sheet-gnome-3
|
||||
[6]: https://help.gnome.org/users/gnome-help/stable/shell-introduction.html.en
|
||||
[7]: https://docs.fedoraproject.org/en-US/quick-docs/proc_setting-key-shortcut/
|
||||
[8]: https://opensource.com/article/18/9/i3-window-manager-cheat-sheet
|
||||
[9]: https://en.wikipedia.org/wiki/Dvorak_keyboard_layout
|
||||
[10]: https://opensource.com/article/19/11/pyradio
|
||||
[11]: https://wiki.gnome.org/Apps/Rhythmbox
|
||||
[12]: https://neovim.io/
|
||||
[13]: https://wereturtle.github.io/ghostwriter/
|
||||
[14]: http://xournal.sourceforge.net/
|
||||
[15]: https://stackoverflow.com/questions/19032162/is-there-a-way-since-ios-7s-release-to-get-the-udid-without-using-itunes-on-a/21522291#21522291
|
||||
[16]: https://opensource.com/article/19/4/design-posters
|
||||
[17]: https://opensource.com/article/19/1/inkscape-cheat-sheet
|
||||
[18]: https://opensource.com/article/17/8/imagemagick
|
||||
[19]: https://gitlab.gnome.org/GNOME/shotwell/
|
||||
[20]: https://opensource.com/article/18/4/5-best-blender-video-tutorials-beginners
|
||||
[21]: https://unity.com/
|
||||
[22]: https://opensource.com/article/17/12/get-started-developing-games-godot
|
||||
[23]: https://brave.com/
|
||||
[24]: https://www.enlightenment.org/about-terminology.md
|
@ -0,0 +1,255 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (hwlife)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14405-1.html)
|
||||
[#]: subject: (Set up a minimal server on a Raspberry Pi)
|
||||
[#]: via: (https://opensource.com/article/21/1/minimal-server-raspberry-pi)
|
||||
[#]: author: (Alan Formy-Duval https://opensource.com/users/alanfdoss)
|
||||
|
||||
在树莓派上创建一个最小化的服务器
|
||||
======
|
||||
|
||||
> 不要急着丢弃那台旧树莓派,这个详细步骤的指南展示了我怎样用最小化设置来充分利用我珍贵的树莓派系统资源。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202203/28/161221byrmba9ayvvmbbkx.jpg)
|
||||
|
||||
最近,我的 [树莓派][2] 上的 microSD 储存卡不工作了。它已经作为服务器持续使用将近两年了,这为我提供了一个开始探索和修正问题的好机会。在初始化安装完成以后,它开始出现一些磁盘方面的问题,并且官方的树莓派操作系统发布了一个有重大意义的更新(并从 Raspbian 更名为<ruby>树莓派操作系统<rt>Raspberr Pi OS</rt></ruby>)。所以我买了一个新的储存卡并开始重装。
|
||||
|
||||
尽管树莓派 3B 不是最新的硬件,但对于运行多样化服务的最小化的服务器还是足够的。我认为我之前的安装使用了完整的安装镜像,包括了图形用户界面和许多其他的软件包是没有必要的。
|
||||
|
||||
这个详细步骤的指南展示了我怎样用最小化设置来充分利用我珍贵的树莓派系统资源。
|
||||
|
||||
### 开始
|
||||
|
||||
首先,要为树莓派创建一个新的系统驱动器。这需要两样东西:系统镜像文件和一张 microSD 储存卡。
|
||||
|
||||
#### 下载树莓派系统镜像文件
|
||||
|
||||
虽然有好几种操作系统可供选择,但我坚持选择树莓派官方支持的系统。
|
||||
|
||||
第一步是从 [树莓派操作系统][3] 官方网站上下载最新的系统镜像文件到计算机,然后后写入储存卡。他们提供了三个不同的镜像,我选择了精简版。它是最小化的操作系统,只包含基本系统必要的文件,所以它占用最少的磁盘空间和系统内存。(当我下载系统的时候,发布日期是 2020 年 8 月 20 日,但是它现在肯定已经更新了。我觉得不会有什么巨大不同,但是我建议读一下发行说明。)
|
||||
|
||||
#### 将树莓派系统镜像写到储存卡
|
||||
|
||||
第二步是写下载的系统镜像到储存卡。我的卡之前用过,当我把它插入我的 Linux 桌面计算机之后,它自动加载了两个存在的分区。在我卸载这两个分区前,我不能写入镜像。
|
||||
|
||||
要这样做,我必须得用下面的 `lsblk` 命令来确定它们的路径,经确定,该设备路径为 `/dev/mmcblk0`:
|
||||
|
||||
```
|
||||
# lsblk -p
|
||||
```
|
||||
|
||||
我用 `umount` 命令卸载了这两个分区:
|
||||
|
||||
```
|
||||
# umount /dev/mmcblk0p2
|
||||
# umount /dev/mmcblk0p1
|
||||
```
|
||||
|
||||
一旦分区被卸载,就可以将镜像文件写入到储存卡了。尽管有许多图形化的写入工具,我还是习惯是用古老的 `dd` 命令:
|
||||
|
||||
```
|
||||
# dd bs=4M if=/home/alan/Downloads/raspios/2020-08-20-raspios-buster-armhf-lite.img of=/dev/mmcblk0 status=progress conv=fsync
|
||||
```
|
||||
|
||||
#### 启动树莓派
|
||||
|
||||
你只需要一个显示器、键盘、电源适配器来使用树莓派。我还有一个以太网网线用于网络连接,相比无线网络,我更喜欢通过网线来连接一个专用的服务器。
|
||||
|
||||
插入储存卡并打开树莓派的电源。一旦成功启动,用默认的缺省密码来进行登录:用户名 `pi`,密码`raspberry`。
|
||||
|
||||
### 系统设置
|
||||
|
||||
按照以下步骤尽可能最小化设置磁盘空间、内存使用等。我建议尽可能的花时间研究每个配置,使之尽量正确。通常有几种应用配置的方法,有些配置文件和选项可能会被丢弃,所以要查看产品文档确保你没有应用过时的配置。
|
||||
|
||||
#### 运行 raspi-config
|
||||
|
||||
树莓派系统的主设置程序叫做 `raspi-config`。登录以后立即运行它:
|
||||
|
||||
```
|
||||
# raspi-config
|
||||
```
|
||||
|
||||
![Raspberry Pi config main window][4]
|
||||
|
||||
它出现了一个扩展根文件系统的选项,可以利用储存卡上所有可利用的空间。选择这个选项之后,重启并重新登录。
|
||||
|
||||
用 `df` 命令来验证储存卡的总容量是否被完全使用:
|
||||
|
||||
```
|
||||
# df -h
|
||||
```
|
||||
|
||||
如果你需要设置其他选项,请再次运行 `raspi-config`。它们中的一些选项可以根据你的偏好和配置进行变化。仔细检查所有这些选项,确定没有任何遗漏。为了获得最佳性能,我建议做以下调整。(我跳过了一些我们没有做任何变化的选项。)
|
||||
|
||||
* <ruby>系统选项<rt>System options</rt></ruby>:在此你可以设置主机名,最好使用完全限定的域名(FQDN)。你也能在这里更改你的密码,这始终是强烈建议的。
|
||||
* <ruby>接口选项<rt>Interface options</rt></ruby>:开启 SSH 服务。
|
||||
* <ruby>性能选项<rt>Performance options</rt></ruby>:将 GPU 内存减少到最低值(16MB)。
|
||||
* <ruby>本地化选项<rt>Localization options</rt></ruby>:选择你的时区、位置、键盘类型。
|
||||
* <ruby>高级选项<rt>Advanced options</rt></ruby>:这个选项包括扩展根文件系统的选项。如果你在上面没扩展,一定要在这里做。这样你可以访问储存卡上的所有可用空间。
|
||||
* <ruby>更新<rt>Update</rt></ruby>:进入更新选项会立即检查 `raspi-config` 工具是否有更新。如果更新可用,它将被下载并应用,`raspi-config` 将在几秒钟后重启。
|
||||
|
||||
一旦你在 `raspi-config` 中完成这些配置,选择“<ruby>完成<rt>Finish</rt></ruby>”退出该工具。
|
||||
|
||||
#### 手动配置
|
||||
|
||||
我还建议几个其他更改,它们全都要求编辑某种配置文件来手动更改设置。
|
||||
|
||||
##### 设置静态 IP 地址
|
||||
|
||||
一般来说,最好用静态 IP 地址设置服务器。通过 `ip` 命令来验证网络接口,并设置 IP 地址和你的缺省网关(路由器)和域名服务(DNS)地址:
|
||||
|
||||
```
|
||||
# ip link
|
||||
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
|
||||
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
|
||||
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
|
||||
link/ether b8:27:eb:48:3f:46 brd ff:ff:ff:ff:ff:ff
|
||||
```
|
||||
|
||||
你还需要知道你的缺省网关和一个及以上的 DNS 服务器地址。将这些信息添加到 `/etc/dhcpcd.conf` 配置文件中(我强烈建议更改之前对这个文件做一个备份):
|
||||
|
||||
```
|
||||
# cd /etc
|
||||
# cp -a dhcpcd.conf dhcpcd.conf.original
|
||||
```
|
||||
|
||||
按照以下来编辑文件:
|
||||
|
||||
```
|
||||
# vi dhcpcd.conf
|
||||
|
||||
# static IP configuration:
|
||||
interface eth0
|
||||
static ip_address=192.168.1.5/24
|
||||
static routers=192.168.1.1
|
||||
static domain_name_servers=192.168.1.3 192.168.1.4
|
||||
```
|
||||
|
||||
##### 关闭 IPv6 协议
|
||||
|
||||
除非你有特别需要使用 IPv6,否则你可能倾向于禁用它。为此,你可以创建两个新文件,其中包括一个单行指令,指示 Linux 内核不要使用 IPv6。
|
||||
|
||||
首先,创建 `/etc/sysctl.d/disable-ipv6.conf` 文件,其中包含一行指令:
|
||||
|
||||
```
|
||||
# cd /etc/sysctl.d
|
||||
# echo "net.ipv6.conf.all.disable_ipv6 = 1" > disable-ipv6.conf
|
||||
```
|
||||
|
||||
然后创建 `/etc/modprobe.d/blacklist-ipv6.conf` 文件包含一行指令:
|
||||
|
||||
```
|
||||
# cd /etc/modprobe.d
|
||||
# echo "blacklist ipv6" > blacklist-ipv6.conf
|
||||
```
|
||||
|
||||
##### 关闭 Wi-Fi、蓝牙和音频
|
||||
|
||||
我的服务器的具体用途并不需要蓝牙和音频,同时,它用以太网连接,并不使用无线(Wi-Fi)。除非你计划用它们,否则按照以下步骤来关闭它们。
|
||||
|
||||
对 `/boot/config.txt` 这个文件做以下更改(再次强调,我建议为这个文件做个备份):
|
||||
|
||||
```
|
||||
# cd /boot
|
||||
# cp -a config.txt config.txt.original
|
||||
```
|
||||
|
||||
加入以下两个指令到文件底部来禁用蓝牙和 Wi-Fi:
|
||||
|
||||
* `dtoverlay=disable-bt`
|
||||
* `dtoverlay=disable-wifi`
|
||||
|
||||
这些 `echo` 命令就可以完成:
|
||||
|
||||
```
|
||||
# cd /boot
|
||||
# echo "dtoverlay=disable-bt" >> config.txt
|
||||
# echo "dtoverlay=disable-wifi" >> config.txt
|
||||
```
|
||||
|
||||
要关闭音频,更改 `dtparam=audio` 的参数为 `off`。你可以用一个简短的命令 `sed` 来完成:
|
||||
|
||||
```
|
||||
# sed -i '/dtparam=audio/c dtparam=audio=off' config.txt
|
||||
```
|
||||
|
||||
|
||||
最后一步是禁用 Wi-Fi 服务,用 `systemctl mask` 命令来操作:
|
||||
|
||||
```
|
||||
systemctl mask wpa_supplicant.service
|
||||
```
|
||||
|
||||
如果你不需要其他服务的话,也可以禁用它们:
|
||||
|
||||
* 禁用调制解调器服务:`systemctl disable hciuart`
|
||||
* 禁用 Avahi 守护进程:`systemctl disable avahi-daemon.service`
|
||||
|
||||
### 最后一步
|
||||
|
||||
检查你的内存使用量:
|
||||
|
||||
```
|
||||
# free -h
|
||||
```
|
||||
我震惊了:我的系统只用了 30MB 的内存。
|
||||
|
||||
创建个人账户:建议为登录这台服务器的个人创建用户账户。你能分配他们到 `sudo` 组允许他们运行管理命令。举个例子,创建一个用户名为 George 的一个账户。
|
||||
|
||||
```
|
||||
# adduser george
|
||||
# usermod -a -G adm,sudo,users george
|
||||
```
|
||||
|
||||
进行更新:这是一个重要的步骤。应用更新来获取树莓派操作系统的最新修复。
|
||||
|
||||
```
|
||||
# apt update
|
||||
# apt full-upgrade
|
||||
```
|
||||
|
||||
重启:重启你的新服务器是一个好主意:
|
||||
|
||||
```
|
||||
# systemctl reboot
|
||||
```
|
||||
|
||||
安装 Cockpit:你可以在树莓派系统上安装著名的 Linux Web 控制台 [Cockpit][5],它提供了一个基于 HTML 界面来远程管理和监控你的服务器。我最近写了一篇 [Cockpit 入门][6] 的文章。用这个命令来安装它
|
||||
|
||||
```
|
||||
# apt install cockpit
|
||||
```
|
||||
|
||||
现在我的树莓派服务器已经准备好托管服务器了,我能用它来做 [网页服务器][7]、[VPN 服务器][8]、 [Minetest][9] 等游戏服务器,或者就像我做的基于 [Pi-Hole 的广告屏蔽器][10] 。
|
||||
|
||||
### 保持旧硬件的活力
|
||||
|
||||
不论你有什么硬件,仔细地精简并控制你的操作系统和软件包,可以使你的系统资源使用量保持在低水平,以便你获得最大收益。这还可以通过减少试图利用漏洞的潜在恶意行为者可用的服务和软件包数量,提高了安全性。
|
||||
|
||||
因此,在你丢弃旧硬件之前,考虑一下能够继续使用的各种可能性。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/1/minimal-server-raspberry-pi
|
||||
|
||||
作者:[Alan Formy-Duval][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[hwlife](https://github.com/hwlife)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/alanfdoss
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/RaspberryPi.SUNY_.jpg?itok=uS_-VUcb (Raspberry Pi board Model B)
|
||||
[2]: https://opensource.com/resources/raspberry-pi
|
||||
[3]: https://www.raspberrypi.org/software/operating-systems
|
||||
[4]: https://opensource.com/sites/default/files/uploads/raspi-config-main.png (Raspberry Pi config main window)
|
||||
[5]: https://cockpit-project.org/
|
||||
[6]: https://opensource.com/article/20/11/cockpit-server-management
|
||||
[7]: https://opensource.com/article/17/3/building-personal-web-server-raspberry-pi-3
|
||||
[8]: https://opensource.com/article/19/6/raspberry-pi-vpn-server
|
||||
[9]: https://github.com/minetest
|
||||
[10]: https://opensource.com/article/18/2/block-ads-raspberry-pi
|
@ -0,0 +1,166 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (amagicboy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14398-1.html)
|
||||
[#]: subject: (How to Uninstall Applications from Ubuntu Linux)
|
||||
[#]: via: (https://itsfoss.com/uninstall-programs-ubuntu/)
|
||||
[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
|
||||
|
||||
初级:Ubuntu 中怎么卸载 Linux 应用
|
||||
=======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202203/26/151617chxhdszd0lcpcpkz.jpg)
|
||||
|
||||
不再使用某个应用程序了?删除它吧。
|
||||
|
||||
卸载不再使用的应用是 [最简单释放磁盘空间的方法][1] ,而且可以使系统保持整洁。
|
||||
|
||||
在此篇入门教程中,我会介绍几种不同在 Ubuntu 上卸载应用程序的方法。
|
||||
|
||||
在 Ubuntu 中有几种方法 [安装应用][2] ,同意也有以下几种方法卸载应用:
|
||||
|
||||
- 从 Ubuntu <ruby>软件中心<rt>Software Center</rt></ruby> 卸载应用(桌面用户)
|
||||
- 用 `apt remove` 命令卸载应用
|
||||
- 用命令行中删除 Snap 应用(中级到高级用户)
|
||||
|
||||
让我们来一个一个了解这些方法。
|
||||
|
||||
### 方法 1:用 Ubuntu 软件中心卸载应用
|
||||
|
||||
在左侧栏或者菜单中找到 Ubuntu <ruby>软件中心<rt>Software Center</rt></ruby>,打开它。
|
||||
|
||||
![][3]
|
||||
|
||||
在 <ruby>已安装<rt>Installed</rt></ruby> 栏中列出了已安装的应用。
|
||||
|
||||
![][4]
|
||||
|
||||
如果你要找的应用不在 <ruby>已安装<rt>Installed</rt></ruby> 栏中,可以使用搜索查找应用。
|
||||
|
||||
![][5]
|
||||
|
||||
打开已经安装的应用,有一个 <ruby>移除<rt>Remove</rt></ruby> 选项,点击它。
|
||||
|
||||
![][6]
|
||||
|
||||
这会请求输入账户密码,输入后应用会在几秒内删除。
|
||||
|
||||
### 方法2: Ubuntu 命令行卸载应用
|
||||
|
||||
安装应用时使用 `apt-get install` 或者 `apt install` 。
|
||||
卸载应用时使用 `apt-get remove` 或者 `apt remove` ,而不是 `apt-get uninstall` 。
|
||||
|
||||
按照以下方式使用命令:
|
||||
|
||||
```
|
||||
sudo apt remove program_name
|
||||
```
|
||||
|
||||
执行此操作会请求你的账户密码。当输入密码时,屏幕上不会有提示。输入完后按下回车。
|
||||
|
||||
待删除的应用不会立刻被删除。你需要确认。当询问你的确认时,请输入回车或者按下 `Y`:
|
||||
|
||||
![][7]
|
||||
|
||||
请在命令行中输入准确的包的名字,不然会出现 “[不能找到软件包的错误][8]” 错误 。
|
||||
|
||||
不要担心记不住具体的应用名字,你可以使用超级有用的 Tab 补全应用名称。 Tab 是你必须知道的 [Linux 命令行技巧][9] 之一。
|
||||
|
||||
你只需要输入想要卸载应用的前几个字母,然后按下 `tab` ,会提示以这几个字母开头的已安装应用程序。
|
||||
|
||||
找到要卸载的应用名称,输入完整的应用名称然后卸载。
|
||||
|
||||
![][10]
|
||||
|
||||
如果不知道具体的应用名称或者开头字母,你可以 [列出 Ubuntu 中所有已安装的包][11] ,然后查找符合你记忆的应用名称。
|
||||
|
||||
比如,下图的命令会列出所有已安装的应用名称中包含 ‘my’ 的应用,不仅仅是以 ‘my’ 开头的应用。
|
||||
|
||||
```
|
||||
apt list --installed | grep -i my
|
||||
```
|
||||
|
||||
![][12]
|
||||
|
||||
这非常酷炫对不对?在 Ubuntu 中使用卸载命令时请注意应用名。
|
||||
|
||||
#### 补充:使用 apt purge 卸载应用(进阶用户)
|
||||
|
||||
当在 Ubuntu 中卸载应用时,应用程序会被卸载,但是会留下细小的、修改过的用户配置文件。这些文件是故意被留下的,因为当你再次安装同样的应用时,会使用这些遗留的配置文件。
|
||||
|
||||
如果你想完全卸载应用,你可以使用 `apt purge` 命令代替 `apt remove` 命令,或者在 `apt remove` 命令后再使用它。
|
||||
|
||||
```
|
||||
sudo apt purge program_name
|
||||
```
|
||||
|
||||
注意 `apt purge` 令不会删除保存在用户目录下的数据或者配置文件。
|
||||
|
||||
### 方法3: Ubuntu 中卸载 Snap 应用
|
||||
|
||||
前面的几种方式可用于使用 `apt` 命令、<ruby>软件中心<rt>Software Center</rt></ruby>或者直接使用 deb 文件安装的应用。
|
||||
|
||||
Ubuntu 也推出了一个名为 [Snap][13] 的包管理系统。在<ruby>软件中心<rt>Software Center</rt></ruby>中的大部分应用都是 Snap 包格式。
|
||||
|
||||
你可以使用 <ruby>软件中心<rt>Software Center</rt></ruby> 轻松地卸载这些应用,也可以使用命令行卸载。
|
||||
|
||||
列出所有已经安装的 Snap 包名字:
|
||||
|
||||
```
|
||||
snap list
|
||||
```
|
||||
|
||||
![][14]
|
||||
|
||||
选择你想要卸载的应用,然后卸载,这不会要求你确认是否删除。
|
||||
|
||||
```
|
||||
sudo snap remove package_name
|
||||
```
|
||||
|
||||
### 妙招:用一个神奇的命令清理系统
|
||||
|
||||
到此你已经学会怎么卸载应用,现在使用一个简单的命令清理卸载残留,比如不再用到的依赖或 Linux 内核头文件。
|
||||
|
||||
在终端输入如下命令:
|
||||
|
||||
```
|
||||
sudo apt autoremove
|
||||
```
|
||||
|
||||
这条命令很安全,而且会释放几百 MB 的磁盘空间。
|
||||
|
||||
### 总结
|
||||
|
||||
本文一共介绍了三种卸载应用的方法,包括通过图形界面卸载、命令行卸载,以便你了解所有方式。
|
||||
|
||||
希望此篇教程对 Ubuntu 初学者有所帮助,欢迎提出问题和建议。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/uninstall-programs-ubuntu/
|
||||
|
||||
作者:[Abhishek Prakash][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[amagicowboy](https://github.com/amagicboy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/abhishek/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://itsfoss.com/free-up-space-ubuntu-linux/
|
||||
[2]: https://itsfoss.com/remove-install-software-ubuntu/
|
||||
[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/06/ubuntu_software_applications_menu.jpg?resize=800%2C390&ssl=1
|
||||
[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/installed-apps-ubuntu.png?resize=800%2C455&ssl=1
|
||||
[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/search-installed-apps-ubuntu.png?resize=800%2C455&ssl=1
|
||||
[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/remove-applications-ubuntu.png?resize=800%2C487&ssl=1
|
||||
[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/apt-remove-program-ubuntu.png?resize=768%2C424&ssl=1
|
||||
[8]: https://itsfoss.com/unable-to-locate-package-error-ubuntu/
|
||||
[9]: https://itsfoss.com/linux-command-tricks/
|
||||
[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/remove-package-ubuntu-linux.png?resize=768%2C424&ssl=1
|
||||
[11]: https://itsfoss.com/list-installed-packages-ubuntu/
|
||||
[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/search-list-installed-apps-ubuntu.png?resize=768%2C424&ssl=1
|
||||
[13]: https://itsfoss.com/install-snap-linux/
|
||||
[14]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/list-snap-remove.png?resize=800%2C407&ssl=1
|
@ -0,0 +1,277 @@
|
||||
[#]: subject: (Use awk to calculate letter frequency)
|
||||
[#]: via: (https://opensource.com/article/21/4/gawk-letter-game)
|
||||
[#]: author: (Jim Hall https://opensource.com/users/jim-hall)
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (lkxed)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14375-1.html)
|
||||
|
||||
使用 awk 统计字母频率
|
||||
======
|
||||
|
||||
> 编写一个 awk 脚本来找到一组单词中出现次数最多(和最少)的单词。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202203/20/085052bajyoejnea8cpw5j.jpg)
|
||||
|
||||
近一段时间,我开始编写一个小游戏,在这个小游戏里,玩家使用一个个字母块来组成单词。编写这个游戏之前,我需要先知道常见英文单词中每个字母的使用频率,这样一来,我就可以找到一组更有用的字母块。字母频次统计在很多地方都有相关讨论,包括在 [维基百科][2] 上,但我还是想要自己来实现。
|
||||
|
||||
Linux 系统在 `/usr/share/dict/words` 文件中提供了一个单词列表,所以我已经有了一个现成的单词列表。然而,尽管这个 `words` 文件包含了很多我想要的单词,却也包含了一些我不想要的。我想要的单词首先不能是复合词(即不包含连接符和空格的单词),也不能是专有名词(即不包含大写字母单词)。为了得到这个结果,我可以运行 `grep` 命令来取出只由小写字母组成的行:
|
||||
|
||||
```
|
||||
$ grep '^[a-z]*$' /usr/share/dict/words
|
||||
```
|
||||
|
||||
这个正则表达式的作用是让 `grep` 去匹配仅包含小写字母的行。表达式中的字符 `^` 和 `$` 分别代表了这一行的开始和结束。`[a-z]` 分组仅匹配从 “a” 到 “z” 的小写字母。
|
||||
|
||||
下面是一个输出示例:
|
||||
|
||||
```
|
||||
$ grep '^[a-z]*$' /usr/share/dict/words | head
|
||||
a
|
||||
aa
|
||||
aaa
|
||||
aah
|
||||
aahed
|
||||
aahing
|
||||
aahs
|
||||
aal
|
||||
aalii
|
||||
aaliis
|
||||
```
|
||||
|
||||
没错,这些都是合法的单词。比如,“aahed” 是 “aah” 的过去式,表示在放松时的感叹,而 “aalii” 是一种浓密的热带灌木。
|
||||
|
||||
现在我只需要编写一个 `gawk` 脚本来统计出单词中各个字母出现的次数,然后打印出每个字母的相对频率。
|
||||
|
||||
### 字母计数
|
||||
|
||||
一种使用 `gawk` 来统计字母个数的方式是,遍历每行输入中的每一个字符,然后对 “a” 到 “z” 之间的每个字母进行计数。`substr` 函数会返回一个给定长度的子串,它可以只包含一个字符,也可以是更长的字符串。比如,下面的示例代码能够取到输入中的每一个字符 `c`:
|
||||
|
||||
```
|
||||
{
|
||||
len = length($0); for (i = 1; i <= len; i++) {
|
||||
c = substr($0, i, 1);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
如果使用一个全局字符串变量 `LETTERS` 来存储字母表,我就可以借助 `index` 函数来找到某个字符在字母表中的位置。我将扩展 `gawk` 代码示例,让它在输入数据中只取范围在 “a” 到 “z” 的字母:
|
||||
|
||||
```
|
||||
BEGIN { LETTERS = "abcdefghijklmnopqrstuvwxyz" }
|
||||
|
||||
{
|
||||
len = length($0); for (i = 1; i <= len; i++) {
|
||||
c = substr($0, i, 1);
|
||||
ltr = index(LETTERS, c);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
需要注意的是,`index` 函数将返回字母在 `LETTERS` 字符串中首次出现的位置,第一个位置返回 1,如果没有找到则返回 0。如果我有一个大小为 26 的数组,我就可以利用这个数组来统计每个字母出现的次数。我将在下面的示例代码中添加这个功能,每当一个字母出现在输入中,我就让它对应的数组元素值增加 1(使用 `++`):
|
||||
|
||||
```
|
||||
BEGIN { LETTERS = "abcdefghijklmnopqrstuvwxyz" }
|
||||
|
||||
{
|
||||
len = length($0); for (i = 1; i <= len; i++) {
|
||||
c = substr($0, i, 1);
|
||||
ltr = index(LETTERS, c);
|
||||
|
||||
if (ltr > 0) {
|
||||
++count[ltr];
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 打印相对频率
|
||||
|
||||
当 `gawk` 脚本统计完所有的字母后,我希望它能输出每个字母的频率。毕竟,我对输入中各个字母的个数没有兴趣,我更关心它们的 _相对频率_。
|
||||
|
||||
我将先统计字母 “a” 的个数,然后把它和剩余 “b” 到 “z” 字母的个数比较:
|
||||
|
||||
|
||||
```
|
||||
END {
|
||||
min = count[1]; for (ltr = 2; ltr <= 26; ltr++) {
|
||||
if (count[ltr] < min) {
|
||||
min = count[ltr];
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
在循环的最后,变量 `min` 会等于最少的出现次数,我可以把它为基准,为字母的个数设定一个参照值,然后计算打印出每个字母的相对频率。比如,如果出现次数最少的字母是 “q”,那么 `min` 就会等于 “q” 的出现次数。
|
||||
|
||||
接下来,我会遍历每个字母,打印出它和它的相对频率。我通过把每个字母的个数都除以 `min` 的方式来计算出它的相对频率,这意味着出现次数最少的字母的相对频率是 1。如果另一个字母出现的次数恰好是最少次数的两倍,那么这个字母的相对频率就是 2。我只关心整数,所以 2.1 和 2.9 对我来说是一样的(都是 2)。
|
||||
|
||||
```
|
||||
END {
|
||||
min = count[1]; for (ltr = 2; ltr <= 26; ltr++) {
|
||||
if (count[ltr] < min) {
|
||||
min = count[ltr];
|
||||
}
|
||||
}
|
||||
|
||||
for (ltr = 1; ltr <= 26; ltr++) {
|
||||
print substr(LETTERS, ltr, 1), int(count[ltr] / min);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 最后的完整程序
|
||||
|
||||
现在,我已经有了一个能够统计输入中各个字母的相对频率的 `gawk` 脚本:
|
||||
|
||||
```
|
||||
#!/usr/bin/gawk -f
|
||||
|
||||
# 只统计 a-z 的字符,忽略 A-Z 和其他的字符
|
||||
|
||||
BEGIN { LETTERS = "abcdefghijklmnopqrstuvwxyz" }
|
||||
|
||||
{
|
||||
len = length($0); for (i = 1; i <= len; i++) {
|
||||
c = substr($0, i, 1);
|
||||
ltr = index(LETTERS, c);
|
||||
|
||||
if (ltr < 0) {
|
||||
++count[ltr];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# 打印每个字符的相对频率
|
||||
|
||||
END {
|
||||
min = count[1]; for (ltr = 2; ltr <= 26; ltr++) {
|
||||
if (count[ltr] < min) {
|
||||
min = count[ltr];
|
||||
}
|
||||
}
|
||||
|
||||
for (ltr = 1; ltr <= 26; ltr++) {
|
||||
print substr(LETTERS, ltr, 1), int(count[ltr] / min);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
我将把这段程序保存到名为 `letter-freq.awk` 的文件中,这样一来,我就可以在命令行中更方便地使用它。
|
||||
|
||||
如果你愿意的话,你也可以使用 `chmod +x` 命令把这个文件设为可独立执行。第一行中的 `#!/usr/bin/gawk -f` 表示 Linux 会使用 `/usr/bin/gawk` 把这个文件当作一个脚本来运行。由于 `gawk` 命令行使用 `-f` 来指定它要运行的脚本文件名,你需要在末尾加上 `-f`。如此一来,当你在 shell 中执行 `letter-freq.awk`,它会被解释为 `/usr/bin/gawk -f letter-freq.awk`。
|
||||
|
||||
接下来我将用几个简单的输入来测试这个脚本。比如,如果我给我的 `gawk` 脚本输入整个字母表,每个字母的相对频率都应该是 1:
|
||||
|
||||
```
|
||||
$ echo abcdefghijklmnopqrstuvwxyz | gawk -f letter-freq.awk
|
||||
a 1
|
||||
b 1
|
||||
c 1
|
||||
d 1
|
||||
e 1
|
||||
f 1
|
||||
g 1
|
||||
h 1
|
||||
i 1
|
||||
j 1
|
||||
k 1
|
||||
l 1
|
||||
m 1
|
||||
n 1
|
||||
o 1
|
||||
p 1
|
||||
q 1
|
||||
r 1
|
||||
s 1
|
||||
t 1
|
||||
u 1
|
||||
v 1
|
||||
w 1
|
||||
x 1
|
||||
y 1
|
||||
z 1
|
||||
```
|
||||
|
||||
还是使用上述例子,只不过这次我在输入中添加了一个字母 “e”,此时的输出结果中,“e” 的相对频率会是 2,而其他字母的相对频率仍然会是 1:
|
||||
|
||||
```
|
||||
$ echo abcdeefghijklmnopqrstuvwxyz | gawk -f letter-freq.awk
|
||||
a 1
|
||||
b 1
|
||||
c 1
|
||||
d 1
|
||||
e 2
|
||||
f 1
|
||||
g 1
|
||||
h 1
|
||||
i 1
|
||||
j 1
|
||||
k 1
|
||||
l 1
|
||||
m 1
|
||||
n 1
|
||||
o 1
|
||||
p 1
|
||||
q 1
|
||||
r 1
|
||||
s 1
|
||||
t 1
|
||||
u 1
|
||||
v 1
|
||||
w 1
|
||||
x 1
|
||||
y 1
|
||||
z 1
|
||||
```
|
||||
|
||||
现在我可以跨出最大的一步了!我将使用 `grep` 命令和 `/usr/share/dict/words` 文件,统计所有仅由小写字母组成的单词中,各个字母的相对使用频率:
|
||||
|
||||
```
|
||||
$ grep '^[a-z]*$' /usr/share/dict/words | gawk -f letter-freq.awk
|
||||
a 53
|
||||
b 12
|
||||
c 28
|
||||
d 21
|
||||
e 72
|
||||
f 7
|
||||
g 15
|
||||
h 17
|
||||
i 58
|
||||
j 1
|
||||
k 5
|
||||
l 36
|
||||
m 19
|
||||
n 47
|
||||
o 47
|
||||
p 21
|
||||
q 1
|
||||
r 46
|
||||
s 48
|
||||
t 44
|
||||
u 25
|
||||
v 6
|
||||
w 4
|
||||
x 1
|
||||
y 13
|
||||
z 2
|
||||
```
|
||||
|
||||
在 `/usr/share/dict/words` 文件的所有小写单词中,字母 “j”、“q” 和 “x” 出现的相对频率最低,字母 “z” 也使用得很少。不出意料,字母 “e” 是使用频率最高的。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/4/gawk-letter-game
|
||||
|
||||
作者:[Jim Hall][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/jim-hall
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/osdc-docdish-typewriterkeys-3.png?itok=NyBwMdK_ (Typewriter keys in multicolor)
|
||||
[2]: https://en.wikipedia.org/wiki/Letter_frequency
|
@ -0,0 +1,69 @@
|
||||
[#]: subject: (5 commands to level-up your Git game)
|
||||
[#]: via: (https://opensource.com/article/21/4/git-commands)
|
||||
[#]: author: (Seth Kenlon https://opensource.com/users/seth)
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (lkxed)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14364-1.html)
|
||||
|
||||
五个提升你的 Git 水平的命令
|
||||
======
|
||||
|
||||
> 将这些命令加入到你的工作流中,使 Git 发挥更大的作用。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202203/17/110616vti9hhsiiq4misra.jpg)
|
||||
|
||||
如果你经常使用 Git,你可能会知道它非常有名。它可能是最受欢迎的版本控制方案,它被一些 [最大的软件项目][2] 用来 [跟踪文件变更][3]。Git 提供了 [健壮的界面][4] 来审阅代码、把实验性的变更合并到已经存在的文件中。得益于 [Git 钩子][5],它以灵活性而闻名。同时,也因为它的强大,它给人们留下了一个“复杂”的印象。
|
||||
|
||||
Git 有诸多特性,你不必全部使用,但是如果你正在深入研究 Git 的 <ruby>子命令<rt>subcommands</rt></ruby>,我这里倒是有几个,或许你会觉得有用。
|
||||
|
||||
### 1、找到变更
|
||||
|
||||
如果你已经熟悉 Git 的基本指令(`fetch`、`add`、`commit`、`push`、`log` 等等),但是希望学习更多,那么从 Git 的检索子命令开始是一个简单安全的选择。检索你的 Git 仓库(你的 _工作树_)并不会做出任何更改,它只是一个报告机制。你不会像使用 `git checkout` 一样承担数据完整性的风险,你只是在向 Git 请求仓库的当前状态和历史记录而已。
|
||||
|
||||
[git whatchanged][6] 命令(几乎本身就是一个助记符)可以查看哪些文件在某个<ruby>提交<rt>commit</rt></ruby>中有变更、分别做了什么变更。它是一个简单的、用户友好的命令,因为它把 `show`、`diff-tree` 和 `log` 这三个命令的最佳功能整合到了一个好记的命令中。
|
||||
|
||||
### 2、使用 git stash 管理变更
|
||||
|
||||
你越多地使用 Git,你就会使用 Git 越多。这就是说,一旦你习惯了 Git 的强大功能,你就会更频繁地使用它。有时,你正在处理一大堆文件,忽然意识到了有更紧急的任务要做。这时,在 [git stash][7] 的帮助下,你就可以把所有正在进行的工作收集起来,然后安全地<ruby>暂存<rt>stash</rt></ruby>它们。当你的工作空间变得整洁有序,你就可以把注意力放到别的任务上,晚些时候再把暂存的文件重新加载到工作树里,继续之前的工作。
|
||||
|
||||
### 3、使用 git worktree 来得到链接的副本
|
||||
|
||||
当 `git stash` 不够用的时候,Git 还提供了强大的 [git worktree][8] 命令。有了它,你可以新建一个 _链接的_ 仓库<ruby>副本<rt>clone</rt></ruby>,组成一个新分支,把 `HEAD` 设置到任意一个提交上,然后基于这个分支开始你的新工作。在这个链接的副本里,你可以进行和主副本完全不同的任务。这是一个避免意外的变更影响当前工作的好办法。当你完成了你的新工作,你可以把新分支推送到远程仓库;也可以把当前的变更归档,晚些时候再处理;还可以从别的工作树中获取它们的变更。无论选择哪一种,你的工作空间之间都会保持相互隔离,任一空间中的变更都不会影响其他空间中的变更,直到你准备好了要合并它们。
|
||||
|
||||
### 4、使用 git cherry-pick 来选择合并
|
||||
|
||||
这可能听起来很反直觉,但是,你的 Git 水平越高,你可能遇到的合并冲突就会越多。这是因为合并冲突不一定是错误的标志,而是活跃的标志。在学习 Git 中,适应合并时的冲突,并学会如何解决它们是非常重要的。通常的方式或许够用,但是有时候你会需要更加灵活地进行合并,这时候就该 [git cherry-pick][9] 出场了。遴选操作允许你选择部分合并提交,这样一来你就不需要因为一些细微的不协调而拒绝整个合并请求了。
|
||||
|
||||
### 5、使用 Git 来管理 $HOME
|
||||
|
||||
使用 Git 来管理你的主目录从来没有这么简单过,这都要归功于 Git 可以自由选择管理对象的能力,这是一个在多台计算机之间保持同步的现实可行的选项。但是,想要让它工作顺利,你必须非常明智且谨慎才行。如果你想要了解更多,点击阅读我写的关于 [使用 Git 来管理 $HOME][10] 的小技巧。
|
||||
|
||||
### 更好地使用 Git
|
||||
|
||||
Git 是一个强大的版本控制系统,你使用得越熟练,就可以越轻松地借助它来完成复杂的任务。今天就尝试一些新的 Git 命令吧,欢迎在评论区分享你最喜欢的 Git 命令。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/4/git-commands
|
||||
|
||||
作者:[Seth Kenlon][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/seth
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/lenovo-thinkpad-laptop-concentration-focus-windows-office.png?itok=-8E2ihcF (Woman using laptop concentrating)
|
||||
[2]: https://opensource.com/article/19/10/how-gnome-uses-git
|
||||
[3]: https://opensource.com/article/18/2/how-clone-modify-add-delete-git-files
|
||||
[4]: https://opensource.com/article/18/5/git-branching
|
||||
[5]: https://opensource.com/life/16/8/how-construct-your-own-git-server-part-6
|
||||
[6]: https://opensource.com/article/21/3/git-whatchanged
|
||||
[7]: https://opensource.com/article/21/3/git-stash
|
||||
[8]: https://opensource.com/article/21/3/git-worktree
|
||||
[9]: https://opensource.com/article/21/3/reasons-use-cherry-picking
|
||||
[10]: https://opensource.com/article/21/3/git-your-home
|
@ -0,0 +1,74 @@
|
||||
[#]: subject: (5 handy guides to open source for teachers)
|
||||
[#]: via: (https://opensource.com/article/21/6/open-source-guides-teachers)
|
||||
[#]: author: (Seth Kenlon https://opensource.com/users/seth)
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (lkxed)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14386-1.html)
|
||||
|
||||
5 个为教师准备的方便的开源指南
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202203/23/162904laqecdh4xraveac7.jpg)
|
||||
|
||||
> 我们收集了一些最受欢迎的简明指南,它们既能满足你充分利用暑假的愿望,又能满足你为下一个学期做规划的需要。
|
||||
|
||||
对一些老师来说,夏天到了,一个漫长的(希望也是放松的)假期也到了。所有我认识的老师都是自豪的终身学习者,尽管暑假过后,又有一个新学期会到来。为了帮助你充分利用暑假时间,与此同时也为即将到来的下一个学期做好准备,我们收集了一些最受欢迎的 _简明_ 指南。
|
||||
|
||||
### 如何让你的学校做好准备(在新冠疫情下)
|
||||
|
||||
通过 [在 Linux 上来完成所有相关工作][2],Robert Maynord 老师确保了他的学校为远程学习做好了准备,甚至在疫情前他就这么做了。虽然我们还不知道在今年剩下的时间里会发生什么,但是,如果说新冠疫情向世界展示了什么,那就是 [数字转型][3](指把数字技术融入到教育的各个领域)不仅是可能的,而且对教师和学生来说都是有益的。你可能无权在技术层面上改变课堂的运作方式,但你仍然可以做很多小的改变,为学生创造更灵活的学习体验。
|
||||
|
||||
### 为教师准备的终极开源指南
|
||||
|
||||
通过本文,你可以学习如何在课堂上 [融入开源原则][4]。开源不仅仅和科技相关,它同时也关于知识共享、团队协作以及为了一个共同目标而努力。你可以把你的教室变成一个共享的空间,让学生们互相学习,就像他们向你学习一样。阅读开源,把开源付诸实践,并鼓励学生们积极参与。
|
||||
|
||||
### 8 个为虚拟教室准备的 WordPress 插件
|
||||
|
||||
WordPress Web 平台是一个构建网站的强大工具。在教室里,它可以作为教授 Web 技术、创意写作和学术写作的 [一个很好的工具][5]。它也可以被用来帮助远程学习,或者是把日常的学校作业数字化。通过掌握 WordPress 的诸多 [附加功能],你可以从中获取到最大的教育收益。
|
||||
|
||||
### 教孩子们写 Python(交互式游戏)
|
||||
|
||||
开源工具可以帮助任何人以一种轻松有趣的方式开始学习 Python —— 那就是制作游戏。当然,Python 涉及到很多方面的东西。别担心,我们有一个课程可以带你从安装 Python 开始,通过简单的文本代码和 “<ruby>海龟<rt>turtle</rt></ruby>” 绘图游戏开始你的第一步,一直到中级游戏开发。
|
||||
|
||||
1. 首先,安装 Python,阅读我们的 [Python 入门文章][7],熟悉编程的概念。单单是这篇文章里的内容就可以作为两节或三节不同课程的基础哦。
|
||||
2. 然后,如果你熟悉 [Jupyter][8] 库的话,可以学习 [使用 Python 和 Jupyter 来编写一个简单游戏][9]。
|
||||
3. 接着,你也可以 [在这本 Python 电子书里学到游戏开发的知识][10],里面会教你如何使用 Git、Python 和 PyGame 库。当你学会了这些基础内容,你可以看看 [这本书里的 "游戏测试员" 的有趣创作集合][11]。
|
||||
|
||||
如果 Python 对你或你的学生来说太难了,那么看看 [Thine][12] 吧,它是一个简单的基于 HTML 的交互式的讲故事工具。
|
||||
|
||||
### 教孩子们玩树莓派(编程)
|
||||
|
||||
我们的指南中有一篇 [树莓派入门指南][13],其中探索了各种帮助孩子们学习编程的资源。树莓派的特点是它足够便宜,只要花 35 美元,你就可以买到一个全功能的 Linux 电脑。然后你就在上面做任何事,不管是基本的 Python 学习还是搭建实际的网络服务器,因此,它有着巨大的教育潜力。你完全可以为每一个学生都配一个树莓派,或者你也可以让班里的学生共享一个树莓派(Linux 是多用户操作系统,只要设置得当,所有的学生都可以同时使用这个树莓派,直到你说服他们的家长购买更多树莓派)。
|
||||
|
||||
### 一起学习
|
||||
|
||||
开放课堂的关键之一是要勇敢地和学生一起学习。作为一个老师,你可能习惯了掌握所有的答案,但是数字世界是不断改变和进化的。不要害怕 _和_ 你的学生们一起学习 Python、Linux、树莓派或者任何其他东西,一起学习新的基础知识、小技巧和解决问题的新方式。开源是一种经过验证的成功方法,所以不要只是教授开源而已,还要让开源在你的课堂上得以运用。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/6/open-source-guides-teachers
|
||||
|
||||
作者:[Seth Kenlon][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/seth
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/tips_map_guide_ebook_help_troubleshooting_lightbulb_520.png?itok=L0BQHgjr (Looking at a map)
|
||||
[2]: https://opensource.com/article/21/5/linux-school-servers
|
||||
[3]: https://enterprisersproject.com/what-is-digital-transformation
|
||||
[4]: https://opensource.com/article/20/7/open-source-teachers
|
||||
[5]: https://opensource.com/article/20/3/wordpress-education
|
||||
[6]: https://opensource.com/article/20/5/wordpress-plugins-education
|
||||
[7]: https://opensource.com/article/17/10/python-101
|
||||
[8]: https://opensource.com/article/18/3/getting-started-jupyter-notebooks
|
||||
[9]: https://opensource.com/article/20/5/python-games
|
||||
[10]: https://opensource.com/article/20/10/learn-python-ebook
|
||||
[11]: https://github.com/MakerBox-NZ?q=pygame&type=&language=&sort=
|
||||
[12]: https://opensource.com/article/18/2/twine-gaming
|
||||
[13]: https://opensource.com/article/19/3/teach-kids-program-raspberry-pi
|
@ -0,0 +1,113 @@
|
||||
[#]: subject: (How to Make LibreOffice Look Like Microsoft Office)
|
||||
[#]: via: (https://www.debugpoint.com/2021/06/libreoffice-like-microsoft-office/)
|
||||
[#]: author: (Arindam https://www.debugpoint.com/author/admin1/)
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (robsean)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14412-1.html)
|
||||
|
||||
如何使 LibreOffice 看起来像微软 Office
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202203/29/224638h4k4bg561ix4qnb6.jpg)
|
||||
|
||||
> 我们做了一次尝试,使 LibreOffice 套件看起来像微软 Office。能做到吗?让我们来看看。
|
||||
|
||||
[LibreOffice][1] 是一个自由开源的办公生产力套件,它向你提供了一套完整的应用程序集合。它包含文字处理器(Writer)、电子表格程序(Calc)、演示程序(Impress)和 绘图程序(Draw)。它还为你提供了一个独立的数据库系统(LibreOffice Base),以及 LibreOffice Math 是一个帮助学生、研究人员编写公式和方程的程序。
|
||||
|
||||
然而,广泛使用的 [微软 Office][2] 是一个付费的办公生产力套件,提供了优秀的程序来完成几乎所有的关于学习、办公和企业应用的任务。
|
||||
|
||||
这两组程序套件是不同的,但是它们在功能方面的目标是相同的。由于它的流行,微软 Office 被广泛的使用,并被使用者熟知。不过,这里有很多使用者更喜欢免费的 LibreOffice 来支撑他们的工作和活动。与微软 Office 相比,采用 LibreOffice 有时会很困难 —— 尽管大多数的菜单项和工具都是一样的。
|
||||
|
||||
尽管如此,如果你可以使 LibreOffice 看起来像微软 Office ,那么,对于初次使用 LibreOffice 的用户来说会更容易接纳,他们大多数是有使用微软 Office 的经历背景的用户。外观和感受在用户的头脑中起着重要的作用,也包含他们的肌肉记忆和对颜色、菜单项的熟悉度。
|
||||
|
||||
当然,你不可能使它完全像微软 Office,因为它们使用了不同的图标、字体等等。不过,你可以将其微调到一定程度。
|
||||
|
||||
### 使 LibreOffice 看起来像微软 Office
|
||||
|
||||
这篇指南是以 LibreOffice 7.2(开发版)版本为基础所编写的。
|
||||
|
||||
#### 1、用户界面的变化
|
||||
|
||||
LibreOffice 有一个名为“标签栏” 的 “<ruby>功能区<rt>Ribbon</rt></ruby>” 式工具栏。尽管它带有多种工具栏变体(如下)。但是,对于这篇指南,我使用 <ruby>标签式<rt>Tabbed</rt></ruby> 工具栏选项。
|
||||
|
||||
* 打开 LibreOffice 并转到 “<ruby>菜单<rt>Menu</rt></ruby> > <ruby>视图<rt>View</rt></ruby> > <ruby>用户界面<rt>User Interface</rt></ruby>”。
|
||||
* 从 UI 部分中选择 “<ruby>标签式<rt>Tabbed</rt></ruby>” 。
|
||||
|
||||
![tabbed bar option][3]
|
||||
|
||||
* 点击 “<ruby>应用于全部<rt>Apply to All</rt></ruby>” 。LibreOffice 也提供一个选项,可以将特定的工具栏样式应用到 Writer 或 Calc。如果你想要一种不同的工具栏样式,你可以选择这种方法。但是,我推荐使用应用于全部来使其保持一致。
|
||||
* 现在,你已经有了微软 Office 样式的功能区。尽管它们并不是完全相同,但是你也能体会到它的感受。
|
||||
|
||||
#### 2、适用于 LibreOffice 的微软 Office 图标
|
||||
|
||||
工具栏中的图标在你的工作流中起着重要的作用。LibreOffice 为你的工具栏提供一些漂亮的图标。其中最好的一些是:
|
||||
|
||||
* Karasa Jaga
|
||||
* Colibre
|
||||
* Elementary
|
||||
|
||||
针对这篇指南,我们将使用 [Office 2013 图标集][4],它是由一名作家开发的,可以在 Devian Art 中获得。
|
||||
|
||||
* 转到下面的链接并下载 LibreOffice 扩展文件(*.oxt),对于 LibreOffice 的较新版本,你需要使用扩展文件来安装图标集。
|
||||
- [下载适用于 libreoffice 的 Office 2013 图标集][5]
|
||||
* 在下载后,双击 .oxt 文件来将其打开。或者,按下 `CTRL+ALT+E` 组合按键来打开扩展管理器,并使用 “<ruby>添加<rt>Add</rt></ruby>” 按钮来选择已下载的 .oxt 文件。在完成后关闭窗口。
|
||||
|
||||
![Import icon sets in Extension Manager][6]
|
||||
|
||||
* 现在,转到 “<ruby>工具<rt>Tools</rt></ruby> > <ruby>选项<rt>Options</rt></ruby> > <ruby>视图<rt>View</rt></ruby>”。从“<ruby>图标样式<rt>Icon Style</rt></ruby>”中选择 “Office 2013” 。
|
||||
* 通过 “<ruby>图标大小<rt>Icon Size</rt></ruby> > <ruby>笔记本栏<rt>Notebookbar</rt></ruby> > <ruby>大<rt>Large</rt></ruby>” 来更改图标大小。如果你感觉图标有点小,你可以更改它们。不过,我觉得要使它更像 Office ,将图标设置的较大一点的效果会更好。
|
||||
|
||||
![Change icons in Options][7]
|
||||
|
||||
就这样,你的 LibreOffice 应该看起来像这样:
|
||||
|
||||
![在 KDE Plasma 中让 LibreOffice 看起来像微软 Office][9]
|
||||
|
||||
![在 Windows 10 中让 LibreOffice 看起来像微软 Office][10]
|
||||
|
||||
![在 GNOME 中让 LibreOffice 看起来像微软 Office][11]
|
||||
|
||||
注意,如果你正在使用 Ubuntu、KDE Plasma,或者任何 Linux 发行版,它们的外观可能会有所不同。但是,在我看来,在 KDE Plasma 中比在 GNOME 中看起来更像微软 Office 。LibreOffice 目前在基于 GTK 的系统中看起来并不太好。
|
||||
|
||||
不过,在 Windows 中,它看起来会更像,因为它使用同一个系统的字体和颜色面板。
|
||||
|
||||
这些是你可以使用的一些设置,不过,你可以随心所欲地自由调整更多的定制、图标和主题。如果你喜欢 LibreOffice 的深色模式,你可能想要阅读我们的教程 – [如何在 LibreOffice 中启用深色模式][12]。
|
||||
|
||||
### 结束语
|
||||
|
||||
微软 Office 毫无疑问是办公生产力领域的市场领导者。这是有原因的,它来自数十年的开发。它不是免费的产品,事实上,最新的 Office 365 家庭版本的价格大约是 7 美元/月,可以在 3 到 4 台设备上使用。在我看来,它有点小贵。
|
||||
|
||||
然而 LibreOffice 是免费的,由文档基金会领导的社区开发。因此,开发速度较慢、功能出现也较晚。它并不是要成为微软 Office ,而是要给数以百万计的用户、学校、非营利组织、高校、学生一个使用免费办公套件工作和学习的机会。
|
||||
|
||||
因此,如果它能够模仿基本的外观和感受,使其像微软 Office 一样,从而调高 LibreOffice 的使用率,那将是有益的。我希望这篇指南能在这个方向上能起到一点作用。
|
||||
|
||||
- [链接: LibreOffice 和 Microsoft Office 的官方功能比较][13]
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.debugpoint.com/2021/06/libreoffice-like-microsoft-office/
|
||||
|
||||
作者:[Arindam][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[robsean](https://github.com/robsean)
|
||||
校对:[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/lujun9972
|
||||
[1]: http://libreoffice.com
|
||||
[2]: http://office.com
|
||||
[3]: https://www.debugpoint.com/blog/wp-content/uploads/2021/06/tabbed-bar-option.jpg
|
||||
[4]: https://www.deviantart.com/charliecnr/art/Office-2013-theme-for-LibreOffice-512127527
|
||||
[5]: https://www.deviantart.com/users/outgoing?https://1drv.ms/u/s!ArgKmgFcmBYHhSQkPfyMZRnXX5LJ
|
||||
[6]: https://www.debugpoint.com/blog/wp-content/uploads/2021/06/Import-icon-sets-in-Extension-Manager.jpg
|
||||
[7]: https://www.debugpoint.com/blog/wp-content/uploads/2021/06/Change-icons-in-Options-1024x574.jpg
|
||||
[8]: https://www.debugpoint.com/2021/05/libreoffice-7-2/
|
||||
[9]: https://www.debugpoint.com/blog/wp-content/uploads/2021/06/Making-LibreOffice-look-like-Microsoft-Office-in-KDE-Plasma-1024x441.jpg
|
||||
[10]: https://www.debugpoint.com/blog/wp-content/uploads/2021/06/Making-LibreOffice-look-like-Microsoft-Office-in-Windows-10-1024x554.jpg
|
||||
[11]: https://www.debugpoint.com/blog/wp-content/uploads/2021/06/Making-LibreOffice-look-like-Microsoft-Office-in-GNOME-1024x498.jpg
|
||||
[12]: https://www.debugpoint.com/2020/01/how-to-enable-dark-mode-libreoffice/
|
||||
[13]: https://wiki.documentfoundation.org/Feature_Comparison:_LibreOffice_-_Microsoft_Office
|
@ -0,0 +1,152 @@
|
||||
[#]: subject: (How I helped my mom switch from Windows to Linux)
|
||||
[#]: via: (https://opensource.com/article/21/6/mom-switch-linux)
|
||||
[#]: author: (Tomasz https://opensource.com/users/tomaszwaraksa)
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (lkxed)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14407-1.html)
|
||||
|
||||
我是如何帮助妈妈从 Windows 切换至 Linux 的
|
||||
======
|
||||
|
||||
> 有了 Linux,即便是新手用户,也能通过大量熟悉的应用程序获得流畅、精致的桌面体验。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202203/29/103155z5khz7z05fl7mz7l.jpg)
|
||||
|
||||
大型强子对撞机是 [由 Linux 驱动][2] 的,国际空间站上的笔记本电脑是 [运行在 Linux 上][3] 的,[Instagram][4] 和 [Nest thermostats][5] 也是如此。最近,我们观看了 <ruby>机智号<rt>Ingenuity</rt></ruby> 在火星上空飞翔,它是一个令人惊叹的无人直升机,也是 [由 Linux 驱动的][6]!这进一步证明了这个操作系统的灵活性和通用性。
|
||||
|
||||
但是现在,真正的大新闻来了。我在这里“官宣”:Linux 也可以给父母使用!
|
||||
|
||||
### 事情经过
|
||||
|
||||
大约一年前,我决定把妈妈的电脑环境迁移至 Linux。现在,一年过去了,是时候回顾和总结一下了。
|
||||
|
||||
和大多数人一样,我是专属的 “妈妈的电脑管理员”。我的妈妈是一个 60 多岁的可爱老太太 —— 一个真正的甜心。她的电脑技能很基础,她的电脑使用需求也很基础:上上网,发发邮件,打打字,浏览、编辑照片,看看视频听听歌,还有就是在 Skype 或者 Signal 上和家里人或者朋友们打打电话。
|
||||
|
||||
直到去年之前,妈妈一直在使用一个 Windows 笔记本电脑。电脑已经很旧了,但还不算太糟糕。于是在某一天,通过欺骗、威胁和弹出讨厌的窗口等手段,微软终于成功让她点击了那个可怕的按钮 —— “升级到 Windows 10”。
|
||||
|
||||
她绝望地向我呼救。作为妈妈的电脑管理员,我的生活很快就变成了地狱。“为什么所有东西看起来都不一样了?我的应用列表跑去哪儿了?什么,这堆瓷块一样的东西变成我的应用列表了?我的电脑怎么变得这么慢?它怎么每天都要自动更新重启,而且偏偏就是在我想要用它的时候?为什么有东西(她指的是硬盘)一直嗡嗡嗡地叫?它到底一直在忙些什么啊?”
|
||||
|
||||
可是我又看不到源代码,我怎么它一直在忙些什么呢?
|
||||
|
||||
本来我是打算回滚这个升级的,但是 Windows 7 马上就要终止支持了,我担心会发生最坏的事情:没有了安全更新,妈妈的电脑很快就会变成数不清的<ruby>僵尸网络<rt>bot networks</rt></ruby>中的一员,一天到晚地挖矿、发送垃圾邮件,以及对全国的重要设施发动恶毒的 DDOS 攻击。最后还是需要我来清理这个烂摊子 —— (而且是)每一个周末。
|
||||
|
||||
### 大救星 Linux 来了
|
||||
|
||||
我决定把她的电脑环境迁移到 Linux 上,反正也没有什么可损失的。我自己在五年前就这么做了,我从未那么开心过。不如让妈妈也试试,肯定不会有什么坏处。
|
||||
|
||||
当妈妈知道我要一次性解决她所有的问题时,她非常开心。但她不知道的是,她将成为一项为期一年的科学实验的关键部分,这个实验叫做:“妈妈能学会使用 Linux 吗?”
|
||||
|
||||
![Cowsay "Can Mom Survive Linux?"][7]
|
||||
|
||||
(图源 Tomasz Waraksa,遵从[<ruby>署名-相同方式共享 4.0 国际协议<rt>CC BY-SA 4.0</rt></ruby>][8])
|
||||
|
||||
于是,在 2020 年 2 月的某一天,我从遥远的都柏林带着一台使用七年的联想 Yoga 13 来到这里,这台电脑和妈妈那台有着相似的参数,但它的屏幕要好很多,而且只有一半的重量。我在 VirtualBox 里讨论和测试了不同的 Linux 发行版,最终选择了 [Zorin OS][9] 发行版,一个自豪的“爱尔兰造”系统。我选择它是考虑到了下面几个因素:
|
||||
|
||||
* 它基于我最熟悉的 Ubuntu Linux。
|
||||
* 它和 Windows 7 很像,在精心设计的同时考虑到了 Windows 难民。
|
||||
* 我感觉它很轻量、简单,对妈妈来说足够保守。完全没有 macOS Big Sur 上的花里胡哨!
|
||||
|
||||
![Zorin OS desktop][10]
|
||||
|
||||
(图源 Tomasz Waraksa,遵从[<ruby>署名-相同方式共享 4.0 国际协议<rt>CC BY-SA 4.0</rt></ruby>][8])
|
||||
|
||||
### 系统安装
|
||||
|
||||
我用自己一贯的方式安装了这个操作系统,为 `/home` 目录单独分了一个区,这样一来,系统重装时(尽管不大可能发生)妈妈的文件仍然能够保持安全。这是我的惯用技巧,它可以方便我安装发行版的深夜更新。
|
||||
|
||||
在安装过程中,我选择了波兰语作为用户界面语言。和我一样,妈妈也是个彻头彻尾的波兰人。不必担心,Linux 看起来支持所有语言,甚至包括 [克林贡语][11]。
|
||||
|
||||
接着,根据妈妈的需求,我安装了下面这些应用:
|
||||
|
||||
* Skype
|
||||
* [Signal 桌面客户端][12]
|
||||
* 谷歌 Chrome 浏览器
|
||||
* [Geary][13] 邮件客户端
|
||||
* [gThumb][14],用来浏览和编辑照片
|
||||
* [VLC][15],用来播放视频和音乐
|
||||
* Softmaker Office,用来编辑文本和表格
|
||||
|
||||
注意到列表里没有杀毒软件了吗?好耶!
|
||||
|
||||
一个小时后,系统和应用全部安装完成,妈妈的 Zorin OS 已准备就绪。
|
||||
|
||||
![Zorin OS home folder][16]
|
||||
|
||||
(图源 Tomasz Waraksa,遵从[<ruby>署名-相同方式共享 4.0 国际协议<rt>CC BY-SA 4.0</rt></ruby>][8])
|
||||
|
||||
### 设置系统
|
||||
|
||||
我通过下面这几个步骤,让自己成为了妈妈的电脑管理员:
|
||||
|
||||
* 为我自己创建了一个管理员账户
|
||||
* 把妈妈的账户设置为非管理员
|
||||
* 安装了用于远程无人值守访问的 `ssh` 守护程序
|
||||
* 把这台机器加入到了我的 Hamachi VPN 中:这样一来,我就可以安全地使用 ssh 连接,而不需要打开路由器上的 `22` 端口。Hamachi 是一个由 LogMeIn 提供的 VPN 服务。它是一个传统的 VPN,我的意思是,它的目标不是让你在另外一个国家运行 Netflix 应用,而是在互联网上为计算机之间建立一个安全的网络连接。
|
||||
* 启动了简单防火墙(`ufw`)并允许 ssh 流量
|
||||
* 安装了 AnyDesk 来远程登录到桌面
|
||||
|
||||
这样操作之后,我就可以通过安全的 ssh 连接访问到妈妈的笔记本电脑。我可以通过 shell 进行定期维护,而妈妈甚至不会注意到任何事情。这是因为 Linux 完成更新后通常 _不需要_ 重新启动。真是一个奇迹啊!简直不可能的事,它是怎么做到的呢?
|
||||
|
||||
![Updating software remotely][17]
|
||||
|
||||
(图源 Tomasz Waraksa,遵从[<ruby>署名-相同方式共享 4.0 国际协议<rt>CC BY-SA 4.0</rt></ruby>][8])
|
||||
|
||||
### 妈妈能学会使用 Linux 吗
|
||||
|
||||
毫无疑问!
|
||||
|
||||
尽管当我把新电脑展示给她看的时候,她确实有问到为什么这个新的 Windows 又看起来不一样了。我不得不解释说这个其实不是 Windows,而是 Linux,然后向她解释了为什么我们都爱 Linux。不过,她学得很快。这个经典的 Zorin OS 桌面和她用惯了的 Windows 7 十分相似。我看到她在系统里点来点去,然后很轻松地找到并且运行了她熟悉的应用程序。
|
||||
|
||||
她立刻就注意到电脑启动快了很多,表现也好了很多。
|
||||
|
||||
然后她开始问我什么时候会给她做电脑的定期清理,好让她电脑不会再一次变慢。我和她解释说,以她的日常使用量,不需要再做定期清理了。Linux 和 Windows 不一样,它不会自己“腐烂”的。目前来说,的确如此。她的电脑仍然像第一天那样流畅和快速。
|
||||
|
||||
我时不时地会问她对新电脑感觉怎么样,她总是回答说很满意。一切都很顺利。电脑也不会莫名其妙就变得忙起来。再也不会有一些“很重要的更新”来打断她。应用菜单也总是在它该在的地方。在这个全新的环境中,她对自己常用的应用程序也感到满意。
|
||||
|
||||
在这一年中,我远程登录过几次她的电脑,为的是进行常规的软件包升级。我还使用 AnyDesk 登录过两次她的桌面。一次是妈妈问我能不能帮她把 SD 卡里的照片自动导入到 `~/Pictures` 目录里,如果能够放到以日期命名的目录里就更好了。当然可以,只要懂一点点的 Bash,就可以使用 `gThumb` 很轻松地实现这个功能。另一次,我把她经常访问的网站添加到了桌面,这样她点击桌面图标就可以访问了。
|
||||
|
||||
这就是目前我作为妈妈的 Linux 管理员所做的全部事情!按照这个情况,我还可以再给 50 个妈妈当电脑管理员!
|
||||
|
||||
### 总结
|
||||
|
||||
我希望我的故事能够启发你考虑迁移到 Linux。过去,我们认为 Linux 对于普通用户来说太难了。但今天,我相信事实恰恰相反。用户使用电脑越不熟练,他们就越有理由迁移到 Linux!
|
||||
|
||||
有了 Linux,即便是新手用户,也能通过大量熟悉的应用程序获得流畅、精致的桌面体验。新手用户们将比在任何其他流行的计算平台上都要安全得多。并且,通过远程访问来帮助他们从未如此简单和安全!
|
||||
|
||||
_免责声明:本文不推广所描述的任何产品、服务或供应商。我与他们没有任何商业利益或联系。我并没有在暗示这些产品或服务是最适合你的,也不承诺你的体验会和我一样。_
|
||||
|
||||
_本文最初发布在 [Let's Debug It][18] 上,在获得许可后重新使用。_
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/6/mom-switch-linux
|
||||
|
||||
作者:[Tomasz][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/tomaszwaraksa
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/heart_lego_ccby20.jpg?itok=VRpHf4iU (Red Lego Heart)
|
||||
[2]: https://www.redhat.com/en/about/press-releases/red-hat-provides-cern-platform-mission-critical-applications
|
||||
[3]: https://www.extremetech.com/extreme/155392-international-space-station-switches-from-windows-to-linux-for-improved-reliability
|
||||
[4]: https://instagram-engineering.com/what-powers-instagram-hundreds-of-instances-dozens-of-technologies-adf2e22da2ad
|
||||
[5]: https://www.theverge.com/2011/11/14/2559567/tony-fadell-nest-learning-thermostat
|
||||
[6]: https://www.zdnet.com/article/to-infinity-and-beyond-linux-and-open-source-goes-to-mars/
|
||||
[7]: https://opensource.com/sites/default/files/uploads/intro.png (Cowsay "Can Mom Survive Linux?")
|
||||
[8]: https://creativecommons.org/licenses/by-sa/4.0/
|
||||
[9]: https://zorinos.com/
|
||||
[10]: https://opensource.com/sites/default/files/uploads/zorin-os-desktop.png (Zorin OS desktop)
|
||||
[11]: https://blogs.gnome.org/muelli/2010/04/klingon-language-support/
|
||||
[12]: https://github.com/signalapp
|
||||
[13]: https://wiki.gnome.org/Apps/Geary
|
||||
[14]: https://wiki.gnome.org/Apps/Gthumb
|
||||
[15]: https://www.videolan.org/vlc/
|
||||
[16]: https://opensource.com/sites/default/files/uploads/zorin-os-home-folder.png (Zorin OS home folder)
|
||||
[17]: https://opensource.com/sites/default/files/uploads/upgrading-software.png (Updating software remotely)
|
||||
[18]: https://letsdebug.it/post/16-linux-for-mars-copters-moms-and-pops/
|
350
published/202203/20210707 Parsing config files with Java.md
Normal file
350
published/202203/20210707 Parsing config files with Java.md
Normal file
@ -0,0 +1,350 @@
|
||||
[#]: subject: (Parsing config files with Java)
|
||||
[#]: via: (https://opensource.com/article/21/7/parsing-config-files-java)
|
||||
[#]: author: (Seth Kenlon https://opensource.com/users/seth)
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (lkxed)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14381-1.html)
|
||||
|
||||
使用 Java 解析 XML 文件
|
||||
======
|
||||
|
||||
> 在你使用 Java 编写软件时实现持久化配置。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202203/22/091553wf2gvj20fn4wfgpw.jpg)
|
||||
|
||||
当你编写一个应用时,你通常都会希望用户能够定制化他们和应用交互的方式,以及应用与系统进行交互的方式。这种方式通常被称为 “<ruby>偏好<rt>preference</rt></ruby>” 或者 “<ruby>设置<rt>setting</rt></ruby>”,它们被保存在一个 “偏好文件” 或者 “配置文件” 中,有时也直接简称为 “<ruby>配置<rt>config</rt></ruby>”。配置文件可以有很多种格式,包括 INI、JSON、YAML 和 XML。每一种编程语言解析这些格式的方式都不同。本文主要讨论,当你在使用 [Java 编程语言][2] 来编写软件时,实现持久化配置的方式。
|
||||
|
||||
### 选择一个格式
|
||||
|
||||
编写配置文件是一件相当复杂的事情。我曾经试过把配置项使用逗号分隔保存在一个文本文件里,也试过把配置项保存在非常详细的 YAML 和 XML 中。对于配置文件来说,最重要是要有一致性和规律性,它们使你可以简单快速地编写代码,从配置文件中解析出数据;同时,当用户决定要做出修改时,很方便地保存和更新配置。
|
||||
|
||||
目前有 [几种流行的配置文件格式][3]。对于大多数常见的配置文件格式,Java 都有对应的<ruby>库<rt>library</rt></ruby>。在本文中,我将使用 XML 格式。对于一些项目,你可能会选择使用 XML,因为它的一个突出特点是能够为包含的数据提供大量相关的元数据,而在另外一些项目中,你可能会因为 XML 的冗长而不选择它。在 Java 中使用 XML 是非常容易的,因为它默认包含了许多健壮的 XML 库。
|
||||
|
||||
### XML 基础
|
||||
|
||||
讨论 XML 可是一个大话题。我有一本关于 XML 的书,它有超过 700 页的内容。幸运的是,使用 XML 并不需要非常了解它的诸多特性。就像 HTML 一样,XML 是一个带有开始和结束标记的分层标记语言,每一个标记(标签)内可以包含零个或更多数据。下面是一个 XML 的简单示例片段:
|
||||
|
||||
|
||||
```
|
||||
<xml>
|
||||
<node>
|
||||
<element>Penguin</element>
|
||||
</node>
|
||||
</xml>
|
||||
```
|
||||
|
||||
在这个 <ruby>自我描述的<rt>self-descriptive</rt></ruby> 例子中,XML 解析器使用了以下几个概念:
|
||||
|
||||
* <ruby>文档<rt>Document</rt></ruby>:`<xml>` 标签标志着一个 _文档_ 的开始,`</xml>` 标签标志着这个文档的结束。
|
||||
* <ruby>节点<rt>Node</rt></ruby>:`<node>` 标签代表了一个 _节点_。
|
||||
* <ruby>元素<rt>Element</rt></ruby>:`<element>Penguin</element>` 中,从开头的 `<` 到最后的 `>` 表示了一个 _元素_。
|
||||
* <ruby>内容<rt>Content</rt></ruby>: 在 `<element>` 元素里,字符串 `Penguin` 就是 _内容_。
|
||||
|
||||
不管你信不信,只要了解了以上几个概念,你就可以开始编写、解析 XML 文件了。
|
||||
|
||||
### 创建一个示例配置文件
|
||||
|
||||
要学习如何解析 XML 文件,只需要一个极简的示例文件就够了。假设现在有一个配置文件,里面保存的是关于一个图形界面窗口的属性:
|
||||
|
||||
```
|
||||
<xml>
|
||||
<window>
|
||||
<theme>Dark</theme>
|
||||
<fullscreen>0</fullscreen>
|
||||
<icons>Tango</icons>
|
||||
</window>
|
||||
</xml>
|
||||
```
|
||||
|
||||
创建一个名为 `~/.config/DemoXMLParser` 的目录:
|
||||
|
||||
```
|
||||
$ mkdir ~/.config/DemoXMLParser
|
||||
```
|
||||
|
||||
在 Linux 中,`~/.config` 目录是存放配置文件的默认位置,这是在 [自由桌面工作组][4] 的规范中定义的。如果你正在使用一个不遵守 <ruby>自由桌面工作组<rt>Freedesktop</rt><ruby> 标准的操作系统,你也仍然可以使用这个目录,只不过你需要自己创建这些目录了。
|
||||
|
||||
复制 XML 的示例配置文件,粘贴并保存为 `~/.config/DemoXMLParser/myconfig.xml` 文件。
|
||||
|
||||
### 使用 Java 解析 XML
|
||||
|
||||
如果你是 Java 的初学者,你可以先阅读我写的 [面向 Java 入门开发者的 7 个小技巧][5]。一旦你对 Java 比较熟悉了,打开你最喜爱的集成开发工具(IDE),创建一个新工程。我会把我的新工程命名为 `myConfigParser`。
|
||||
|
||||
刚开始先不要太关注依赖导入和异常捕获这些,你可以先尝试用 `javax` 和 `java.io` 包里的标准 Java 扩展来实例化一个解析器。如果你使用了 IDE,它会提示你导入合适的依赖。如果没有,你也可以在文章稍后的部分找到完整的代码,里面就有完整的依赖列表。
|
||||
|
||||
|
||||
```
|
||||
Path configPath = Paths.get(System.getProperty("user.home"), ".config", "DemoXMLParser");
|
||||
File configFile = new File(configPath.toString(), "myconfig.xml");
|
||||
|
||||
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
|
||||
|
||||
DocumentBuilder builder = null;
|
||||
builder = factory.newDocumentBuilder();
|
||||
|
||||
Document doc = null;
|
||||
doc = builder.parse(configFile);
|
||||
doc.getDocumentElement().normalize();
|
||||
```
|
||||
|
||||
这段示例代码使用了 `java.nio.Paths` 类来找到用户的主目录,然后在拼接上默认配置文件的路径。接着,它用 `java.io.File` 类来把配置文件定义为一个 `File` 对象。
|
||||
|
||||
紧接着,它使用了 `javax.xml.parsers.DocumentBuilder` 和 `javax.xml.parsers.DocumentBuilderFactory` 这两个类来创建一个内部的文档构造器,这样 Java 程序就可以导入并解析 XML 数据了。
|
||||
|
||||
最后,Java 创建一个叫 `doc` 的文档对象,并且把 `configFile` 文件加载到这个对象里。通过使用 `org.w3c.dom` 包,它读取并规范化了 XML 数据。
|
||||
|
||||
基本上就是这样啦。理论上来讲,你已经完成了数据解析的工作。可是,如果你不能够访问数据的话,数据解析也没有多少用处嘛。所以,就让我们再来写一些查询,从你的配置中读取重要的属性值吧。
|
||||
|
||||
### 使用 Java 访问 XML 的值
|
||||
|
||||
从你已经读取的 XML 文档中获取数据,其实就是要先找到一个特定的节点,然后遍历它包含的所有元素。通常我们会使用多个循环语句来遍历节点中的元素,但是为了保持代码可读性,我会尽可能少地使用循环语句:
|
||||
|
||||
```
|
||||
NodeList nodes = doc.getElementsByTagName("window");
|
||||
|
||||
for (int i = 0; i < nodes.getLength(); i++) {
|
||||
Node mynode = nodes.item(i);
|
||||
System.out.println("Property = " + mynode.getNodeName());
|
||||
|
||||
if (mynode.getNodeType() == Node.ELEMENT_NODE) {
|
||||
Element myelement = (Element) mynode;
|
||||
|
||||
System.out.println("Theme = " + myelement.getElementsByTagName("theme").item(0).getTextContent());
|
||||
System.out.println("Fullscreen = " + myelement.getElementsByTagName("fullscreen").item(0).getTextContent());
|
||||
System.out.println("Icon set = " + myelement.getElementsByTagName("icons").item(0).getTextContent());
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
这段示例代码使用了 `org.w3c.dom.NodeList` 类,创建了一个名为 `nodes` 的 `NodeList` 对象。这个对象包含了所有名字匹配字符串 `window` 的子节点,实际上这样的节点只有一个,因为本文的示例配置文件中只配置了一个。
|
||||
|
||||
紧接着,它使用了一个 `for` 循环来遍历 `nodes` 列表。具体过程是:根据节点出现的顺序逐个取出,然后交给一个 `if-then` 子句处理。这个 `if-then` 子句创建了一个名为 `myelement` 的 `Element` 对象,其中包含了当前节点下的所有元素。你可以使用例如 `getChildNodes` 和 `getElementById` 方法来查询这些元素,项目中还 [记录了][9] 其他查询方法。
|
||||
|
||||
在这个示例中,每个元素就是配置的键。而配置的值储存在元素的内容中,你可以使用 `.getTextContent` 方法来提取出配置的值。
|
||||
|
||||
在你的 IDE 中运行代码(或者运行编译后的二进制文件):
|
||||
|
||||
```
|
||||
$ java ./DemoXMLParser.java
|
||||
Property = window
|
||||
Theme = Dark
|
||||
Fullscreen = 0
|
||||
Icon set = Tango
|
||||
```
|
||||
|
||||
下面是完整的代码示例:
|
||||
|
||||
```
|
||||
package myConfigParser;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.NamedNodeMap;
|
||||
import org.w3c.dom.Node;
|
||||
import org.w3c.dom.NodeList;
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
public class ConfigParser {
|
||||
|
||||
public static void main(String[] args) {
|
||||
Path configPath = Paths.get(System.getProperty("user.home"), ".config", "DemoXMLParser");
|
||||
File configFile = new File(configPath.toString(), "myconfig.xml");
|
||||
DocumentBuilderFactory factory =
|
||||
DocumentBuilderFactory.newInstance();
|
||||
DocumentBuilder builder = null;
|
||||
|
||||
try {
|
||||
builder = factory.newDocumentBuilder();
|
||||
} catch (ParserConfigurationException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
Document doc = null;
|
||||
|
||||
try {
|
||||
doc = builder.parse(configFile);
|
||||
} catch (SAXException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
doc.getDocumentElement().normalize();
|
||||
|
||||
NodeList nodes = doc.getElementsByTagName("window");
|
||||
for (int i = 0; i < nodes.getLength(); i++) {
|
||||
Node mynode = nodes.item(i);
|
||||
System.out.println("Property = " + mynode.getNodeName());
|
||||
|
||||
if (mynode.getNodeType() == Node.ELEMENT_NODE) {
|
||||
Element myelement = (Element) mynode;
|
||||
|
||||
System.out.println("Theme = " + myelement.getElementsByTagName("theme").item(0).getTextContent());
|
||||
System.out.println("Fullscreen = " + myelement.getElementsByTagName("fullscreen").item(0).getTextContent());
|
||||
System.out.println("Icon set = " + myelement.getElementsByTagName("icons").item(0).getTextContent());
|
||||
} // close if
|
||||
} // close for
|
||||
} // close method
|
||||
} //close class
|
||||
```
|
||||
|
||||
### 使用 Java 更新 XML
|
||||
|
||||
用户时不时地会改变某个偏好项,这时候 `org.w3c.dom` 库就可以帮助你更新某个 XML 元素的内容。你只需要选择这个 XML 元素,就像你读取它时那样。不过,此时你不再使用 `.getTextContent` 方法,而是使用 `.setTextContent` 方法。
|
||||
|
||||
```
|
||||
updatePref = myelement.getElementsByTagName("fullscreen").item(0);
|
||||
updatePref.setTextContent("1");
|
||||
|
||||
System.out.println("Updated fullscreen to " + myelement.getElementsByTagName("fullscreen").item(0).getTextContent());
|
||||
```
|
||||
|
||||
这么做会改变应用程序内存中的 XML 文档,但是还没有把数据写回到磁盘上。配合使用 `javax` 和 `w3c` 库,你就可以把读取到的 XML 内容写回到配置文件中。
|
||||
|
||||
```
|
||||
TransformerFactory transformerFactory = TransformerFactory.newInstance();
|
||||
|
||||
Transformer xtransform;
|
||||
xtransform = transformerFactory.newTransformer();
|
||||
|
||||
DOMSource mydom = new DOMSource(doc);
|
||||
StreamResult streamResult = new StreamResult(configFile);
|
||||
|
||||
xtransform.transform(mydom, streamResult);
|
||||
```
|
||||
|
||||
这么做会没有警告地写入转换后的数据,并覆盖掉之前的配置。
|
||||
|
||||
下面是完整的代码,包括更新 XML 的操作:
|
||||
|
||||
```
|
||||
package myConfigParser;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
import javax.xml.transform.Transformer;
|
||||
import javax.xml.transform.TransformerException;
|
||||
import javax.xml.transform.TransformerFactory;
|
||||
import javax.xml.transform.dom.DOMSource;
|
||||
import javax.xml.transform.stream.StreamResult;
|
||||
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.Node;
|
||||
import org.w3c.dom.NodeList;
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
public class ConfigParser {
|
||||
|
||||
public static void main(String[] args) {
|
||||
Path configPath = Paths.get(System.getProperty("user.home"), ".config", "DemoXMLParser");
|
||||
File configFile = new File(configPath.toString(), "myconfig.xml");
|
||||
DocumentBuilderFactory factory =
|
||||
DocumentBuilderFactory.newInstance();
|
||||
DocumentBuilder builder = null;
|
||||
|
||||
try {
|
||||
builder = factory.newDocumentBuilder();
|
||||
} catch (ParserConfigurationException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
Document doc = null;
|
||||
|
||||
try {
|
||||
doc = builder.parse(configFile);
|
||||
} catch (SAXException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
doc.getDocumentElement().normalize();
|
||||
Node updatePref = null;
|
||||
// NodeList nodes = doc.getChildNodes();
|
||||
NodeList nodes = doc.getElementsByTagName("window");
|
||||
for (int i = 0; i < nodes.getLength(); i++) {
|
||||
Node mynode = nodes.item(i);
|
||||
System.out.println("Property = " + mynode.getNodeName());
|
||||
|
||||
if (mynode.getNodeType() == Node.ELEMENT_NODE) {
|
||||
Element myelement = (Element) mynode;
|
||||
|
||||
System.out.println("Theme = " + myelement.getElementsByTagName("theme").item(0).getTextContent());
|
||||
System.out.println("Fullscreen = " + myelement.getElementsByTagName("fullscreen").item(0).getTextContent());
|
||||
System.out.println("Icon set = " + myelement.getElementsByTagName("icons").item(0).getTextContent());
|
||||
|
||||
updatePref = myelement.getElementsByTagName("fullscreen").item(0);
|
||||
updatePref.setTextContent("2");
|
||||
System.out.println("Updated fullscreen to " + myelement.getElementsByTagName("fullscreen").item(0).getTextContent());
|
||||
} // close if
|
||||
|
||||
}// close for
|
||||
|
||||
// write DOM back to the file
|
||||
TransformerFactory transformerFactory = TransformerFactory.newInstance();
|
||||
Transformer xtransform;
|
||||
|
||||
DOMSource mydom = new DOMSource(doc);
|
||||
StreamResult streamResult = new StreamResult(configFile);
|
||||
|
||||
try {
|
||||
xtransform = transformerFactory.newTransformer();
|
||||
xtransform.transform(mydom, streamResult);
|
||||
} catch (TransformerException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
} // close method
|
||||
} //close class
|
||||
```
|
||||
|
||||
### 如何保证配置不出问题
|
||||
|
||||
编写配置文件看上去是一个还挺简单的任务。一开始,你可能会用一个简单的文本格式,因为你的应用程序只要寥寥几个配置项而已。但是,随着你引入了更多的配置项,读取或者写入错误的数据可能会给你的应用程序带来意料之外的错误。一种帮助你保持配置过程安全、不出错的方法,就是使用类似 XML 的规范格式,然后依靠你用的编程语言的内置功能来处理这些复杂的事情。
|
||||
|
||||
这也正是我喜欢使用 Java 和 XML 的原因。每当我试图读取错误的配置值时,Java 就会提醒我。通常,这是由于我在代码中试图获取的节点,并不存在于我期望的 XML 路径中。XML 这种高度结构化的格式帮助了代码保持可靠性,这对用户和开发者来说都是有好处的。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/7/parsing-config-files-java
|
||||
|
||||
作者:[Seth Kenlon][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/seth
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/coffee_tea_laptop_computer_work_desk.png?itok=D5yMx_Dr (Person drinking a hot drink at the computer)
|
||||
[2]: https://opensource.com/resources/java
|
||||
[3]: https://opensource.com/article/21/6/what-config-files
|
||||
[4]: https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html
|
||||
[5]: https://opensource.com/article/19/10/java-basics
|
||||
[6]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+system
|
||||
[7]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+file
|
||||
[8]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+document
|
||||
[9]: https://www.w3.org/2003/01/dom2-javadoc/org/w3c/dom/Document.html
|
||||
[10]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string
|
||||
[11]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+ioexception
|
||||
[12]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+element
|
226
published/202203/20210711 How to Dual Boot Fedora and Windows.md
Normal file
226
published/202203/20210711 How to Dual Boot Fedora and Windows.md
Normal file
@ -0,0 +1,226 @@
|
||||
[#]: subject: (How to Dual Boot Fedora and Windows)
|
||||
[#]: via: (https://itsfoss.com/dual-boot-fedora-windows/)
|
||||
[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (robsean)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14401-1.html)
|
||||
|
||||
如何双启动 Fedora 和 Windows
|
||||
======
|
||||
|
||||
![][2]
|
||||
|
||||
> 这篇详细的教程一步一步地向你展示 **如何双启动 Fedora Linux 和 Windows 10**,附有适当的截图。
|
||||
|
||||
双启动 Linux 和 Windows 是一种完全享受这两款操作系统的流行方式。你可以在同一个硬件系统上安装 Linux 和 Windows 两款系统,并在你启动你的硬件系统时选择使用哪款操作系统。
|
||||
|
||||
![On the grub screen, you can select the operating system][1]
|
||||
|
||||
如果你有一个已经安装 Windows 的系统,你将在这篇教程中学习如何在 Windows 的旁侧安装 Fedora 。
|
||||
|
||||
### 在 Windows 的旁侧安装 Fedora
|
||||
|
||||
这篇教程是在一款已经安装 Windows,采用 GPT 分区和 UEFI 启动的硬件系统的基础上执行的。它应该也适用于其它的带有 MBR 分区和传统 BIOS 的硬件系统,但是我不能确认这一点。
|
||||
|
||||
注意:如果你的 Windows 系统使用 BitLocker 加密,在你安装 Fedora 前禁用它会是一个好主意。
|
||||
|
||||
#### 必要条件
|
||||
|
||||
这里是你需要遵循这篇教程的东西:
|
||||
|
||||
* 一个已预装 Windows 的系统
|
||||
* 良好的互联网连接速度
|
||||
* 一个至少 4 GB 大小的 USB 接口设备(U 盘)
|
||||
* 可选: 用于备份你的 Windows 现有数据的外部 USB 磁盘。
|
||||
* 可选: Windows 恢复或可启动磁盘(如果你偶遇一些严重的启动问题,你可以修复它)。
|
||||
|
||||
让我们看看步骤。
|
||||
|
||||
#### 步骤 1: 制作 Windows 系统的数据备份 [可选]
|
||||
|
||||
备份总会是一个好主意。因为你将要处理磁盘分区。在一些罕见的不幸情况下,假设你出错并删除了错误的分区,你将丢失你的数据。
|
||||
|
||||
最简单的方法是将文档、视频、音乐、图片和其它的文件夹中的数据复制到一块外部 USB 磁盘中。你可以使用一个外部的机械硬盘(传输速度较慢,但是价格较便宜)或固态硬盘(传输速度较快,但是价格较昂贵),并将重要的文件和文件夹复制到其中。
|
||||
|
||||
#### 步骤 2: 为 Fedora 的安装准备一些可用的空间
|
||||
|
||||
你需要创建一个分区,你将在其中安装 Fedora 。如果你只有一个 C 驱动器,缩小它的分区。如果你有 D、E 或 F 等多个驱动器,确保你可以移动这些驱动器中的数据到一些其它的分区中,删除或缩小其中的一个驱动器。超过 40 GB 的驱动器分区都能有足够的空间来安装安装 Fedora 。
|
||||
|
||||
在 Windows 的菜单中,搜索 “磁盘分区” 并转到 “创建并格式化磁盘分区”。
|
||||
|
||||
![][10]
|
||||
|
||||
在磁盘管理工具中,右键单件你想要分区的驱动器,并选择 “缩小卷”。
|
||||
|
||||
如果你只有一个像这样的分区,你需要为 Linux 腾出一些可用的空间。如果你有一些空间相当大的分区,请使用除 C 驱动器分区外的分区,因为它会擦除数据。
|
||||
|
||||
![][11]
|
||||
|
||||
#### 步骤 3: 在 Windows 中制作一个 Fedora 的临场 USB
|
||||
|
||||
现在,这个步骤可以通过不同的方法来完成。你可以下载 ISO 并使用 [Etcher][12] 或 Rufus 或一些其它的工具来将 ISO 镜像写入 USB 磁盘。
|
||||
|
||||
不过,Fedora 提供了一个用于下载 ISO 镜像和制作 <ruby>临场 USB<rt>Live USB</rt></ruby> 的专用工具。我将在这篇教程中使用它。Fedora 团队在创建这个工具时付出了很多艰难的努力,因此为什么不使用它呢。
|
||||
|
||||
但是,首先, **插入 USB 接口设备**。现在,转到 Fedora 的下载页面:
|
||||
|
||||
- [下载 Fedora][13]
|
||||
|
||||
你将看到针对 Windows 版本的下载 “Fedora Media Writer” 工具的选项。
|
||||
|
||||
![][14]
|
||||
|
||||
它将下载一个 exe 文件。在下载完成后,转到你所下载到的文件夹,并双击 `FedoraMediaWriter.exe` 文件来安装 “Fedora Media Writer” 工具。只需要重复点击 “<ruby>下一步<rt>next</rt></ruby> 。
|
||||
|
||||
![][15]
|
||||
|
||||
在安装完成后,运行 “Fedora Media Writer” 工具。但是在此之前,**确保你已经插入 USB 设备**。
|
||||
|
||||
它将给予你安装各种 Fedora 版本的选项。针对桌面机,选择<ruby>工作站<rt>Workstation</rt></ruby>版本。
|
||||
|
||||
![][16]
|
||||
|
||||
在接下来的屏幕中,你将会得到一个创建临场 USB 的选项。当你点击这个按钮时,它将开始下载 ISO 文件。它也将识别出你所插入的 USB 接口设备。
|
||||
|
||||
你需要良好的互联网访问速度来在一段时间内顺畅地下载 2GB 大小的 ISO 文件。
|
||||
|
||||
![][17]
|
||||
|
||||
在下载 ISO 后,它会自动地对其进行检验,并给予你将 ISO 镜像写入到 USB 磁盘的选项,例如,创建临场 USB 。点击 “<ruby>写入到磁盘<rt>Write to Disk</rt></ruby>” 按钮。
|
||||
|
||||
![][18]
|
||||
|
||||
它将花费几分钟来完成安装过程。它显示 “<ruby>完成<rt>Finished</rt></ruby>” 信息后,你可以关闭 “Fedora Media Writer” 工具了。
|
||||
|
||||
![][19]
|
||||
|
||||
很好!现在你已经准备好了 Fedora 临场 USB 。现在是时候使用它来安装带有图形用户界面的 Fedora 了。
|
||||
|
||||
#### 步骤 4: 从 临场 USB 启动并安装 Fedora
|
||||
|
||||
一些系统不允许你在使用安全启动的情形下从临场 USB 启动。如果你是这种情况的话,请 [禁用安全启动][20]。
|
||||
|
||||
在处于显示硬件系统制造商徽标的屏幕期间,按下 `F2` 或 `F10` 或 `F12` 按键。如果你不确定是哪个按键,你可以逐个尝试。但是,你要 **快速地** 按下按键 ,否则它将会启动到操作系统之中。
|
||||
|
||||
不同品牌计算机的按键是不同的。一些计算机甚至可能使用 `Esc` 或 `Del` 按键来完成此目的。
|
||||
|
||||
![Quickly press F2, F10 or F12 keys at the screen showing your system manufacturer’s logo][21]
|
||||
|
||||
在一些罕见的情况下,你可能需要 [在 Windows 中访问 UEFI 启动设置][22]。
|
||||
|
||||
在 BIOS 设置中,通常,你应该会看到像这样的屏幕。在这里,你可以使用箭头按键来向下移动到 USB 选项,并按下回车键来从 USB 启动。请注意,在不同的系统中,这一屏幕可能会看起来有所不同。
|
||||
|
||||
![][23]
|
||||
|
||||
如果一切顺利,你应该会看到像下面的一个屏幕。选择第一个选项 “<ruby>启动 Fedora 工作站<rt>Start Fedora Workstation</rt></ruby>”:
|
||||
|
||||
![][24]
|
||||
|
||||
在数秒后,你应该会启动到 Fedora 临场会话期间,并会看到尝试或安装它的选项。选择 “<ruby>安装到硬盘<rt>Install to Hard Drive</rt></ruby>” 。
|
||||
|
||||
![][25]
|
||||
|
||||
它会要求选择安装过程的语言选项。
|
||||
|
||||
![][26]
|
||||
|
||||
接下来的屏幕是很重要的。如果你已经在 “步骤 2” 中创建了可用的空间,你应该能够点击 “<ruby>开始安装<rt>Begin Installation</rt></ruby>” 。如果你在“<ruby>系统<rt>SYSTEM</rt></ruby>”下的磁盘图标上看到一个感叹号,单击它,并查看你能够在这里使用哪种磁盘配置。
|
||||
|
||||
如果你有多个磁盘,你可以为 Fedora 选择使用哪个磁盘。
|
||||
|
||||
![][27]
|
||||
|
||||
选择磁盘,并点击“<ruby>完成<rt>Done</rt></ruby>” 。现在,你应该会看到一条警告信息。在我的实例中,我没有在 “步骤 2” 中创建可用的空间,因此它会抱怨这里没有足够的可用的空间来安装 Fedora 。
|
||||
|
||||
![][28]
|
||||
|
||||
我点击 “<ruby>回收空间<rt>Reclaim space</rt></ruby>” ,并缩小在这里的 Windows 分区。
|
||||
|
||||
![][29]
|
||||
|
||||
在这以后,将出现 “<ruby>开始安装<rt>Begin Installation</rt></ruby>” 选项,开启安装过程。
|
||||
|
||||
![][30]
|
||||
|
||||
现在,它只是一个需要耐心等待的游戏了。将花费数分钟来提取文件并安装它们。
|
||||
|
||||
![][31]
|
||||
|
||||
当过程完成后,你将看到 “<ruby>结束安装<rt>Finish Installation</rt></ruby>” 按钮,点击它。
|
||||
|
||||
![][32]
|
||||
|
||||
你将回到 Fedora 临场会话期间。单击右上角的下拉菜单并选择 “<ruby>重新启动<rt>Restart</rt></ruby>” 。
|
||||
|
||||
![][33]
|
||||
|
||||
现在,当系统启动时,你应该会看到带有启动到 Fedora 和 Windows 选项的 [Grub 启动器][34]。
|
||||
|
||||
![][1]
|
||||
|
||||
#### 步骤 5: 完成 Fedora 安装
|
||||
|
||||
至此你几乎完成了安装。你注意到 Fedora 没有要求你输入用户名和密码了吗?很多发行版(像 Ubuntu )在安装期间会要求你创建一个管理用户。作为另一种方式,Fedora 会在你第一次登录到所安装的系统时给予你这个选项。
|
||||
|
||||
当你第一次登录时,它会运行一次设置,并创建用户名和密码来作为这次初始化设置的一部分。
|
||||
|
||||
![][35]
|
||||
|
||||
![][36]
|
||||
|
||||
![][37]
|
||||
|
||||
在你完成后,你已经用上 Fedora Linux 了。
|
||||
|
||||
![][38]
|
||||
|
||||
就这样,你可以在同一个硬件系统上以双启动的模式来享受 Fedora Linux 和 Windows 。
|
||||
|
||||
如果你在学习这篇教程时有一些问题或者你正在面对一些重大难题,请在评论系统中告诉我。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/dual-boot-fedora-windows/
|
||||
|
||||
作者:[Abhishek Prakash][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[robsean](https://github.com/robsean)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/abhishek/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/07/dual-boot-grub-screen-fedora-windows.jpg?resize=800%2C350&ssl=1
|
||||
[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/07/fedora-windows-dual-boot.jpg?resize=800%2C450&ssl=1
|
||||
[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/03/disc-management-windows.png?resize=800%2C561&ssl=1
|
||||
[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/04/making-free-space-for-dual-boot.jpg?resize=1226%2C728&ssl=1
|
||||
[12]: https://itsfoss.com/install-etcher-linux/
|
||||
[13]: https://getfedora.org/en/workstation/download/
|
||||
[14]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/07/download-fedora-media-writer-tool.png?resize=800%2C373&ssl=1
|
||||
[15]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/07/installing-Fedora-Media-Writer-tool-Windows.png?resize=745%2C581&ssl=1
|
||||
[16]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/07/fedora-media-writer-1.png?resize=800%2C425&ssl=1
|
||||
[17]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/07/fedora-media-writer-2.jpg?resize=800%2C422&ssl=1
|
||||
[18]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/07/writing-fedora-iso-to-usb-with-Fedora-Media-Writer-Tool.png?resize=800%2C285&ssl=1
|
||||
[19]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/07/fedoa-live-usb-with-fedora-media-writer.png?resize=800%2C300&ssl=1
|
||||
[20]: https://itsfoss.com/disable-secure-boot-windows/
|
||||
[21]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/acer-predator-boot.jpg?resize=800%2C600&ssl=1
|
||||
[22]: https://itsfoss.com/access-uefi-settings-windows-10/
|
||||
[23]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/06/select-boot-from-live-usb.jpg?resize=800%2C330&ssl=1
|
||||
[24]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/07/fedora-live-screen.jpg?resize=800%2C350&ssl=1
|
||||
[25]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/07/Fedora-install-screen.jpg?resize=800%2C450&ssl=1
|
||||
[26]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/07/installing-fedora-1.png?resize=800%2C450&ssl=1
|
||||
[27]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/07/installing-fedora-2.png?resize=800%2C450&ssl=1
|
||||
[28]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/07/installing-fedora-3.png?resize=800%2C450&ssl=1
|
||||
[29]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/07/installing-fedora-4.png?resize=800%2C450&ssl=1
|
||||
[30]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/07/installing-fedora-5.png?resize=800%2C450&ssl=1
|
||||
[31]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/07/installing-fedora-6.png?resize=800%2C450&ssl=1
|
||||
[32]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/07/installing-fedora-7.png?resize=800%2C450&ssl=1
|
||||
[33]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/07/restart-gnome-fedora.jpg?resize=799%2C439&ssl=1
|
||||
[34]: https://itsfoss.com/what-is-grub/
|
||||
[35]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/07/fedora-setup-1.png?resize=800%2C575&ssl=1
|
||||
[36]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/07/fedora-setup-2.png?resize=800%2C593&ssl=1
|
||||
[37]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/07/fedora-setup-3.png?resize=800%2C591&ssl=1
|
||||
[38]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/07/fedora-setup-completed.jpg?resize=800%2C500&ssl=1
|
@ -0,0 +1,194 @@
|
||||
[#]: subject: "Solve the repository impedance mismatch in CI/CD"
|
||||
[#]: via: "https://opensource.com/article/21/8/impedance-mismatch-cicd"
|
||||
[#]: author: "Evan \"Hippy\" Slatis https://opensource.com/users/hippyod"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "lxbwolf"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14396-1.html"
|
||||
|
||||
解决 CI/CD 中的仓库阻抗失配
|
||||
======
|
||||
|
||||
> 对齐部署镜像和描述符是很困难的,但是某些策略可以使整个过程更高效。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202203/26/111748mxu3ovasrvb0iy02.jpg)
|
||||
|
||||
在软件架构中,当两个组件之间有某些概念性或技术上的差异时会出现 <ruby>阻抗失配<rt>impedance mismatch</rt></ruby>。这个术语其实是从电子工程中借用的,表示电路中输入和输出的电子阻抗必须要匹配。
|
||||
|
||||
在软件开发中,存储在镜像仓库中的镜像与存储在源码控制管理系统(LCTT 译注:SCM,Source Code Management)中它的<ruby>部署描述符<rt>deployment descriptor</rt></ruby>之间存在阻抗失配。你如何确定存储在 SCM 中的部署描述符表示的是正确的镜像?两个仓库追踪数据的方式并不一致,因此将一个镜像(在镜像仓库中独立存储的不可修改的二进制)和它的部署描述符(Git 中以文本文件形式存储的一系列修改记录)相匹配并不那么直观。
|
||||
|
||||
**注意**:本文假定读者已经熟悉以下概念:
|
||||
|
||||
* <ruby>源码控制管理<rt>Source Control Management</rt></ruby>(SCM)系统和分支
|
||||
* Docker 或符合 OCI 标准的镜像和容器
|
||||
* <ruby>容器编排系统<rt>Container Orchestration Platforms</rt></ruby>(COP),如 Kubernetes
|
||||
* <ruby>持续集成/持续交付<rt>Continuous Integration/Continuous Delivery</rt></ruby>(CI/CD)
|
||||
* <ruby>软件开发生命周期<rt>Software development lifecycle</rt></ruby>(SDLC)环境
|
||||
|
||||
### 阻抗失配:SCM 与镜像仓库
|
||||
|
||||
为了更好地理解阻抗失配在什么场景下会成为问题,请考虑任意项目中的软件开发生命周期环境(SDLC),如开发、测试或发布环境。
|
||||
|
||||
测试环境不会有阻抗失配。现在使用 CI/CD 的最佳实践中开发分支的最新提交都会对应开发环境中的最新部署。因此,一个典型的、成功的 CI/CD 开发流程如下:
|
||||
|
||||
1. 向 SCM 的开发分支提交新的修改
|
||||
2. 新提交触发一次镜像构建
|
||||
3. 新生成的镜像被推送到镜像仓库,标记为开发中
|
||||
4. 镜像被部署到容器编排系统(COP)中的开发环境,该镜像的部署描述符也更新为从 SCM 拉取的最新描述符。
|
||||
|
||||
换句话说,开发环境中最新的镜像永远与最新的部署描述符匹配。回滚到前一个构建的版本也不是问题,因为 SCM 也会跟着回滚。
|
||||
|
||||
最终,随着开发流程继续推进,需要进行更多正式的测试,因此某个镜像 —— 镜像对应着 SCM 中的某次提交 —— 被推到测试环境。如果是一次成功的构建,那么不会有大问题,因为从开发环境推过来的镜像应该会与开发分支的最新提交相对应。
|
||||
|
||||
1. 开发环境的最新部署被允许入库,触发入库过程
|
||||
2. 最新部署的镜像被标记为测试中
|
||||
3. 镜像在测试环境中被拉取和部署,(该镜像)对应从 SCM 拉取的最新部署描述符
|
||||
|
||||
到目前为止,一切都没有问题,对吗?如果出现下面的场景,会有什么问题?
|
||||
|
||||
**场景 A**:镜像被推到下游环境,如<ruby>用户验收测试<rt>user acceptance testing </rt></ruby>(UAT),或者是生产环境。
|
||||
|
||||
**场景 B**:测试环境中发现了一个破坏性的 bug,镜像需要回滚到某个确定正常的版本。
|
||||
|
||||
在任一场景中,开发过程并没有停止,即开发分支上游有了一次或多次新的提交,而这意味着最新的部署描述符已经发生了变化,最新的镜像与之前部署在测试环境中的镜像不一致。对部署描述符的修改可能会也可能不会对之前版本的镜像起作用,但是它们一定是不可信任的。如果它们有了变化,那么它们就一定与目前为止你测试过的想要部署的镜像的部署描述符不一致。
|
||||
|
||||
问题的关键是:**如果部署的镜像不是镜像库中的最新版本,你怎么确定与部署的镜像相对应的是 SCM 中的哪个部署描述符?** 一言以蔽之,无法确定。两个库直接有阻抗失配。如果要详细阐述下,那么是有方法可以解决的,但是你需要做很多工作,这部分内容就是文章接下来的主题了。请注意,下面的方案并不是解决问题的唯一办法,但是已经投入到生产环境并已经对很多项目起了作用,而且已经被构建并部署到生产环境中运行了超过一年。
|
||||
|
||||
### 二进制与部署描述符
|
||||
|
||||
源码通常被构建成一个 Docker 镜像或符合 OCI 标准的镜像,该镜像通常被部署到一个容器编排平台(COP)上,如 Kubernetes。部署到 COP 需要部署描述符来定义镜像被如何部署以及作为容器运行,如 [Kubernetes 部署][2] 或 [CronJobs][3]。这是因为在镜像和它的部署描述符之间有本质差异,在这里可以看到阻抗失配。在这次讨论中,我们认为镜像是存储在镜像仓库中不可修改的二进制。对源码的任何修改都不会修改镜像,而是用另一个新的镜像去替换它。
|
||||
|
||||
相比之下,部署描述符是文本文件,因而可以被认为是源码且可修改。如果遵循最佳实践,那么部署描述符是被存储在 SCM,所有修改都会提交,而这很容易回溯。
|
||||
|
||||
### 解决阻抗失配
|
||||
|
||||
建议的解决方案的第一部分,就是提供一个能匹配镜像仓库中的镜像与对保存部署描述符的 SCM 做的代码提交的方法。最直接的解决方案是用源提交的哈希值标记镜像。这个方法可以区分不同版本的镜像、容易分辨,并且提供足够的信息来查找正确的部署描述符,以便镜像更好地部署到 COP。
|
||||
|
||||
再回顾下上面的场景:
|
||||
|
||||
**场景 A** _镜像被推到下游环境_: 当镜像被从测试环境推到 UAT 环境时,我们可以从镜像的标签中知道应该从 SCM 的哪一次源码提交拉取部署描述符。
|
||||
|
||||
**场景 B** _当一个镜像需要在某一环节中回滚_:无论我们选择回滚到那个镜像版本,我们都可以知道从 SCM 的哪一次源码提交拉取正确的部署描述符。
|
||||
|
||||
在每一种情景中,无论在某个镜像被部署到测试环境后开发分支有多少次提交和构建,对于每一次升级的镜像,我们都可以找到它当初部署时对应的部署描述符。
|
||||
|
||||
然而,这并不是阻抗失配的完整解决方案。再考虑两个场景:
|
||||
|
||||
**场景 C** 在负载测试环境中,会尝试对不同的部署描述符进行多次部署,以此来验证某一次构建的表现。
|
||||
|
||||
**场景 D** 一个镜像被推送到下游环境,在该环境中部署描述符有一个错误。
|
||||
|
||||
在上面的所有场景中,我们都需要修改部署描述符,但是目前为止我们只有一个源码提交哈希。请记住,最佳实践要求我们所有对源码的修改都要先提交到 SCM。某次提交的哈希本身是无法修改的,因此我们需要一个比仅仅追踪原来的源码提交哈希更好地解决方案。
|
||||
|
||||
解决方案是基于原来的源码提交哈希新建一个分支。我们把这个分支称为**部署分支**。每当一个镜像被推到下游测试或发布环境时,你应该**基于前一个 SDLC 环境的部署分支的最新提交**创建一个新的部署分支。
|
||||
|
||||
这样同一个镜像可以重复多次部署到不同的 SDLC 环境,并在后面每个环境中可以感知前面发现的改动或对镜像做的修改。
|
||||
|
||||
**注意:** 在某个环境中做的修改是如何影响下一个环境的,是用可以共享数据的工具(如 Helm Charts)还是手动剪切、粘贴到其他目录,都不在本文讨论的范围内。
|
||||
|
||||
因此,当一个镜像被从一个 SDLC 环境中推到下一环境时:
|
||||
|
||||
1. 创建一个部署分支
|
||||
1. 如果镜像是从开发环境中推过来的,那么部署分支就基于构建这个镜像的源码提交哈希创建
|
||||
2. 否则,_部署分支基于当前部署分支的最新提交创建_
|
||||
2. 镜像被部署到下一个 SDLC 环境,使用的部署描述符是该环境中新创建的部署分支的部署描述符
|
||||
|
||||
![deployment branching tree][4]
|
||||
|
||||
*图 1:部署分支树*
|
||||
|
||||
1. 部署分支
|
||||
2. 下游环境的第一个部署分支,只有一次提交
|
||||
3. 下游环境的第二个部署分支,只有一次提交
|
||||
|
||||
有了部署分支这个解决方案,再回顾下上面的场景 C 和场景 D:
|
||||
|
||||
**场景 C** 修改已经部署到下游 SDLC 环境中的镜像的部署描述符
|
||||
|
||||
**场景 D** 修复某个 SDLC 环境中部署描述符的错误
|
||||
|
||||
两个场景中,工作流如下:
|
||||
|
||||
1. 把对部署描述符做的修改提交到 SLDC 环境和镜像对应的部署分支
|
||||
2. 通过部署分支最新提交对应的部署描述符把镜像重新部署到 SLDC 环境
|
||||
|
||||
这样,部署分支彻底解决了(存储着代表一次独一无二的构建的单一的、不可修改的镜像的)镜像仓库与(存储着对应一个或多个 SDLC 环境的可修改的部署描述符的)SCM 仓库之间的阻抗失配。
|
||||
|
||||
### 实践中的思考
|
||||
|
||||
这看起来像是行得通的解决方案,但同时它也为开发者和运维人员带来了新的实践中的问题,比如:
|
||||
|
||||
A. 为了更好地管理部署分支,部署描述符作为资源应该保存在哪里,是否要与构建镜像的源码保存在同一个 SCM 仓库?
|
||||
|
||||
到目前为止,我们都在避免谈论应该把部署描述符放在哪个仓库里。在还没有太多细节需要处理时,我们推荐把所有 SDLC 环境的部署描述符与镜像源码放在同一个 SCM 仓库。当部署分支创建后,镜像的源码可以作为方便找到部署的容器中运行的镜像的引用来使用。
|
||||
|
||||
上面提到过,可以通过镜像的标签来关联镜像与原始的源码提交。在一个单独的仓库中查找某次提交的源码的引用,会给开发者带来更大的困难(即便借助工具),这就是没有必要把所有资源都分开存储的原因。
|
||||
|
||||
B. 应该在部署分支上修改构建镜像的源码吗?
|
||||
|
||||
简答:**不应该**。
|
||||
|
||||
详细阐述:不应该,因为永远不要在部署分支上构建镜像,它们是在开发分支上构建的。修改部署分支上定义一个镜像的源码会破坏被部署的镜像的构建记录,而且这些修改并不会对镜像的功能生效。在对比两个部署分支的版本时这也会成为问题。这可能会导致两个版本的功能差异有错误的测试结果(这是使用部署分支的一个很小的额外好处)。
|
||||
|
||||
C. 为什么使用镜像 <ruby>标签<rt>tag</rt></ruby>?<ruby>标记<rt>label</rt></ruby> 不可以吗?
|
||||
|
||||
通过 <ruby>标签<rt>tag</rt></ruby> 可以在仓库中很容易地查找镜像,可读性也很好。在一组镜像中读取和查找 <ruby>标记<rt>label</rt></ruby> 的值需要拉取所有镜像的<ruby>清单文件<rt>manifest</rt></ruby>,而这会增加复杂度、降低性能。而且,考虑到历史记录的追踪和不同版本的查找,对不同版本的镜像添加 <ruby>标签<rt>tag</rt></ruby> 也很有必要,因此使用源码提交哈希是保证唯一性,以及保存能即时生效的有用信息的最简单的解决方案。
|
||||
|
||||
D. 创建部署分支的最佳实践是怎样的?
|
||||
|
||||
DevOps 最重要的三个原则:自动化、自动化、自动化。
|
||||
|
||||
依赖资源来持续地强迫遵循最佳实践,充其量只是碰运气,因此在实现镜像的升级、回滚等 CI/CD 流水线时,把自动化部署分支写到脚本里。
|
||||
|
||||
E. 对部署分支的命名规范有建议吗?
|
||||
|
||||
<**部署分支标识**>-<**环境**>-<**源码提交哈希**>
|
||||
|
||||
* **部署分支标识**: 所有部署分支范围内唯一的字符串;如 “deployment” 或 “deploy”
|
||||
* **环境**: 部署分支适用的 SDLC 环境;如 “qa”(测试环境)、 “stg”(预生产环境)、 或 “prod”(生产环境)
|
||||
* **源码提交哈希**: 源码提交哈希中包含原来构建被部署的镜像的源码,开发者可以通过它很容易地查找到创建镜像的原始提交,同时也能保证分支名唯一。
|
||||
|
||||
例如, `deployment-qa-asdf78s` 表示推到 QA 环境的部署分支, `deployment-stg-asdf78s` 表示推到 STG 环境的部署分支。
|
||||
|
||||
F. 你怎么识别环境中运行的哪个镜像版本?
|
||||
|
||||
我们的建议是把最新的部署分支提交哈希和源码提交哈希添加到 [标记][5] 中。开发者和运维人员可以通过这两个独一无二的标识符查找到部署的所有东西及其来源。在诸如执行回滚或前滚操作时,使用那些不同版本的部署的选择器也能清理资源碎片。
|
||||
|
||||
G. 什么时候应该把部署分支的修改合并回开发分支?
|
||||
|
||||
这完全取决于开发团队。
|
||||
|
||||
如果你修改的目的是为了做负载测试,只是想验证什么情况会让程序崩溃,那么这些修改不应该被合并回开发分支。另一方面,如果你发现和修复了一个错误,或者对下游环境的部署做了调整,那么就应该把部署分支的修改合并回开发分支。
|
||||
|
||||
H. 有现成的部署分支示例让我们试水吗?
|
||||
|
||||
[el-CICD][6] 已经在生产上使用这个策略持续一年半应用到超过一百个项目了,覆盖所有的 SDLC 环境,包括管理生产环境的部署。如果你可以访问 [OKD][7]、Red Hat OpenShift lab cluster 或 [Red Hat CodeReady Containers][8],你可以下载[el-CICD 的最新版本][9],参照 [教程][10] 来学习部署分支是何时以怎样的方式创建和使用的。
|
||||
|
||||
### 结语
|
||||
|
||||
通过实践上面的例子可以帮助你更好的理解开发过程中阻抗失配相关的问题。对齐镜像和部署描述符是成功管理部署的关键部分。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/8/impedance-mismatch-cicd
|
||||
|
||||
作者:[Evan "Hippy" Slatis][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[lxbwolf](https://github.com/lxbwolf)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/hippyod
|
||||
[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://kubernetes.io/docs/concepts/workloads/controllers/deployment/
|
||||
[3]: https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/
|
||||
[4]: https://opensource.com/sites/default/files/picture1.png
|
||||
[5]: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
|
||||
[6]: https://github.com/elcicd
|
||||
[7]: https://www.okd.io/
|
||||
[8]: https://cloud.redhat.com/openshift/create/local
|
||||
[9]: https://github.com/elcicd/el-CICD-RELEASES
|
||||
[10]: https://github.com/elcicd/el-CICD-docs/blob/master/tutorial.md
|
@ -0,0 +1,97 @@
|
||||
[#]: subject: "How to Completely Uninstall Google Chrome From Ubuntu"
|
||||
[#]: via: "https://itsfoss.com/uninstall-chrome-from-ubuntu/"
|
||||
[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "lkxed"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14368-1.html"
|
||||
|
||||
如何从 Ubuntu 中彻底卸载 Google Chrome
|
||||
======
|
||||
|
||||
现在,你已经成功地 [在 Ubuntu 上安装 Google Chrome][1]。毕竟,它是世界上最受欢迎的网页浏览器了。
|
||||
|
||||
但是,你可能会不喜欢 Google 的产品,因为它们对用户的信息进行追踪和数据挖掘。你决定选择 [Ubuntu 上的其他网页浏览器][2],并且它或许是一个 [非 Chromium 核心的浏览器][3]。
|
||||
|
||||
既然你已经不再使用 [Google Chrome][4] 了,那么,把它从 Ubuntu 系统中移除是一个明智的选择。
|
||||
|
||||
如何才能做到这一点呢?我来告诉你具体的步骤。
|
||||
|
||||
### 从 Ubuntu 中完全移除 Google Chrome
|
||||
|
||||
![Illustration for removing Google Chrome from Ubuntu][5]
|
||||
|
||||
你可能使用了图形界面的方式安装 Google Chrome,但不幸的是,你得使用命令行的方式来移除它,除非你选择 [使用 Synaptic 软件包管理器][6]。
|
||||
|
||||
使用命令行来做这件事也不是很难。首先,按下 [键盘上的 Ctrl+Alt+T 快捷键来打开一个终端][7]。
|
||||
|
||||
在终端中输入下面的命令:
|
||||
|
||||
```
|
||||
sudo apt purge google-chrome-stable
|
||||
```
|
||||
|
||||
此时它会向你索要一个密码,这个密码是你的用户账户密码,也就是你用来登录 Ubuntu 系统的密码。
|
||||
|
||||
当你输入密码的时候,屏幕上什么也不会显示。这是 Linux 系统的正常行为。继续输入密码,完成后按下回车键。
|
||||
|
||||
此时它会让你确认是否删除 Google Chrome,输入 `Y` 来确认,或者直接按下回车键也行。
|
||||
|
||||
![Removing Google Chrome for Ubuntu][8]
|
||||
|
||||
这个操作会从你的 Ubuntu Linux 系统中移除 Google Chrome,同时也会移除大多数相关的系统文件。
|
||||
|
||||
但是,你的个人设置文件仍然保留在用户主目录中。它包含了 Cookie、会话、书签和其他与你的账户相关的 Chrome 设置信息。当你下次安装 Google Chrome 时,这些文件可以被 Chrome 再次使用。
|
||||
|
||||
![Google Chrome leftover settings in Ubuntu][9]
|
||||
|
||||
如果你想要彻底地移除 Google Chrome,你可能会想要把这些文件也移除掉。那么,下面是你需要做的:
|
||||
|
||||
切换到 `.config` 目录。 **注意 config 前面有个点**`,这是 [Linux 隐藏文件和目录的方式][10]。
|
||||
|
||||
```
|
||||
cd ~/.config
|
||||
```
|
||||
|
||||
然后移除 `google-chrome` 目录:
|
||||
|
||||
```
|
||||
rm -rf google-chrome
|
||||
```
|
||||
|
||||
![Removing the leftover Google Chrome settings from Ubuntu][11]
|
||||
|
||||
你也可以仅使用一个命令 `rm -rf ~/.config/google-chrome` 来删除它。因为本教程面向的对象是完完全全的初学者,所以我把这个命令拆分为以上两个步骤来完成,这样可以减少由于拼写问题造成的可能错误。
|
||||
|
||||
> 小技巧
|
||||
>
|
||||
> 想要你的终端和截图里看起来一样漂亮吗?试试这些 [终端定制小技巧][12]。
|
||||
|
||||
我希望这篇快速的入门技巧可以帮助你在 Ubuntu 上摆脱 Google Chrome。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/uninstall-chrome-from-ubuntu/
|
||||
|
||||
作者:[Abhishek Prakash][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/abhishek/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://itsfoss.com/install-chrome-ubuntu/
|
||||
[2]: https://itsfoss.com/best-browsers-ubuntu-linux/
|
||||
[3]: https://itsfoss.com/open-source-browsers-linux/
|
||||
[4]: https://www.google.com/chrome/index.html
|
||||
[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/removing-google-chrome-ubuntu.png?resize=800%2C450&ssl=1
|
||||
[6]: https://itsfoss.com/synaptic-package-manager/
|
||||
[7]: https://itsfoss.com/open-terminal-ubuntu/
|
||||
[8]: https://itsfoss.com/wp-content/uploads/2021/09/remove-google-chrome-ubuntu.webp
|
||||
[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/google-chrome-ubuntu-leftover-settings.png?resize=800%2C518&ssl=1
|
||||
[10]: https://itsfoss.com/hide-folders-and-show-hidden-files-in-ubuntu-beginner-trick/
|
||||
[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/remove-google-chrome-leftover-settings-from-Ubuntu.png?resize=800%2C277&ssl=1
|
||||
[12]: https://itsfoss.com/customize-linux-terminal/
|
@ -0,0 +1,273 @@
|
||||
[#]: subject: "How I migrated a WordPress website to a new host"
|
||||
[#]: via: "https://opensource.com/article/21/9/migrate-wordpress"
|
||||
[#]: author: "David Both https://opensource.com/users/dboth"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "lxbwolf"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14371-1.html"
|
||||
|
||||
如何把 WordPress 网站迁移到新主机
|
||||
======
|
||||
|
||||
> 使用这个简单的方法来迁移一个网站以及管理防火墙配置。
|
||||
|
||||
![(https://img.linux.net.cn/data/attachment/album/202203/19/124316krzvxcr4ff2kr2ji.jpg)]
|
||||
|
||||
你有过把一个 WordPress 网站迁移到一台新主机上的需求吗?我曾经迁移过好多次,迁移过程相当简单。当然,的的市场时候我都不会用通用的推荐方法,这次也不例外 —— 我用更简单的方法,这才是我推荐的方法。
|
||||
|
||||
这个迁移方法没有破坏性,因此如果出于某些原因你需要还原到原来的服务器上,很容易可以实现。
|
||||
|
||||
### 一个 WordPress 网站的组成部分
|
||||
|
||||
运行一个基于 [WordPress][2] 的网站有三个重要组成部分:WordPress 本身,一个 web 服务器,如 [Apache][3](我正在用),以及 [MariaDB][4]。MariaDB 是 MySQL 的一个分支,功能相似。
|
||||
|
||||
业界有大量的 Web 服务器,由于我使用了 Apache 很长时间,因此我推荐用 Apache。你可能需要把 Apache 的配置方法改成你用的 Web 服务器的方法。
|
||||
|
||||
### 初始配置
|
||||
|
||||
我使用一台 Linux 主机作为防火墙和网络路由。在我的网络中 Web 服务器是另一台主机。我的内部网络使用的是 C 类私有网络地址范围,按 <ruby>[无类别域间路由][5]<rt>Classless Internet Domain Routing</rt></ruby>(CIDR)方式简单地记作 192.168.0.0/24。
|
||||
|
||||
对于防火墙,相比于更复杂的 `firewalld`,我更喜欢用非常简单的 [IPTables][6]。这份防火墙配置中的一行会把 80 端口(HTTP)接收到的包发送给 Web 服务器。在 `/etc/sysconfig/iptables` 文件中,你可以在注释中看到,我添加了规则,把其他入站服务器连接转发到同一台服务器上合适的端口。
|
||||
|
||||
```
|
||||
# Reroute ports for inbound connections to the appropriate web/email/etc server.
|
||||
# HTTPD goes to 192.168.0.75
|
||||
-A PREROUTING -d 45.20.209.41/255.255.255.248 -p tcp -m tcp --dport 80 \
|
||||
|
||||
-j DNAT --to-destination 192.168.0.75:80
|
||||
```
|
||||
|
||||
我使用<ruby>命名虚拟主机<rt>named virtual host</rt></ruby>来配置原来的 Apache Web 服务器,因为我在这个 HTTPD 实例上运行着多个网站。使用命名虚拟主机配置是个不错的方法,因为(像我一样)未来你可能会在运行其他的网站,这个方法可以使其变得容易。
|
||||
|
||||
`/etc/httpd/conf/httpd.conf` 中需要迁移的虚拟主机的网站相关部分请参考下面代码。这个片段中不涉及到 IP 地址的修改,因此在新服务器上使用时不需要修改。
|
||||
|
||||
```
|
||||
<VirtualHost *:80>
|
||||
ServerName www.website1.org
|
||||
ServerAlias server.org
|
||||
|
||||
DocumentRoot "/var/website1/html"
|
||||
ErrorLog "logs/error_log"
|
||||
ServerAdmin me@website1.org
|
||||
|
||||
<Directory "/var/website1/html">
|
||||
Options Indexes FollowSymLinks
|
||||
|
||||
AllowOverride None
|
||||
Require all granted
|
||||
|
||||
</Directory>
|
||||
</VirtualHost>
|
||||
```
|
||||
|
||||
在迁移之前,你需要在 `httpd.conf` 的最顶端附近找到 `Listen` 声明并修改成类似下面这样。这个地址是服务器的真实私有 IP 地址,不是公开 IP 地址。
|
||||
|
||||
```
|
||||
Listen 192.168.0.75:80
|
||||
```
|
||||
|
||||
你需要修改新主机上 `Listen` 的 IP 地址。
|
||||
|
||||
### 前期工作
|
||||
|
||||
准备工作分为以下三步:
|
||||
|
||||
* 安装服务
|
||||
* 配置防火墙
|
||||
* 配置 web 服务器
|
||||
|
||||
#### 安装 Apache 和 MariaDB
|
||||
|
||||
如果你的新服务器上还没有 Apache 和 MariaDB,那么就安装它们。WordPress 的安装不是必要的。
|
||||
|
||||
```
|
||||
dnf -y install httpd mariadb
|
||||
```
|
||||
|
||||
#### 新服务器防火墙配置
|
||||
|
||||
确认下新服务器上的防火墙允许访问 80 端口。你_每台_电脑上都有一个防火墙,对吗?大部分现代发行版使用的初始化配置包含的防火墙会阻止所有进来的网络流量,以此来提高安全等级。
|
||||
|
||||
下面片段的第一行内容可能已经在你的 IPTables 或其他基于防火墙的网络过滤器中存在了。它标识已经被识别为来自可接受来源的入站包,并绕过后面的其它 INPUT 过滤规则,这样可以节省时间和 CPU 周期。片段中最后一行标识并放行 80 端口新进来的请求到 HTTPD 的连接。
|
||||
|
||||
```
|
||||
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
|
||||
<删节>
|
||||
# HTTP
|
||||
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
|
||||
```
|
||||
|
||||
下面的示例 `/etc/sysconfig/iptables` 文件是 IPTables 最少规则的例子,可以允许 SSH(端口 22)和 HTTPD(端口 80)连接。
|
||||
|
||||
```
|
||||
*filter
|
||||
:INPUT ACCEPT [0:0]
|
||||
:FORWARD ACCEPT [0:0]
|
||||
:OUTPUT ACCEPT [0:0]
|
||||
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
|
||||
-A INPUT -p icmp -j ACCEPT
|
||||
-A INPUT -i lo -j ACCEPT
|
||||
# SSHD
|
||||
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
|
||||
# HTTP
|
||||
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
|
||||
|
||||
# Final disposition for unmatched packets
|
||||
-A INPUT -j REJECT --reject-with icmp-host-prohibited
|
||||
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
|
||||
COMMIT
|
||||
```
|
||||
|
||||
在新服务器主机上我需要做的就是在 `/etc/sysconfig/iptables` 文件的防火墙规则里添加上面片段的最后一行,然后重新加载修改后的规则集。
|
||||
|
||||
```
|
||||
iptables-restore /etc/sysconfig/iptables
|
||||
```
|
||||
|
||||
大部分基于红帽的发行版本,如 Fedora,使用的是 `firewalld`。我发现对于它的适用场景(如家用、小到中型企业)而言,它过于复杂,因此我不用它。我建议你参照 [firewalld 网页][9] 来向 `firewalld` 添加入站端口 80。
|
||||
|
||||
你的防火墙及其配置可能跟这个有些差异,但最终的目的是允许新 Web 服务器 80 端口接收 HTTPD 连接。
|
||||
|
||||
#### HTTPD 配置
|
||||
|
||||
在 `/etc/httpd/conf/httpd.conf` 文件中配置 HTTPD。像下面一样在 `Listen` 片段中设置 IP 地址。我的新 Web 服务器 IP 地址是 `192.168.0.125`。
|
||||
|
||||
```
|
||||
Listen 192.168.0.125:80
|
||||
```
|
||||
|
||||
复制(对应要迁移的网站的) `VirtualHost` 片段,粘贴到新服务器上 `httpd.conf` 文件的末尾。
|
||||
|
||||
### 迁移过程
|
||||
|
||||
只有两组数据需要迁移到新服务器 —— 数据库本身和网站目录结构。把两个目录打包成 `tar` 文档。
|
||||
|
||||
```
|
||||
cd /var ; tar -cvf /tmp/website.tar website1/
|
||||
cd /var/lib ; tar -cvf /tmp/database.tar mysql/
|
||||
```
|
||||
|
||||
把两个 tar 文件复制到新服务器。我通常会把这类文件放到 `/tmp` 下,这个目录就是用来做这种事的。在新服务器上运行下面的命令,把 tar 文档解压到正确的目录。
|
||||
|
||||
```
|
||||
cd /var ; tar -xvf /tmp/website.tar
|
||||
cd /var/lib ; tar -xvf /tmp/database.tar
|
||||
```
|
||||
|
||||
WordPress 的所有文件都在 `/var/website1` 下,因此不需要在新服务器上安装它。新服务器上不需要执行 WordPress 安装过程。
|
||||
|
||||
这个目录就是需要迁移到新服务器上的全部内容。
|
||||
|
||||
最后一步是启动(或重启)`mysqld` 和 `httpd` 服务守护进程。WrodPress 不是一个服务,因此不使用守护进程的方式来启动。
|
||||
|
||||
```
|
||||
systemctl start mysqld ; systemctl start httpd
|
||||
```
|
||||
|
||||
启动之后,你应该检查下这些服务的状态。
|
||||
|
||||
```
|
||||
systemctl status mysqld
|
||||
● mariadb.service - MariaDB 10.5 database server
|
||||
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
|
||||
Active: active (running) since Sat 2021-08-21 14:03:44 EDT; 4 days ago
|
||||
Docs: man:mariadbd(8)
|
||||
|
||||
https://mariadb.com/kb/en/library/systemd/
|
||||
Process: 251783 ExecStartPre=/usr/libexec/mariadb-check-socket (code=exited, status=0/SUCCESS)
|
||||
Process: 251805 ExecStartPre=/usr/libexec/mariadb-prepare-db-dir mariadb.service (code=exited, status=0/SUCCESS)
|
||||
Process: 251856 ExecStartPost=/usr/libexec/mariadb-check-upgrade (code=exited, status=0/SUCCESS)
|
||||
Main PID: 251841 (mariadbd)
|
||||
Status: "Taking your SQL requests now..."
|
||||
Tasks: 15 (limit: 19003)
|
||||
Memory: 131.8M
|
||||
CPU: 1min 31.793s
|
||||
CGroup: /system.slice/mariadb.service
|
||||
└─251841 /usr/libexec/mariadbd --basedir=/usr
|
||||
|
||||
Aug 21 14:03:43 simba.stmarks-ral.org systemd[1]: Starting MariaDB 10.5 database server...
|
||||
Aug 21 14:03:43 simba.stmarks-ral.org mariadb-prepare-db-dir[251805]: Database MariaDB is probably initialized in /var/lib/mysql already, n>
|
||||
Aug 21 14:03:43 simba.stmarks-ral.org mariadb-prepare-db-dir[251805]: If this is not the case, make sure the /var/lib/mysql is empty before>
|
||||
Aug 21 14:03:44 simba.stmarks-ral.org mariadbd[251841]: 2021-08-21 14:03:44 0 [Note] /usr/libexec/mariadbd (mysqld 10.5.11-MariaDB) startin>
|
||||
Aug 21 14:03:44 simba.stmarks-ral.org systemd[1]: Started MariaDB 10.5 database server.
|
||||
|
||||
systemctl status httpd
|
||||
● httpd.service - The Apache HTTP Server
|
||||
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
|
||||
Drop-In: /usr/lib/systemd/system/httpd.service.d
|
||||
└─php-fpm.conf
|
||||
Active: active (running) since Sat 2021-08-21 14:08:39 EDT; 4 days ago
|
||||
Docs: man:httpd.service(8)
|
||||
Main PID: 252458 (httpd)
|
||||
Status: "Total requests: 10340; Idle/Busy workers 100/0;Requests/sec: 0.0294; Bytes served/sec: 616 B/sec"
|
||||
Tasks: 278 (limit: 19003)
|
||||
Memory: 44.7M
|
||||
CPU: 2min 31.603s
|
||||
CGroup: /system.slice/httpd.service
|
||||
├─252458 /usr/sbin/httpd -DFOREGROUND
|
||||
├─252459 /usr/sbin/httpd -DFOREGROUND
|
||||
├─252460 /usr/sbin/httpd -DFOREGROUND
|
||||
├─252461 /usr/sbin/httpd -DFOREGROUND
|
||||
├─252462 /usr/sbin/httpd -DFOREGROUND
|
||||
└─252676 /usr/sbin/httpd -DFOREGROUND
|
||||
|
||||
Aug 21 14:08:39 simba.stmarks-ral.org systemd[1]: Starting The Apache HTTP Server...
|
||||
Aug 21 14:08:39 simba.stmarks-ral.org httpd[252458]: AH00112: Warning: DocumentRoot [/var/teststmarks-ral/html] does not exist
|
||||
Aug 21 14:08:39 simba.stmarks-ral.org httpd[252458]: Server configured, listening on: port 80
|
||||
Aug 21 14:08:39 simba.stmarks-ral.org systemd[1]: Started The Apache HTTP Server.
|
||||
```
|
||||
|
||||
### 最终的修改
|
||||
|
||||
现在所需的服务都已经运行了,你可以把 `/etc/sysconfig/iptables` 文件中 HTTDP 的防火墙规则改成下面的样子:
|
||||
|
||||
```
|
||||
-A PREROUTING -d 45.20.209.41/255.255.255.248 -p tcp -m tcp --dport 80 \
|
||||
-j DNAT --to-destination 192.168.0.125:80
|
||||
```
|
||||
|
||||
然后重新加载设置的 IPTables 规则。
|
||||
|
||||
```
|
||||
iptables-restore /etc/sysconfig/iptables
|
||||
```
|
||||
|
||||
由于防火墙规则是在防火墙主机上,因此不需要把外部 DNS 入口改成指向新服务器。如果你使用的是内部 DNS 服务器,那么你需要把 IP 地址改成内部 DNS 数据库里的 A 记录。如果你没有用内部 DNS 服务器,那么请确保主机 `/etc/hosts` 文件里新服务器地址设置得没有问题。
|
||||
|
||||
### 测试和清理
|
||||
|
||||
请确保对新配置进行测试。首先,停止旧服务器上的 `mysqld` 和 `httpd` 服务。然后通过浏览器访问网站。如果一切符合预期,那么你可以关掉旧服务器上的 `mysqld` 和 `httpd`。如果有失败,你可以把 IPTables 的路由规则改回去到旧服务器上,直到问题解决。
|
||||
|
||||
之后我把 MySQL 和 HTTPD 从旧服务器上删除了,这样来确保它们不会意外地被启动。
|
||||
|
||||
### 总结
|
||||
|
||||
就是这么简单。不需要执行数据库导出和导入的过程,因为 `mysql` 目录下所有需要的东西都已经复制过去了。需要执行导出/导入过程的场景是:有网站自己的数据库之外的数据库;MariaDB 实例上还有其他网站,而你不想把这些网站复制到新服务器上。
|
||||
|
||||
迁移旧服务器上的其他网站也很容易。其他网站依赖的所有数据库都已经随着 MariaDB 的迁移被转移到了新服务器上。你只需要把 `/var/website` 目录迁移到新服务器,添加合适的虚拟主机片段,然后重启 HTTPD。
|
||||
|
||||
我遵循这个过程把很多个网站从一个服务器迁移到另一个服务器,每次都没有问题。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/9/migrate-wordpress
|
||||
|
||||
作者:[David Both][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[lxbwolf](https://github.com/lxbwolf)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/dboth
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_blue_text_editor_web.png?itok=lcf-m6N7 "Text editor on a browser, in blue"
|
||||
[2]: https://wordpress.org/
|
||||
[3]: https://opensource.com/article/18/2/how-configure-apache-web-server
|
||||
[4]: https://mariadb.org/
|
||||
[5]: https://opensource.com/article/16/12/cidr-network-notation-configuration-linux
|
||||
[6]: https://en.wikipedia.org/wiki/Iptables
|
||||
[7]: http://www.website1.org
|
||||
[8]: mailto:me@website1.org
|
||||
[9]: https://firewalld.org/documentation/howto/open-a-port-or-service.html
|
99
published/202203/20210928 What is port forwarding.md
Normal file
99
published/202203/20210928 What is port forwarding.md
Normal file
@ -0,0 +1,99 @@
|
||||
[#]: subject: "What is port forwarding?"
|
||||
[#]: via: "https://opensource.com/article/21/9/what-port-forwarding"
|
||||
[#]: author: "Seth Kenlon https://opensource.com/users/seth"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "lkxed"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14415-1.html"
|
||||
|
||||
端口转发简介
|
||||
======
|
||||
|
||||
> 本文介绍了几种端口转发最常见的使用场景。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202203/31/085031ezq55gmy15n5mgll.jpg)
|
||||
|
||||
端口转发就是把网络流量从一个网络监听者(称为一个“端口”)发送到另一个上,无论这两个端口是否属于同一台电脑。在这里,端口不是某个物理实体,而是一个监听网络活动的软件程序。
|
||||
|
||||
当流量被定向发往到某个特定的端口,它会先到达一个路由器或是防火墙,亦或是其他的网络程序。它最终收到的响应可能会根据它想要通讯的端口来定义。比如,当你使用端口转发时,你可以捕获到发往 8080 端口的流量,然后把它转发到 80 端口。对于接收信号的原端口来说,这个新的目标端口可能和它在同一台设备上,也可能是在另一台设备上。我们在很多情况下都会用到端口转发,实现的方式也有很多。本文将介绍其中最常见的几种使用场景。
|
||||
|
||||
### 使用路由器来进行端口转发
|
||||
|
||||
如果你在把服务器架设在家里,那么你通常是不需要转发端口的。你的家庭路由器(通常是你从<ruby>网络服务提供商<rt>Internet Service Provider</rt></ruby>(ISP)获得的 WiFi 设备)有一个内置的防火墙,它的作用是阻止外面的世界访问到你的家庭网络。通过使用端口转发,你可以允许某个指定端口的流量穿过路由器的防火墙,并发送到局域网中的某个指定的 IP 地址。
|
||||
|
||||
比如说,你架设了一个 [Minetest 服务][2],并想要邀请你的朋友们来试试。为了让他们能够“穿过”你的路由器,从而到达这个 Minetest 服务,你必须把路由器上的某个端口转发到托管 Minetest 服务的电脑上。Minetest 服务默认运行在 30000 端口。你可以把路由器的 30000 端口转发到你的电脑的 30000 端口上,或者你也可以随便转发到一个更简单的端口上,这样玩家们会更容易记住它。我发现,当使用 30000 端口的时候,人们时常会少数几个 0(特别是没有逗号分隔符的帮助时),所以我一般使用路由器的 1234 端口,然后把它转发到我内部的 30000 端口。
|
||||
|
||||
每个制造商的路由器接口都不一样,但是不管你用的是什么牌子的路由器,方法都是相同的。首先,你需要登录到你的路由器。
|
||||
|
||||
通常,路由器的 IP 地址和登录信息都会打印在路由器上,或者在是它的文档里。我有一个型号为 TP-Link GX90 的路由器,我在浏览器里访问 10.0.1.1 就可以登录它,但你的路由器可能是 192.168.0.1 或者其他的地址。
|
||||
|
||||
我的 GX90 路由器把端口转发功能称为“<ruby>虚拟服务器<rt>virtual servers</rt></ruby>”,它是路由器的“NAT 转发”标签下的一个功能选项。NAT 的意思是 “<ruby>网络地址转换<rt>Network Address Translation</rt></ruby>”。在其他路由器中,这个功能可能直接就叫做“端口转发”,或者叫“防火墙”、“服务”等。找到正确的功能选项可能需要花费一些时间,因此,你可能需要花点时间研究下你的路由器文档。
|
||||
|
||||
当你找到了路由器的端口转发设置,添加一个新规则,命名一个外部端口(在我的例子中是 1234)和一个内部端口(30000)。把外部端口转发到内部端口上,而内部端口绑定在你想要大家访问的电脑的 IP 地址上。如果你需要一些查询本机 IP 地址的帮助,你可以阅读 Archit Modi 写的 《[在 Linux 上如何查询本地 IP 地址][3]》。
|
||||
|
||||
![A sample port forwarding rule][4]
|
||||
|
||||
*一个简单端口转发规则*
|
||||
|
||||
(图片提供者是 Seth Kenlon,遵循 [署名-相同方式共享 4.0 国际][5] 协议)
|
||||
|
||||
在这个例子中,访问家庭网络的 1234 端口的流量,都会被转发到了我的家庭服务器的 30000 端口上,后者的 IP 地址是 10.0.1.2。
|
||||
|
||||
在继续之前,先保存这个规则。
|
||||
|
||||
接下来,你需要知道你的家庭网络的公网 IP 地址是多少。你可以从 [ifconfig.me][6] 或者 [icanhazip.com][7] 上获得这个地址。你可以在浏览器中打开这两个网站的其中一个,也可以使用 [curl][8] 命令来获取到这个 IP。
|
||||
|
||||
```
|
||||
$ curl ifconfig.me
|
||||
93.184.216.34
|
||||
```
|
||||
|
||||
现在,你的朋友们就可以在 Minetest 客户端里输入 `169.169.23.49:1234`,加入你的 Minetest 服务器啦。
|
||||
|
||||
### 使用防火墙来进行端口转发
|
||||
|
||||
系统管理员有时候需要转发访问服务器的流量。比如说,你可能想要接收来自 80 端口的流量,但是用户的服务却运行在 8065 端口。如果不进行端口转发的话,你的用户就不得不在输入浏览器的 URL 末尾,加上一个指定的端口号,例如 `example.com:8065`。大多数用户都不习惯于考虑端口的问题,所以你需要把访问网络通用的 80 端口的请求拦截下来,然后转发到你的网络应用的具体端口,这会给用户带来巨大的方便。
|
||||
|
||||
你可以在服务器上使用 [firewall-cmd][9] 来转发流量,它是访问 `firewalld` 后台进程的<ruby>前端<rt>front-end</rt></ruby>命令。
|
||||
|
||||
首先,设置好你想要转发的端口和协议:
|
||||
|
||||
```
|
||||
$ sudo firewall-cmd \
|
||||
--add-forward-port \
|
||||
port=80:proto=tcp:toport=8065
|
||||
```
|
||||
|
||||
为使修改永久生效,你需要加上 `--runtime-to-permanent` 选项:
|
||||
|
||||
```
|
||||
$ sudo firewall-cmd --runtime-to-permanent
|
||||
```
|
||||
|
||||
### 网络转发
|
||||
|
||||
在网络传输中,除了端口转发外,还有其他种类的<ruby>转发<rt>forwarding</rt></ruby>形式,例如 IP 转发和代理等。当你熟悉了网络信息在路由时是怎么被处理的之后,你可以试试不同的转发形式(然后使用 `tcpdump` 或类似的工具)来看看哪一种最好、最符合你的需求。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/9/what-port-forwarding
|
||||
|
||||
作者:[Seth Kenlon][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/seth
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/connections_wires_sysadmin_cable.png?itok=d5WqHmnJ (Multi-colored and directional network computer cables)
|
||||
[2]: https://opensource.com/alternatives/minecraft#minetest
|
||||
[3]: https://opensource.com/article/18/5/how-find-ip-address-linux
|
||||
[4]: https://opensource.com/sites/default/files/uploads/router-port-forward.jpg (A sample port forwarding rule)
|
||||
[5]: https://creativecommons.org/licenses/by-sa/4.0/
|
||||
[6]: http://ifconfig.me
|
||||
[7]: http://icanhazip.com
|
||||
[8]: https://opensource.com/article/20/5/curl-cheat-sheet
|
||||
[9]: https://www.redhat.com/sysadmin/secure-linux-network-firewall-cmd
|
@ -0,0 +1,146 @@
|
||||
[#]: subject: "What you need to know about fuzz testing and Go"
|
||||
[#]: via: "https://opensource.com/article/22/1/native-go-fuzz-testing"
|
||||
[#]: author: "Gaurav Kamathe https://opensource.com/users/gkamathe"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "lxbwolf"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14367-1.html"
|
||||
|
||||
你需要了解的 Go 中的模糊测试
|
||||
======
|
||||
|
||||
> Go 团队接受了新增对模糊测试的支持的提议。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202203/18/103123drbhbozibvt0vtib.jpg)
|
||||
|
||||
[Go][2] 的应用越来越广泛。现在它是云原生软件、容器软件、命令行工具和数据库等等的首选语言。Go 很早之前就已经有了内建的 [对测试的支持][3]。这使得写测试代码和运行都相当简单。
|
||||
|
||||
### 什么是模糊测试?
|
||||
|
||||
<ruby>模糊测试<rt>fuzz testing</rt></ruby>(fuzzing)是指向你的软件输入非预期的数据。理想情况下,这种测试会让你的应用程序崩溃或有非预期的表现。抛开最终的结果,从程序对非预期的输入数据的处理结果中你可以得到很多信息,这样你就可以增加一些合适的错误处理。
|
||||
|
||||
任何一个软件都有对不同来源的输入或数据的接收说明,软件会对这些数据进行处理并返回适当的结果。软件开发后,测试工程师团队对其进行测试,找出软件中的错误,给出测试报告,并(由开发者)修复。通常测试的目的是验证软件的行为是否符合预期。测试又可以细分为不同的类型,如功能测试、集成测试、性能测试等等。每种测试方法关注软件功能的某一个方面,以便发现错误或者提升可靠性或性能。
|
||||
|
||||
模糊测试在这一测试过程上更进一步,尝试向软件程序输入一些“无效”或“随机”的数据。这种输入是故意的,期望得到的结果就是程序崩溃或输出异常,这样就可以暴露程序中的错误以便由开发者来修复它们。与其他测试类似,很少需要手动进行模糊测试,业界有大量的模糊测试工具可以将这个过程自动化。
|
||||
|
||||
### Go 中的软件测试
|
||||
|
||||
举个例子,假如你想测试 `add.go` 中的 `Add()` 函数,你可以在 `add_test.go` 中导入 `testing` 包并把测试体写在以 `TestXXX()` 开头的函数内。
|
||||
|
||||
考虑如下代码:
|
||||
|
||||
```
|
||||
func Add(num1, num2 int) int {
|
||||
}
|
||||
```
|
||||
|
||||
在 `add_test.go` 文件中,你可能有如下测试代码:
|
||||
|
||||
```
|
||||
import "testing"
|
||||
|
||||
func TestAdd(t *testing.T) {
|
||||
}
|
||||
```
|
||||
|
||||
运行测试:
|
||||
|
||||
```
|
||||
$ go test
|
||||
```
|
||||
|
||||
### 新增对模糊测试的支持
|
||||
|
||||
Go 团队已经接受了 [新增对模糊测试的支持的提议][4],以进一步推动这项工作。这涉及到新增一个 `testing.F` 类型,在 `_test.go` 文件中新增 `FuzzXXX()` 函数,在 Go 工具中会新增一个 `-fuzz` 选项来执行这些测试。
|
||||
|
||||
在 `add_test.go` 文件中:
|
||||
|
||||
```
|
||||
func FuzzAdd(f *testing.F) {
|
||||
}
|
||||
```
|
||||
|
||||
执行以下代码:
|
||||
|
||||
```
|
||||
$ go test -fuzz
|
||||
```
|
||||
|
||||
在本文编写时,这个 [功能还是试验性的][5],但是应该会在 1.18 发布版本中包含。(LCTT 译注:[Go 1.18][14] 刚刚发布,已经包含了对模糊测试的支持)目前很多功能如 `-keepfuzzing`、`-race` 等也还没有支持。Go 团队最近发布了一篇 [模糊测试教程][6],值得读一下。
|
||||
|
||||
### 安装 gotip 来获取最新的功能
|
||||
|
||||
如果你极度渴望在正式发布之前尝试这些功能,你可以使用 `gotip` 来测试即将正式发布的 Go 功能并反馈给他们。你可以使用下面的命令来安装 `gotip`。安装之后,你可以用 `gotip` 程序代替以前的 `go` 程序来编译和运行程序。
|
||||
|
||||
```
|
||||
$ go install golang.org/dl/gotip@latest
|
||||
$ gotip download
|
||||
|
||||
$ gotip version
|
||||
go version devel go1.18-f009910 Thu Jan 6 16:22:21 2022 +0000 linux/amd64
|
||||
```
|
||||
|
||||
### 社区对于模糊测试的观点
|
||||
|
||||
软件社区中经常会讨论模糊测试,不同的人对模糊测试有不同的看法。有些人认为这是一种有用的技术,可以找到错误,尤其是在安全方面。然而考虑到模糊测试所需要的资源(CPU、内存),有人就认为这是一种浪费,而他们更愿意用其他的测试方法。即使在 Go 团队内部,意见也不统一。我们可以看到 Go 的联合创始人 Rob Pike 对模糊测试的使用和在 Go 中的实现是持轻微的怀疑态度的。
|
||||
|
||||
> ..._虽然模糊测试有助于发现某类错误,但是它会占用大量的 CPU 和存储资源,并且效益成本比率也不明确。我担心为了写模糊测试浪费精力,或者 git 仓库中充斥大量无用的测试数据_
|
||||
>
|
||||
> ~[Rob Pike][7]
|
||||
|
||||
然而,Go 安全团队的另一个成员,Filo Sottile,似乎对 Go 新增支持模糊测试很乐观,举了很多例子来支持,也希望模糊测试能成为开发过程中的一部分。
|
||||
|
||||
> _我想说模糊测试可以发现极端情况下的错误。这是我们作为安全团队对其感兴趣的原因:在极端情况下发现的错误可以避免在生产环境中成为弱点。_
|
||||
>
|
||||
> _我们希望模糊测试能成为开发的一部分 —— 不只是构建或安全方面 —— 而是整个开发过程:它能提升相关代码的质量..._
|
||||
>
|
||||
> ~[Filo Sottile][8]
|
||||
|
||||
### 现实中的模糊测试
|
||||
|
||||
对我而言,模糊测试在发现错误以及让系统变得更安全和更有弹性方面似乎非常有效。举个例子,Linux 内核也会使用名为 [syzkaller][9] 的工具进行模糊测试,这个工具已经发现了 [大量][10] 错误。
|
||||
|
||||
[AFL][11] 也是比较流行的模糊测试工具,用来测试 C/C++ 写的程序。
|
||||
|
||||
之前也有对 Go 程序进行模糊测试的观点,其中之一就是 Filo 在 GitHub 评论中提到的 [go-fuzz][12]。
|
||||
|
||||
> _go-fuzz 的记录提供了相当惊人的证据,证明模糊处理能很好地找到人类没有发现的错误。根据我的经验,我们只需要消耗一点点 CPU 的时间就可以得到极端情况下非常高效的测试结果。_
|
||||
|
||||
### 为什么在 Go 中新增对模糊测试的原生支持
|
||||
|
||||
如果我们的需求是对 Go 程序进行模糊测试,之前的工具像 `go-fuzz` 就可以完成,那么为什么要在这种语言中增加原生支持呢?[Go 模糊测试设计草案][13] 中说明了这样做的一些根本原因。设计的思路是让开发过程更简单,因为前面说的工具增加了开发者的工作量,还有功能缺失。如果你没有接触过模糊测试,那么我建议你读一下设计草案文档。
|
||||
|
||||
> 开发者可以使用诸如 `go-fuzz` 或 `fzgo`(基于 `go-fuzz`)来解决某些需求。然而,已有的每种解决方案都需要在典型的 Go 测试上做更多的事,而且还缺少关键的功能。相比于其他的 Go 测试(如基准测试和单元测试),模糊测试不应该比它们复杂,功能也不应该比它们少。已有的解决方案增加了额外的开销,比如自定义命令行工具。
|
||||
|
||||
### 模糊测试工具
|
||||
|
||||
在大家期望 Go 语言新增功能的列表中,模糊测试是其中很受欢迎的一项。虽然现在还是试验性的,但在将要到来的发布版本中会变得更强大。这给了我们足够的时间去尝试它以及探索它的使用场景。我们不应该把它视为一种开销,如果使用得当它会是一种发现错误非常高效的测试工具。使用 Go 的团队应该推动它的使用,开发者可以写简单的模糊测试,测试团队去慢慢扩展以此来使用它全部的能力。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/22/1/native-go-fuzz-testing
|
||||
|
||||
作者:[Gaurav Kamathe][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[lxbwolf](https://github.com/lxbwolf)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/gkamathe
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/laptop_screen_desk_work_chat_text.png?itok=UXqIDRDD "Person using a laptop"
|
||||
[2]: https://go.dev/
|
||||
[3]: https://pkg.go.dev/testing
|
||||
[4]: https://github.com/golang/go/issues/44551
|
||||
[5]: https://go.dev/blog/fuzz-beta
|
||||
[6]: https://go.dev/doc/tutorial/fuzz
|
||||
[7]: https://github.com/golang/go/issues/44551#issuecomment-784584785
|
||||
[8]: https://github.com/golang/go/issues/44551#issuecomment-784655571
|
||||
[9]: https://github.com/google/syzkaller
|
||||
[10]: https://github.com/google/syzkaller/blob/master/docs/linux/found_bugs.md
|
||||
[11]: https://github.com/google/AFL
|
||||
[12]: https://github.com/dvyukov/go-fuzz
|
||||
[13]: https://go.googlesource.com/proposal/+/master/design/draft-fuzzing.md
|
||||
[14]: https://go.dev/blog/go1.18
|
@ -0,0 +1,171 @@
|
||||
[#]: subject: "Creating and initializing lists in Java and Groovy"
|
||||
[#]: via: "https://opensource.com/article/22/1/creating-lists-groovy-java"
|
||||
[#]: author: "Chris Hermansen https://opensource.com/users/clhermansen"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "lkxed"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14411-1.html"
|
||||
|
||||
在 Java 和 Groovy 中创建和初始化列表的不同
|
||||
======
|
||||
|
||||
> 首先在 Java 中创建初始化一个整数列表,然后在 Groovy 中做同样的事。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202203/29/214023b4r9rauua1gjp59l.jpg)
|
||||
|
||||
我非常喜欢 [Groovy 编程语言][2]。我喜欢它是因为我喜欢 Java,尽管 Java 有时候感觉很笨拙。正因为我是那么喜欢 Java,其他运行在 JVM 上语言都不能吸引我。比方说 Kotlin、Scala 还有 Clojure 语言,它们感觉上就和 Java 不一样,因为它们对于什么是好的编程语言的理解不同。Groovy 和它们都不一样,在我看来,Groovy 是一个完美的选项,特别是对于一部分程序员来说,他们喜欢 Java,但是又需要一个更灵活、更紧凑,并且有时候更直接的语言。
|
||||
|
||||
<ruby>列表<rt>List</rt></ruby> 这种数据结构是一个很好的例子,它可以容纳一个无序的列表,列表中的元素可以是数字、字符串或者对象,程序员可以用某种方式高效地遍历这些元素,特别是对于编写和维护脚本的人来说,“高效”的关键就是要有简洁清晰的表达,而不需要一大堆“仪式”,把代码的意图都变模糊了。
|
||||
|
||||
### 安装 Java 和 Groovy
|
||||
|
||||
Groovy 是基于 Java 的,因此需要同时安装一个 Java 才行。你的 Linux 发行版的仓库中可能有最近的比较好的 Java 版本。或者,你也可以在根据 [这些指导][3] 来安装 Groovy。对于 Linux 用户来说,SDKMan 是一个不错的代替选项,你可以使用它来获取多个 Java 和 Groovy 版本,以及许多其他的相关工具。在这篇文章中,我使用的 SDK 发行版是:
|
||||
|
||||
* Java: OpenJDK 11 的 11.0.12-open 版本
|
||||
* Groovy: 3.0.8 版本
|
||||
|
||||
### 言归正传
|
||||
|
||||
Java 中有很多方法可以实例化并初始化列表,从它最初被引入的时候就有了(我记得是在 Java 1.5 的时候,但请不要引用我的话)。在这些方法里,有两个有趣的方法,它们涉及到了 `java.util.Arrays` 和 `java.util.List` 这两个类。
|
||||
|
||||
#### 使用 java.util.Arrays 类
|
||||
|
||||
`java.util.Arrays` 类定义了一个 `asList()` 静态方法,它可以被用来创建一个基于数组的列表,因此大小是不可变的,尽管其中的元素是可以被修改的。下面是它的使用方式:
|
||||
|
||||
|
||||
```
|
||||
var a1 = Arrays.asList(1,2,3,4,5,6,7,8,9,10); // immutable list of mutable elements
|
||||
|
||||
System.out.println("a1 = " + a1);
|
||||
System.out.println("a1 is an instance of " + a1.getClass());
|
||||
|
||||
// output is
|
||||
// a1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
||||
// a1 is an instance of class java.util.Arrays$ArrayList
|
||||
|
||||
a1.set(0,0); // succeeds
|
||||
System.out.println("a1 = " + a1); // output is
|
||||
// a1 = [0, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
||||
|
||||
a1.add(11); // fails producing
|
||||
// Exception in thread "main" java.lang.UnsupportedOperationException
|
||||
System.out.println("a1 = " + a1); // not reached
|
||||
```
|
||||
|
||||
#### 使用 java.util.List 类
|
||||
|
||||
`java.util.List` 类定义了一个 `of()` 静态方法,它可以被用来创建一个不可变的列表,其中的元素是否可变要取决于它们本身是否支持修改。下面是它的使用方式:
|
||||
|
||||
```
|
||||
var a2 = List.of(1,2,3,4,5,6,7,8,9,10);
|
||||
|
||||
System.out.println("a2 = " + a2);
|
||||
System.out.println("a2 is an instance of " + a2.getClass());
|
||||
|
||||
// output is
|
||||
// a2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
||||
// a2 is an instance of class java.util.ImmutableCollections$ListN
|
||||
|
||||
a2.set(0,0); // fails producing
|
||||
// Exception in thread "main" java.lang.UnsupportedOperationException
|
||||
System.out.println("a2 = " + a2); // not reached
|
||||
|
||||
a2.add(11); // also fails for same reason if above two lines commented out
|
||||
System.out.println("a2 = " + a2); // not reached
|
||||
```
|
||||
|
||||
因此,我可以使用 `Arrays.asList()`,也可以使用 `List.of()` 方法,前提是如果我想要的是一个大小不能改变、且不关心元素是否可变的列表。
|
||||
|
||||
如果我想要初始化一个可变的列表,我更倾向于把这些不可变的列表作为参数传给一个列表构造器,就像下面这样:
|
||||
|
||||
|
||||
```
|
||||
var a1 = new ArrayList<Integer>(Arrays.asList(1,2,3,4,5,6,7,8,9,10));
|
||||
|
||||
System.out.println("a1 = " + a1);
|
||||
System.out.println("a1 is an instance of " + a1.getClass());
|
||||
|
||||
// output is
|
||||
// a1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
||||
// a1 is an instance of class java.util.ArrayList
|
||||
|
||||
a1.set(0,0);
|
||||
System.out.println("a1 = " + a1);
|
||||
|
||||
//output is
|
||||
// a1 = [0, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
||||
|
||||
a1.add(11);
|
||||
System.out.println("a1 = " + a1);
|
||||
|
||||
// output is
|
||||
// a1 = [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
|
||||
```
|
||||
|
||||
注意,这个 `Arrays.asList()` 方法是用来初始化这个新的 `ArrayList<Integer>()` 的,也就是说,它为这个传进来的列表创建了一个可变的拷贝。
|
||||
|
||||
现在,或许只有我这么想,但是这种方式确实看起来需要理解很多关于 `java.util.Arrays` 和 `java.util.List` 类的细节才行,而我只是想要创建并初始化一个数字列表而已(尽管真正使用到的语句并没有太多“仪式”)。下面是真正用到的那行代码,仅供参考:
|
||||
|
||||
```
|
||||
var a1 = new ArrayList<Integer>(Arrays.asList(1,2,3,4,5,6,7,8,9,10));
|
||||
```
|
||||
|
||||
### Groovy 是怎么做的
|
||||
|
||||
下面来看看在 Groovy 中如何实现上述需求:
|
||||
|
||||
```
|
||||
def a1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
||||
|
||||
println "a1 = $a1"
|
||||
println "a1 is an instance of ${a1.getClass()}"
|
||||
|
||||
// output is
|
||||
// a1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
||||
// a1 is an instance of class java.util.ArrayList
|
||||
|
||||
a1[0] = 0
|
||||
println "a1 = $a1"
|
||||
|
||||
// output is
|
||||
// a1 = [0, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
||||
|
||||
a1 << 11
|
||||
println "a1 = $a1"
|
||||
|
||||
// output is
|
||||
// a1 = [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
|
||||
```
|
||||
|
||||
我们一眼就能发现,Groovy 使用了 `def` 关键字而不是 `var` 关键字。我还发现了,仅仅是把一系列的类型(在这个例子里是整数)放进括号里,我就得到了一个创建好的列表。此外,这样创建出来的列表完全就是我想要的:一个可变的 `ArrayList` 实例。
|
||||
|
||||
现在,或许再一次只有我这么想,但是上面的代码看起来要简单多得多 —— 不用记住 `.of()` 和 `.asList()` 返回的是“<ruby>半不变<rt>semi-mutable</rt></ruby>”的结果,也不用为它们做一些补偿。另外一个好处是,我现在可以使用括号和下标来引用列表中的某个特定元素,而不用这个叫 `set()` 方法。另外,这个跟在列表后面的 `<<` 操作符也很方便,我再也不用调用 `add()` 方法来添加元素啦。还有,你注意到代码中没有分号了吗?没错,在 Groovy 里,句末的分号并不是必须的。最后,我们来看看字符串插值,只要在字符串里用 `$变量` 或者 `${表达式}` 就可以实现了哦!
|
||||
|
||||
在 Groovy 世界中还藏着许多“有待发掘”的东西。上面的列表定义其实是一个动态类型(Groovy 中默认)和 Java 中的静态类型的对比。在上面的 Groovy 代码定义的那一行,变量 `a1` 的类型是在运行的时候,根据等号右边的表达式的计算结果推断出来的。现在我们都知道,动态语言可以给我们带来强大的功能,有了强大的功能,我们有了很多机会去尝试不同的东西。对于那些不喜欢动态类型的程序员来说,Groovy 也支持静态类型。
|
||||
|
||||
### Groovy 相关资源
|
||||
|
||||
Apache Groovy 网站上有非常多的文档。另一个很棒的 Groovy 资源是 [Mr. Haki][7]。学习 Groovy 还有一个很棒的原因,那就是可以接着学习 [Grails][8],后者是一个优秀的、高效率的全栈 Web 框架,基于许多优秀组件构建而成,比如有 Hibernate、Spring Boot 和 Micronaut 等。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/22/1/creating-lists-groovy-java
|
||||
|
||||
作者:[Chris Hermansen][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/clhermansen
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/code_development_programming.png?itok=M_QDcgz5 (Developing code.)
|
||||
[2]: http://www.groovy-lang.org/
|
||||
[3]: http://www.groovy-lang.org/install.html
|
||||
[4]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+arrays
|
||||
[5]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+system
|
||||
[6]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+list
|
||||
[7]: https://www.mrhaki.com/
|
||||
[8]: https://grails.org/
|
151
published/202203/20220221 6 Reasons to Try Nitrux OS.md
Normal file
151
published/202203/20220221 6 Reasons to Try Nitrux OS.md
Normal file
@ -0,0 +1,151 @@
|
||||
[#]: subject: "6 Reasons to Try Nitrux OS"
|
||||
[#]: via: "https://news.itsfoss.com/reasons-to-try-nitrux-os/"
|
||||
[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "aREversez"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14359-1.html"
|
||||
|
||||
尝试 Nitrux 系统的六大理由
|
||||
======
|
||||
|
||||
> Nitrux OS 是一个基于 Debian 的有趣的 Linux 发行版。还没有试过吗?我认为你应该试试。
|
||||
|
||||
![](https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2022/02/nitrux-os-try.jpg?w=1200&ssl=1)
|
||||
|
||||
Nitrux 系统也许算不上 Linux 的主流发行版本之一,但它绝对是一款极其独特的产品。
|
||||
|
||||
2019 年,我们 [采访了 Nitrux 的创始人 Uri Herrera][1],了解到 Herrera 等人开发这款系统的初衷:超越传统的 Linux 发行版。
|
||||
|
||||
自那之后,过了许久,我们终于迎来了 [Nitrux 2.0 版本][2]。
|
||||
|
||||
不要忘了,Nitrux 在去年 [放弃基于 Ubuntu,而选择了 Debian][3]。
|
||||
|
||||
考虑到自 Nitrux 发行以来的数年间,也发生了许多变化,你应该尝试一下这款系统。
|
||||
|
||||
这里,我要分享一些体验 [Nitrux 系统][4] 的理由:
|
||||
|
||||
### 1、Nitrux 不再基于 Ubuntu
|
||||
|
||||
![][5]
|
||||
|
||||
人们一般都会推荐基于 Ubuntu 的 Linux 发行版本,来满足日常所需。
|
||||
|
||||
当然,在我们 [为新手推荐的 Linux 系统][6] 中,也主要是许多基于 Ubuntu 的版本,但是请不要误会。
|
||||
|
||||
我们之所以推荐基于 Ubuntu 的发行版本,唯一的理由在于它们简单易用,支持大量的商业软件。
|
||||
|
||||
所以,如果你不是刚开始使用 Linux 系统,同时也想尝试既能让你耳目一新,又不至于使你感到陌生,而且十分稳定的发行版,基于 Debian 的 Nirtux 是一个不错的选择。
|
||||
|
||||
你完全不需要在短期内迅速了解这款系统,就可以得心应手地使用终端来完成各项工作。
|
||||
|
||||
感兴趣的话,可以参考我们的文章 [Debian vs Ubuntu][7],了解更多。
|
||||
|
||||
### 2、专注 AppImage
|
||||
|
||||
![][5a]
|
||||
|
||||
[AppImage][8] 是一个通用的打包系统,这种软件包不需要任何依赖。你不需要在 Linux 上安装任何软件包管理器或者依赖包,就可以直接运行 AppImage 应用。
|
||||
|
||||
AppImage 旨在打造便携、高效的软件包系统,省去安装的步骤,与 Windows 系统的便携版软件非常相似。
|
||||
|
||||
Nitrux 操作系统专注 AppImage 应用软件,为你带来流畅的用户体验。
|
||||
|
||||
NX 软件中心是一个 GUI 程序,用户可以通过使用 Mauikit(该软件中心的 UI 框架),安装、管理 AppImage 应用程序。
|
||||
|
||||
### 3、基于 KDE 桌面环境的发行版
|
||||
|
||||
![][5b]
|
||||
|
||||
Nitrux 操作系统是 [搭载 KDE 桌面环境中最好的 Linux 发行版][9] 之一。 如果你不喜欢 GNOME 或者其他开箱即用的桌面环境(DE),KDE 会是一个不错的选择。
|
||||
|
||||
也许你还不知道, 相较于其他桌面环境,[KDE 可以在很多方面进行定制][10]。
|
||||
|
||||
因此,在 KDE 桌面环境下,你可以毫不费力地打造自己的个性化桌面。
|
||||
|
||||
### 4、独特的用户体验
|
||||
|
||||
![][11]
|
||||
|
||||
Nitrux 的用户体验结合了最好的 KDE 桌面环境与 Qt 技术,并对这些进行了调整,为你带来全新的用户体验。
|
||||
|
||||
虽然在使用 Nitrux 操作系统时,你不会觉得十分陌生,但是还是会感到有些许的不同。
|
||||
|
||||
即使你没有对 Nitrux 系统做任何自定义的设置,开箱即用的体验也足以让它成为 [最优雅的发行版][12] 之一。
|
||||
|
||||
### 5、Maui Shell
|
||||
|
||||
![][11a]
|
||||
|
||||
[Maui Shell][13] 是 Nitrux 用户体验的亮点之一。近来,Maui Shell 得到了进一步的完善,将这些呈现在了桌面端和移动端的融合界面上。
|
||||
|
||||
尽管 Maui Shell 目前还不成熟,但是外观看起来十分大气简约,就像 [System76 将要推出基于 Rust 的桌面环境][14] 一样令人兴奋。
|
||||
|
||||
这也是我们推荐尝试 Nitrux 操作系统最重要的原因之一。时间会证明,Nitrux 系统是否将会开启桌面体验的全新时代。
|
||||
|
||||
### 6、Xanmod 内核
|
||||
|
||||
![][5c]
|
||||
|
||||
[Xanmod 内核][15] 是一个定制的主线 Linux 内核版本,对性能进行了适当的调整,附加了一些其他功能。有了它,你的桌面体验一定能得到大幅提升。
|
||||
|
||||
自 2.0 版本起,Nitrux 操作系统选用 Xanmod 作为默认内核,为用户提供“升级版”的桌面体验。
|
||||
|
||||
当然你也可以选择其他 Linux 内核,比如 Liquorix 和 Libre,各擅胜场。
|
||||
|
||||
如果你不喜欢 Xanmod,也可以选择长期支持版的主线内核。在 Nitrux 操作系统上,你完全可以无缝切换使用不同的内核。
|
||||
|
||||
- [Nitrux OS][4]
|
||||
|
||||
### 总结
|
||||
|
||||
诚然,从主流发行版转到像 Nitrux 这样的操作系统,需要考虑各种风险。
|
||||
|
||||
但是,**我建议你好好考虑一番:**
|
||||
|
||||
Nitrux 这样的发行版热衷于按照他们的愿景来改进事情。
|
||||
|
||||
尽管背后没有强大的企业和财力支撑,他们依然可以开发出这款令人惊艳的发行版、开发出 [Maui 项目][16],以及别开生面的 Maui shell。
|
||||
|
||||
所以,我认为,我们也应该以己所能,尽己之力,支持这些优秀的发行版。
|
||||
|
||||
不过话说回来,每一款 Linux 发行版都会或多或少地存在一些问题。当你试用一款新的发行版时,你需要给它点儿时间,在最终将它作为日常使用的操作系统之前,慢慢地去适应它。
|
||||
|
||||
换言之,我推荐你在业余时间试用 Nitrux 操作系统,或者直接装个虚拟机来一探究竟。
|
||||
|
||||
我很关注大家对这篇文章的看法,请在下方评论留言。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://news.itsfoss.com/reasons-to-try-nitrux-os/
|
||||
|
||||
作者:[Ankush Das][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[aREversez](https://github.com/aREversez)
|
||||
校对:[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/lujun9972
|
||||
[1]: https://itsfoss.com/nitrux-linux/
|
||||
[2]: https://news.itsfoss.com/nitrux-2-0-release/
|
||||
[3]: https://news.itsfoss.com/nitrux-linux-debian/
|
||||
[4]: https://nxos.org/
|
||||
[5]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2022/02/not-ubuntu-illustration.png?w=1000&ssl=1
|
||||
[6]: https://itsfoss.com/best-linux-beginners/
|
||||
[7]: https://linux.cn/article-13746-1.html
|
||||
[5a]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2022/02/appimage-illustration.png?w=1000&ssl=1
|
||||
[8]: https://itsfoss.com/use-appimage-linux/
|
||||
[5b]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2022/02/kde-illustration.png?w=1000&ssl=1
|
||||
[9]: https://itsfoss.com/best-kde-distributions/
|
||||
[10]: https://itsfoss.com/kde-customization/
|
||||
[11]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2022/01/nitrux-2-visual.png?resize=1568%2C882&ssl=1
|
||||
[12]: https://itsfoss.com/beautiful-linux-distributions/
|
||||
[11a]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/12/maui-shell.png?w=1200&ssl=1
|
||||
[13]: https://news.itsfoss.com/maui-shell-unveiled/
|
||||
[14]: https://news.itsfoss.com/system76-cosmic-panel/
|
||||
[5c]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2022/02/xanmod-kernel-illustration.png?w=1000&ssl=1
|
||||
[15]: https://xanmod.org/
|
||||
[16]: https://mauikit.org
|
@ -0,0 +1,90 @@
|
||||
[#]: subject: "Scan documents and old photos on Linux with Skanlite"
|
||||
[#]: via: "https://opensource.com/article/22/2/scan-documents-skanlite-linux-kde"
|
||||
[#]: author: "Seth Kenlon https://opensource.com/users/seth"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14402-1.html"
|
||||
|
||||
用 Skanlite 在 Linux 上扫描文件和老照片
|
||||
======
|
||||
|
||||
> 使用这个 Linux KDE 应用,将你的档案数字化。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202203/27/114937eannabb3zn45lraa.jpg)
|
||||
|
||||
虽然现在的世界已经大部分实现了数字化,但仍有一些时候,你还是需要打印一份表格,签字,然后把它扫描回来。有时候,我发现在手机上拍个快照就够了,但有些行业需要比草率的快照更好的复印件,因此平板扫描仪是必要的。KDE 项目提供了一个叫做 Skanlite 的应用程序,它可以帮助你导入在平板上扫描的文件,甚至是用联机相机扫描的文件。
|
||||
|
||||
### 在 Linux 上安装 Skanlite
|
||||
|
||||
你可以从你的软件库中安装 Skanlite。在 Fedora、Mageia 和类似的地方:
|
||||
|
||||
```
|
||||
$ sudo dnf install skanlite
|
||||
```
|
||||
|
||||
在 Elementary、Linux Mint 和其他基于 Debian 的发行版上:
|
||||
|
||||
```
|
||||
$ sudo apt install skanlite
|
||||
```
|
||||
|
||||
### 扫描仪驱动
|
||||
|
||||
市场上的大多数扫描仪都与 SANE 扫描仪 API 兼容。SANE 并不是一个真正的驱动,而是一个协议,可以接收来自图像采集设备的输入,并为希望围绕它建立一个应用的程序员提供选项。Skanlite 就是这样一个应用。
|
||||
|
||||
我还没有遇到过不与 SANE 接口兼容的扫描仪,但可能也有不与 SANE 接口兼容的扫描仪。在这些情况下,请在制造商的网站上寻找 SANE 或 TWAIN 的驱动,或者寻找它们专有的驱动和扫描仪接口。后者可能无法使用 Skanlite,但当你不确定你的扫描仪是否通过标准协议进行通信时,Skanlite 总是值得试试。我甚至遇到过打印机和扫描仪的二合一设备,尽管打印机需要一个额外的驱动,但扫描仪却能立即被识别。
|
||||
|
||||
### 使用 Skanlite
|
||||
|
||||
当你启动 Skanlite 时,它首先会在你的系统中搜索图像采集设备。在笔记本电脑上,Skanlite 通常会发现网络摄像头是一个有效的输入源(因为它是),但它也会找到连接到你机器上的平板扫描仪。选择你要使用的扫描仪,然后继续。
|
||||
|
||||
要看扫描的内容,点击应用程序右下角的“<ruby>预览<rt>Preview</rt></ruby>”按钮。
|
||||
|
||||
![Skanlite with custom artwork][2]
|
||||
|
||||
这将在右面板上显示一个预览图像。没有任何东西被保存到你的硬盘上,这只是显示你的扫描仪上目前有什么。
|
||||
|
||||
### 选择一个扫描区域
|
||||
|
||||
如果你只需要扫描仪上的一部分内容,你可以选择一个你想保存的区域。要选择一个单一的区域,在你想保存的区域上点击并拖动你的鼠标。当有一个有效的选择时,当你点击“<ruby>扫描<rt>Scan</rt></ruby>”按钮时,只有你选择的那部分会被保存。
|
||||
|
||||
你可以有一个以上的选区,当你需要扫描几个小图像或只扫描一个大文件的特定部分时,这特别有效。要添加一个选区,请点击出现在选区中心的 “+” 图标。
|
||||
|
||||
![Adding selections][3]
|
||||
|
||||
你可以通过点击 “-” 图标来删除选区,当你有多个活动选区时,该图标会出现。
|
||||
|
||||
### 扫描设置
|
||||
|
||||
图像采集设置位于左边的面板上。这些控件允许你导入彩色或灰度的图像,并对图像的亮度和对比度进行调整。这些选项是基于软件的,不影响你的扫描仪的行为方式,但它们是常见的调整,在这里做这些调整可以使你不必在 GIM 或 Gwenview 中对图像进行后期处理。
|
||||
|
||||
在许多情况下,你的扫描仪可能有可配置的设置,可在 Skanlite 窗口左侧的“<ruby>扫描仪特定选项<rt>Scanner Specific Options</rt></ruby>”标签中找到。有些扫描仪允许你调整色温、亮度、饱和度和其他出现在固件中的属性。可用的选项根据设备和供应商的不同而不同,所以你有可能在这个面板上看到变化,这取决于你与哪种设备的对接。
|
||||
|
||||
### 扫描和保存
|
||||
|
||||
当你准备好导入图像(或图像的选定区域,如果你已经做了选择)时,点击 Skanlite 窗口右下角的“<ruby>扫描<rt>Scan</rt></ruby>”按钮。根据你的设备,它可能需要一些时间来创建扫描,但当它完成后,会提示你保存或丢弃图像。如果你喜欢你所看到的,点击“<ruby>保存<rt>Save</rt></ruby>”。
|
||||
|
||||
图像会被保存到你所配置的任何默认位置。要查看默认位置,点击窗口右下角的“<ruby>设置<rt>Settings</rt></ruby>”按钮。在 “<ruby>Skanlite 设置<rt>Skanlite Settings</rt></ruby>”中,你可以设置默认保存位置、默认名称格式和图像分辨率。你还可以控制每次扫描后是否提示你保存或丢弃图像,或者你是否想要保存所有的东西并在以后进行分类。
|
||||
|
||||
### Linux 上的扫描很容易
|
||||
|
||||
在 Linux 上扫描文件是如此简单,我很少考虑这个问题。通常不需要你去寻找和安装特殊的驱动或应用,因为像 Skanlite 这样的应用使用开放协议,使这个过程变得简单。下次你有一份需要数字化的拷贝时,用 Skanlite 导入它。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/22/2/scan-documents-skanlite-linux-kde
|
||||
|
||||
作者:[Seth Kenlon][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/seth
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/documents_papers_file_storage_work.png?itok=YlXpAqAJ (Filing papers and documents)
|
||||
[2]: https://opensource.com/sites/default/files/skanlite.png (Skanlite with custom artwork)
|
||||
[3]: https://opensource.com/sites/default/files/skanlite-selection.jpg (Adding selections)
|
@ -0,0 +1,129 @@
|
||||
[#]: subject: "Experience the Stunning Cutefish Desktop in Arch Linux"
|
||||
[#]: via: "https://www.debugpoint.com/2022/02/cutefish-arch-linux-install/"
|
||||
[#]: author: "Arindam https://www.debugpoint.com/author/admin1/"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14385-1.html"
|
||||
|
||||
在 Arch Linux 中体验令人惊叹的 Cutefish 桌面
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202203/23/145712h8q77pe7j9q29hj2.jpg)
|
||||
|
||||
> 现在你可以在 Arch Linux 中体验 Cutefish 桌面了。本文概述了在 Arch Linux 系统中安装 Cutefish 桌面环境的步骤。
|
||||
|
||||
### Cutefish 桌面
|
||||
|
||||
前一阵子,[我们点评了 CutefishOS][2],它带有看起来非常棒的 Cutefish 桌面,得到了我们的读者的积极反应和关注。因此,我们认为这是一个完美的时机,是时候在你最喜欢的 Arch Linux 中体验一下这个桌面了。
|
||||
|
||||
在你进入安装部分之前,这里有一些关于 Cutefish 桌面的小知识。
|
||||
|
||||
Cutefish 桌面是 [CutefishOS][3] 的一部分,这是一个正在开发的新 Linux 发行版。这个基于 Debian 的 Linux 发行版具有令人难以置信的外观、轻量级的 Cutefish 桌面。
|
||||
|
||||
Cutefish 桌面其内部是以 Qt Quick、QML、C++ 和 KDE 框架为基础编写的。这个现代的桌面环境使用 KWin 和 SDDM 进行窗口和显示管理。
|
||||
|
||||
Cutefish 桌面为你带来了所寻求的一个完全 macOS 风格的、开箱即用的 Linux 桌面。也就是说,你可以获得令人惊叹的图标、壁纸、全局菜单、带有漂亮通知弹出窗口的顶部栏和底部停靠区。
|
||||
|
||||
你可在 [这里] 阅读详细的点评。
|
||||
|
||||
### 在 Arch Linux 中安装 Cutefish 桌面
|
||||
|
||||
#### 安装基础 Arch 系统
|
||||
|
||||
本指南假设在尝试这些步骤之前,你的系统中已经安装好了基本的 Arch Linux。或者,如果你也安装了任何基于 Arch 的 Linux 发行版,你也可以尝试。只是在这些情况下要注意显示管理的问题。
|
||||
|
||||
如果你是 Arch 的新手,你可以参考我们的 Arch Linux 安装指南。
|
||||
|
||||
* [如何使用 archinstall 安装 Arch Linux(推荐)][4]
|
||||
* [如何安装 Arch Linux(基本指南)][5]
|
||||
|
||||
#### 安装 Cutefish 桌面
|
||||
|
||||
Arch Linux 社区仓库包含了 Cutefish 组,其中有该桌面运行所需的所有组件。它包括核心软件包、原生应用和下面提到的附加工具。
|
||||
|
||||
在你的 Arch Linux 系统的终端提示符下,运行下面的命令来安装所有 Cutefish 桌面软件包。
|
||||
|
||||
```
|
||||
pacman -S cutefish
|
||||
```
|
||||
|
||||
![A base Arch Linux prompt][6]
|
||||
|
||||
![Install Cutefish in Arch Linux][7]
|
||||
|
||||
接下来,我们需要通过下面的命令安装 Xorg 和显示管理器 SDDM。如果你将 Cutefish 桌面安装在安装有其他诸如 GNOME、KDE Plasma 或 Xfce 等桌面环境的 Arch Linux 中,那么请注意,因为你已经安装了一个显示管理器和 Xorg。所以,你可以轻松跳过这一步。
|
||||
|
||||
```
|
||||
pacman -S xorg sddm
|
||||
```
|
||||
|
||||
上述命令完成后,通过 systemctl 启用显示管理器。
|
||||
|
||||
```
|
||||
systemctl enable sddm
|
||||
```
|
||||
|
||||
这就是裸机安装 Cutefish 桌面的全部内容。完成后,重启系统,登录后你应该看到 Cutefish 桌面如下。
|
||||
|
||||
![Cutefish Desktop in Arch Linux][1]
|
||||
|
||||
基础安装需要额外的定制,因为它不像 Cutefish OS 那样接近。
|
||||
|
||||
### 安装后的配置
|
||||
|
||||
尽管 Arch 仓库中的 Cutefish 组包含了它的原生应用,如计算器和文件管理器,但该桌面缺乏基本的应用,你需要单独安装这些应用来使它成为一个功能齐全的高效桌面。
|
||||
|
||||
我建议使用下面的命令来安装以下基本的应用。你可以跳过这一步,或者选择任何其他的应用/组合。
|
||||
|
||||
* Firefox 网页浏览器
|
||||
* Kwrite 文本编辑器
|
||||
* ttf-freefont 字体
|
||||
* VLC 媒体播放器
|
||||
* Gwenview 图像查看器
|
||||
* GIMP 图像编辑器
|
||||
* LibreOffice
|
||||
* Transmission
|
||||
|
||||
```
|
||||
pacman -S firefox ttf-freefont kwrite vlc gwenview gimp libreoffice-still transmission-qt
|
||||
```
|
||||
|
||||
安装后,打开设置,改变你选择的字体。默认字体是 courier,它在桌面上看起来很糟糕。
|
||||
|
||||
按照你的选择完成所有的定制后,重启系统。然后享受 Arch Linux 中的 Cutefish 桌面。
|
||||
|
||||
![The Stunning Login Lock Screen of Cutefish Desktop][9]
|
||||
|
||||
### 结束语
|
||||
|
||||
这个桌面正在开发中,所以在写这篇文章时,你会发现设置项目不多。例如,没有办法改变分辨率、隐藏停靠区等等。不过,你仍然可以安装额外的应用来使用。如果你想做体验一番,可以去试试。
|
||||
|
||||
加油。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.debugpoint.com/2022/02/cutefish-arch-linux-install/
|
||||
|
||||
作者:[Arindam][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://www.debugpoint.com/author/admin1/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://www.debugpoint.com/wp-content/uploads/2022/02/Cutefish-Desktop-in-Arch-Linux-1024x575.jpg
|
||||
[2]: https://www.debugpoint.com/2021/11/cutefish-os-review-2021/
|
||||
[3]: https://en.cutefishos.com/
|
||||
[4]: https://www.debugpoint.com/2022/01/archinstall-guide/
|
||||
[5]: https://www.debugpoint.com/2020/11/install-arch-linux/
|
||||
[6]: https://www.debugpoint.com/wp-content/uploads/2022/02/A-base-Arch-Linux-prompt.jpg
|
||||
[7]: https://www.debugpoint.com/wp-content/uploads/2022/02/Install-Cutefish-in-Arch-Linux.jpg
|
||||
[9]: https://www.debugpoint.com/wp-content/uploads/2022/02/The-Stunning-Login-Lock-Screen-of-Cutefish-Desktop-1024x576.jpg
|
||||
[10]: https://t.me/debugpoint
|
||||
[11]: https://twitter.com/DebugPoint
|
||||
[12]: https://www.youtube.com/c/debugpoint?sub_confirmation=1
|
||||
[13]: https://facebook.com/DebugPoint
|
@ -0,0 +1,71 @@
|
||||
[#]: subject: "9 resources to help you contribute to open source in 2022"
|
||||
[#]: via: "https://opensource.com/article/22/3/contribute-open-source-2022"
|
||||
[#]: author: "Opensource.com https://opensource.com/users/admin"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14372-1.html"
|
||||
|
||||
2021 总结:如何为开源做出贡献
|
||||
======
|
||||
|
||||
> 你准备好推进你的开源之旅了吗?这里有一些如何给开源做贡献的提示和教程。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202203/19/145149b9uvnnrkfnuzm7uf.jpg)
|
||||
|
||||
在 2022 年,开源正变得越来越家喻户晓。但多年来,开源一直被称为企业 IT 领域中潦倒的弱势群体。开源已经以某种形式或方式存在了 [几十年][2],但甚至直到 20 世纪 90 年代末,它才正式有了自己的 [名字][3]。你可能一直都在使用开源技术,但却不知道。事实上,你目前正在阅读的网站(LCTT 译注:指 opensource.com )就是在开源的内容管理系统 [Drupal][4] 上运行的。你的汽车、笔记本电脑、智能手表和电子游戏很可能是 [由 Linux][5] 这个开源操作系统支持的。
|
||||
|
||||
红帽公司的年度《[企业开源状况][6]》在最近发布了,其中包含了大量的见解,对任何在开源技术领域发展的人都有帮助。首先,77% 的 IT 领导对企业开源的看法比一年前更积极,82% 的 IT 领导更可能选择对开源社区有贡献的供应商。这意味着,参与开源比以往任何时候都更重要。现在是推进你的开源之旅的时候了,无论你在哪里。这里有一些资源可以帮助你踏上这条路。
|
||||
|
||||
### 为什么要为开源做贡献?
|
||||
|
||||
* 《[是什么激励了开源软件的贡献者?][7]》新的研究发现人们贡献的原因自 21 世纪初以来已经改变。
|
||||
* 《[现在为开源做贡献的 3 个理由][8]》现在,比以往任何时候都更加是为开源做贡献的理想时机。
|
||||
* 《[为开源做贡献时的 7 个成功策略][9]》一位作者在为开源项目做贡献的经验帮助她在技术领域找到了她梦想的工作。
|
||||
|
||||
### 为开源做出你的第一次贡献
|
||||
|
||||
* 《[8 种非编码的方式为开源做贡献][10]》无论你是程序员新手,还是经验丰富的老手,或者根本不是工程师,在编码之外还有很多方式为开源项目做贡献。
|
||||
* 《[为 Slack 的开源替代方案做贡献的 6 种方式][11]》加入成千上万为 Mattermost 这个开源消息平台贡献代码、翻译、文档等的人。
|
||||
* 《[任何人都可以为开放实践图书馆做出贡献的 7 种方式][12]》为开放实践图书馆做出贡献是参与全球从业者社区的一种有趣方式,这些从业者都愿意分享他们的知识并改进他们自己的工作方式。
|
||||
* 《[如果你有一份全职工作,如何为 Kubernetes 做贡献][13]》你可以在业余时间从事最大的开源项目之一的内部工作。
|
||||
|
||||
### 鼓励他人为开源做贡献
|
||||
|
||||
* 《[为什么你的开源项目需要的不仅仅是程序员][14]》仅仅是开发人员并不能创造出满足各种需求的长保质期的开源项目,是时候欢迎更多的角色和人才了。
|
||||
* 《[开源贡献者加入的 10 个技巧][15]》让新的贡献者感到自己在社区中受到欢迎,对项目的未来至关重要,因此,在加入时投入时间和注意力是很重要的。
|
||||
|
||||
### 分享你对开源贡献的建议
|
||||
|
||||
当涉及到参与开源社区时,有无限的可能性。在这里,我们的目标是庆祝社区的不同观点和背景,其中包括你。你的独特故事激励着全球各地的人们参与到开源中来。来吧,[把你的文章想法发给我们][16]!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/22/3/contribute-open-source-2022
|
||||
|
||||
作者:[Opensource.com][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/admin
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/wfh_work_home_laptop_work.png?itok=VFwToeMy (Working from home at a laptop)
|
||||
[2]: https://www.redhat.com/en/topics/open-source/what-is-open-source#the-history-of-open-source?intcmp=7013a000002qLH8AAM
|
||||
[3]: https://opensource.com/article/18/2/coining-term-open-source-software
|
||||
[4]: https://opensource.com/tags/drupal
|
||||
[5]: https://opensource.com/article/19/8/everyday-tech-runs-linux
|
||||
[6]: https://www.redhat.com/en/enterprise-open-source-report/2022?intcmp=7013a000002qLH8AAM
|
||||
[7]: https://opensource.com/article/21/4/motivates-open-source-contributors
|
||||
[8]: https://opensource.com/article/20/6/why-contribute-open-source
|
||||
[9]: https://opensource.com/article/22/1/open-source-contributions-career
|
||||
[10]: https://opensource.com/life/16/1/8-ways-contribute-open-source-without-writing-code
|
||||
[11]: https://opensource.com/article/20/7/mattermost
|
||||
[12]: https://opensource.com/article/21/10/open-practice-library
|
||||
[13]: https://opensource.com/article/19/11/how-contribute-kubernetes
|
||||
[14]: https://opensource.com/article/20/9/open-source-role-diversity
|
||||
[15]: https://opensource.com/article/19/12/open-source-contributors
|
||||
[16]: https://linux.cn/article-14335-1.html
|
@ -0,0 +1,93 @@
|
||||
[#]: subject: "Epic Games Store Now Works on Steam Deck"
|
||||
[#]: via: "https://news.itsfoss.com/epic-games-steam-deck/"
|
||||
[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "zd200572"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14374-1.html"
|
||||
|
||||
Epic 游戏商店现在可在 Steam Deck 上使用啦
|
||||
======
|
||||
|
||||
> 现在可以在 Steam Deck 上运行 Epic 游戏商店了,几乎无懈可击! 但是,它是非官方的。
|
||||
|
||||
![](https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2022/03/run-epicgames-on-steam-deck-now.png?w=1200&ssl=1)
|
||||
|
||||
Steam Deck 在加强对 Linux 平台的游戏支持方面做出了有力推动。
|
||||
|
||||
它运行在 **Steam OS 3.0**(基于 Arch)上,并具有 KDE Plasma 桌面环境。感谢 Valve,它没有锁定平台并让用户在上面进行试验。
|
||||
|
||||
尽管不是每个人都可以拿到它,但这是一款令人兴奋的硬件,可以挑战任天堂 Switch 掌机。
|
||||
|
||||
它可能还不支持所有的流行游戏(比如《命运 2》、《堡垒之夜》),但它在几个 3A 级大作和独立游戏上取得了不错的进展。你可以到官方的 [Deck 认证][1] 页面查看有关支持游戏的最新信息。
|
||||
|
||||
现在,更令人激动的是,事实证明 Steam Deck 也可以使用 [Epic 游戏商店][2](**非官方的**)来运行游戏。但是,怎样运行呢,让我们来一探究竟。
|
||||
|
||||
### 通过 Heroic 游戏启动器使用 Epic 游戏商店
|
||||
|
||||
是的,这就是 [去年][4] 制作的 [Heroic 游戏启动器][3], 并且已知它可以运行在 Linux 桌面上。
|
||||
|
||||
另外,(据 [GamingOnLinux][5])感谢 Liam Dawe,他和各位开发者协调,成功地在 Steam Deck 上测试运行了 Heroic 游戏启动器(及 [Heroic Bash 启动器][6])。
|
||||
|
||||
[![][7]](https://youtu.be/89Dw3I6NJX4)
|
||||
|
||||
补充一句,**Heroic Bash 启动器** 是一个为所有已安装的 Heroic 游戏创建启动脚本(.sh 文件)的工具,它允许你直接从终端或者游戏前端/启动器启动游戏,而不必打开 Heroic。
|
||||
|
||||
故事的发生是这样的(根据我与 Heroic Bash 启动器开发者的简短交谈):
|
||||
|
||||
最初,在 Steam Deck 上实验运行 Epic 游戏商店时,Steam 控制器无法工作,因为 Epic 游戏商店是使用 Steam 客户端以一个“非 Steam 游戏”运行的。
|
||||
|
||||
所以,Heroic Bash 启动器的开发者,[Rishabh Moharir][8](也是这里的一位作者)建议使用他的工具,按照他 [GitHub 上的维基指南][9] 来试试。
|
||||
|
||||
Heroic Bash 启动器可以在 Linux 桌面上与 Epic 游戏商店配合使用。所以,这值得一试!
|
||||
|
||||
然后,幸运地,它工作了。
|
||||
|
||||
### 在 Steam Deck 上安装 Epic 游戏商店
|
||||
|
||||
首先,你需要在 Steam Deck 上使用可用的 AppImage 文件在**桌面模式**下安装 **Heroic 游戏启动器**。
|
||||
|
||||
完成后,你需要登录并下载你选择的游戏。
|
||||
|
||||
接下来,你需要下载最新的 [legendary][10] 二进制文件,并在启动器设置中将其设置为替代的 legendary 二进制文件。
|
||||
|
||||
你需要在启动器的游戏设置中配置并设置兼容层为 Proton 7.0。
|
||||
|
||||
这时,你需要下载最新的 [Heroic Bash 启动器二进制文件][11],然后运行它。
|
||||
|
||||
最后,你必须根据这个 [GitHub 上的官方维基指南][9],把游戏添加到 Steam 中(以便在 Steam Deck 的界面中找到它)。
|
||||
|
||||
总之,“手工爱好者”们肯定需要花好大一会儿才能使其工作。另外,如果你仍然困惑,你可以在 [维基][12] 上找到包含详细信息的同样的一套步骤和细节,这是 Heroic 游戏启动器团队整理的(或者参考上面的视频)。
|
||||
|
||||
对我来说,这听起来可行,应该不会超越大多数 Steam Deck 用户的能力。不幸的是,我无法在印度买到 Steam Deck(目前)。
|
||||
|
||||
至于 Steam Deck 上的 Epic 游戏商店的未来,我们只能抱以最好的期望。
|
||||
|
||||
你试过 Steam Deck 吗?在下面的评论区让我知道你的看法。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://news.itsfoss.com/epic-games-steam-deck/
|
||||
|
||||
作者:[Ankush Das][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[zd200572](https://github.com/zd200572)
|
||||
校对:[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/lujun9972
|
||||
[1]: https://www.steamdeck.com/en/verified
|
||||
[2]: https://www.epicgames.com/store/en-US/
|
||||
[3]: https://github.com/Heroic-Games-Launcher/HeroicGamesLauncher
|
||||
[4]: https://news.itsfoss.com/heroic-games-launcher/
|
||||
[5]: https://www.gamingonlinux.com/2022/03/heroic-games-launcher-now-works-nicely-on-steam-deck/
|
||||
[6]: https://github.com/redromnon/HeroicBashLauncher
|
||||
[7]: https://i0.wp.com/i.ytimg.com/vi/UvuGAQDagWE/hqdefault.jpg?w=780&ssl=1
|
||||
[8]: https://news.itsfoss.com/author/rishabh/
|
||||
[9]: https://github.com/Heroic-Games-Launcher/HeroicGamesLauncher/wiki/Adding-Games-to-Steam-on-Linux
|
||||
[10]: https://github.com/derrod/legendary/releases/
|
||||
[11]: https://github.com/redromnon/HeroicBashLauncher/releases/
|
||||
[12]: https://github.com/Heroic-Games-Launcher/HeroicGamesLauncher/wiki/SteamDeck---Running-Epic-Games
|
@ -0,0 +1,244 @@
|
||||
[#]: subject: "Creating and initializing maps in Groovy vs Java"
|
||||
[#]: via: "https://opensource.com/article/22/3/maps-groovy-vs-java"
|
||||
[#]: author: "Chris Hermansen https://opensource.com/users/clhermansen"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "lkxed"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14378-1.html"
|
||||
|
||||
在 Groovy 和 Java 中创建并初始化映射的不同
|
||||
======
|
||||
|
||||
> Java 和 Groovy 中的<ruby>映射<rt>map</rt></ruby>都是非常通用的,它允许<ruby>关键字<rt>key</rt></ruby>和<ruby>值<rt>value</rt></ruby>为任意类型,只要继承了 `Object` 类即可。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202203/21/092532ykbhkq36vbr3bpzg.jpg)
|
||||
|
||||
我最近在探索 Java 与 Groovy 在 [创建并初始化<ruby>列表<rt>List</rt></ruby>][2] 和 [在运行时构建<ruby>列表<rt>List</rt></ruby>][3] 方面的一些差异。我观察到,就实现这些功能而言,Groovy 的简洁和 Java 的繁复形成了鲜明对比。
|
||||
|
||||
在这篇文章中,我将实现在 Java 和 Groovy 中创建并初始化<ruby>映射<rt>Map</rt></ruby>。映射为开发支持根据 <ruby>关键字<rt>key</rt></ruby> 检索的结构提供了可能,如果找到了这样一个关键字,它就会返回对应的 <ruby>值<rt>value</rt></ruby>。今天,很多编程语言都实现了映射,其中包括 Java 和 Groovy,也包括了 Python(它将映射称为 <ruby>字典<rt>dict</rt></ruby>)、Perl、awk 以及许多其他语言。另一个经常被用来描述映射的术语是 <ruby>关联数组<rt>associative array</rt></ruby>,你可以在 [这篇维基百科文章][4] 中了解更多。Java 和 Groovy 中的映射都是非常通用的,它允许关键字和值</rt></ruby>为任意类型,只要继承了 `Object` 类即可。
|
||||
|
||||
### 安装 Java 和 Groovy
|
||||
|
||||
Groovy 基于 Java,因此你需要先安装 Java。你的 Linux 发行版的仓库中可能有最近的比较好的 Java 和 Groovy 版本。或者,你也可以在根据上面链接中的指示来安装 Groovy。对于 Linux 用户来说,[SDKMan][5] 是一个不错的代替选项,你可以使用它来获取多个 Java 和 Groovy 版本,以及许多其他的相关工具。在这篇文章中,我使用的 SDK 发行版是:
|
||||
|
||||
* Java: version 11.0.12-open of OpenJDK 11;
|
||||
* Groovy: version 3.0.8.
|
||||
|
||||
### 言归正传
|
||||
|
||||
Java 提供了非常多的方式来实例化和初始化映射,并且从 Java 9 之后,添加了一些新的方式。其中最明显的方式就是使用 `java.util.Map.of()` 这个静态方法,下面介绍如何使用它:
|
||||
|
||||
```
|
||||
var m1 = Map.of(
|
||||
"AF", "Afghanistan",
|
||||
"AX", "Åland Islands",
|
||||
"AL", "Albania",
|
||||
"DZ", "Algeria",
|
||||
"AS", "American Samoa",
|
||||
"AD", "Andorra",
|
||||
"AO", "Angola",
|
||||
"AI", "Anguilla",
|
||||
"AQ", "Antarctica");
|
||||
|
||||
System.out.println("m1 = " + m1);
|
||||
System.out.println("m1 is an instance of " + m1.getClass());
|
||||
```
|
||||
|
||||
事实证明,在此种情况下,`Map.of()` 有两个重要的限制。其一,这样创建出来的映射实例是<ruby>不可变的<rt>immutable</rt></ruby>。其二,你最多只能提供 20 个参数,用来表示 10 个<ruby>键值对<rt>key-value pair</rt></ruby>。
|
||||
|
||||
你可以尝试着添加第 10 对和第 11 对,比方说 "AG", "Antigua and Barbuda" 和 "AR", "Argentina",然后观察会发生什么。你将发现 Java 编译器尝试寻找一个支持 11 个键值对的 `Map.of()` 方法而遭遇失败。
|
||||
|
||||
快速查看 [java.util.Map 类的文档][8],你就会找到上述第二个限制的原因,以及解决这个难题的一种方式:
|
||||
|
||||
```
|
||||
var m2 = Map.ofEntries(
|
||||
Map.entry("AF", "Afghanistan"),
|
||||
Map.entry("AX", "Åland Islands"),
|
||||
Map.entry("AL", "Albania"),
|
||||
Map.entry("DZ", "Algeria"),
|
||||
Map.entry("AS", "American Samoa"),
|
||||
Map.entry("AD", "Andorra"),
|
||||
Map.entry("AO", "Angola"),
|
||||
Map.entry("AI", "Anguilla"),
|
||||
Map.entry("AQ", "Antarctica"),
|
||||
Map.entry("AG", "Antigua and Barbuda"),
|
||||
Map.entry("AR", "Argentina"),
|
||||
Map.entry("AM", "Armenia"),
|
||||
Map.entry("AW", "Aruba"),
|
||||
Map.entry("AU", "Australia"),
|
||||
Map.entry("AT", "Austria"),
|
||||
Map.entry("AZ", "Azerbaijan"),
|
||||
Map.entry("BS", "Bahamas"),
|
||||
Map.entry("BH", "Bahrain"),
|
||||
Map.entry("BD", "Bangladesh"),
|
||||
Map.entry("BB", "Barbados")
|
||||
);
|
||||
|
||||
System.out.println("m2 = " + m2);
|
||||
System.out.println("m2 is an instance of " + m2.getClass());
|
||||
```
|
||||
|
||||
这就是一个比较好的解决方式,前提是我不在随后的代码里改变使用 `Map.ofEntries()` 创建并初始化的映射内容。注意,我在上面使用了 `Map.ofEntries()` 来代替 `Map.of()`。
|
||||
|
||||
然而,假设我想要创建并初始化一个非空的映射,随后往这个映射中添加数据,我需要这样做:
|
||||
|
||||
```
|
||||
var m3 = new HashMap<String,String>(Map.ofEntries(
|
||||
Map.entry("AF", "Afghanistan"),
|
||||
Map.entry("AX", "Åland Islands"),
|
||||
Map.entry("AL", "Albania"),
|
||||
Map.entry("DZ", "Algeria"),
|
||||
Map.entry("AS", "American Samoa"),
|
||||
Map.entry("AD", "Andorra"),
|
||||
Map.entry("AO", "Angola"),
|
||||
Map.entry("AI", "Anguilla"),
|
||||
Map.entry("AQ", "Antarctica"),
|
||||
Map.entry("AG", "Antigua and Barbuda"),
|
||||
Map.entry("AR", "Argentina"),
|
||||
Map.entry("AM", "Armenia"),
|
||||
Map.entry("AW", "Aruba"),
|
||||
Map.entry("AU", "Australia"),
|
||||
Map.entry("AT", "Austria"),
|
||||
Map.entry("AZ", "Azerbaijan"),
|
||||
Map.entry("BS", "Bahamas"),
|
||||
Map.entry("BH", "Bahrain"),
|
||||
Map.entry("BD", "Bangladesh"),
|
||||
Map.entry("BB", "Barbados")
|
||||
));
|
||||
|
||||
System.out.println("m3 = " + m3);
|
||||
System.out.println("m3 is an instance of " + m3.getClass());
|
||||
|
||||
m3.put("BY", "Belarus");
|
||||
System.out.println("BY: " + m3.get("BY"));
|
||||
|
||||
```
|
||||
|
||||
这里,我把使用 `Map.ofEntries()` 创建出来的不可变映射作为 `HashMap` 的一个构造参数,以此创建了该映射的一个<ruby>可变副本<rt>mutable copy</rt></ruby>,之后我就可以修改它 —— 比如使用 `put()` 方法。
|
||||
|
||||
让我们来看看上述过程如何用 Groovy 来实现:
|
||||
|
||||
```
|
||||
def m1 = [
|
||||
"AF": "Afghanistan",
|
||||
"AX": "Åland Islands",
|
||||
"AL": "Albania",
|
||||
"DZ": "Algeria",
|
||||
"AS": "American Samoa",
|
||||
"AD": "Andorra",
|
||||
"AO": "Angola",
|
||||
"AI": "Anguilla",
|
||||
"AQ": "Antarctica",
|
||||
"AG": "Antigua and Barbuda",
|
||||
"AR": "Argentina",
|
||||
"AM": "Armenia",
|
||||
"AW": "Aruba",
|
||||
"AU": "Australia",
|
||||
"AT": "Austria",
|
||||
"AZ": "Azerbaijan",
|
||||
"BS": "Bahamas",
|
||||
"BH": "Bahrain",
|
||||
"BD": "Bangladesh",
|
||||
"BB": "Barbados"]
|
||||
|
||||
println "m1 = $m1"
|
||||
println "m1 is an instance of ${m1.getClass()}"
|
||||
|
||||
m1["BY"] = "Belarus"
|
||||
println "m1 = $m1"
|
||||
```
|
||||
|
||||
只看一眼,你就会发现 Groovy 使用了 `def` 关键字而不是 `var` —— 尽管在<ruby>最近模型<rt>late-model</rt><ruby>的 Groovy(version 3+)中,使用 `var` 关键字也是可行的。
|
||||
|
||||
你还会发现,你是通过在括号里添加了一个键值对列表来创建一个映射的。不仅如此,这样创建的列表对象还非常有用,这里有几个原因。其一,它是可变的;其二,它是一个 `LinkedHashMap` 的实例,内部维持了数据的插入顺序。所以,当你运行 Java 版本的代码并打印出变量 `m3`,你会看到:
|
||||
|
||||
```
|
||||
m3 = {BB=Barbados, BD=Bangladesh, AD=Andorra, AF=Afghanistan, AG=Antigua and Barbuda, BH=Bahrain, AI=Anguilla, AL=Albania, AM=Armenia, AO=Angola, AQ=Antarctica, BS=Bahamas, AR=Argentina, AS=American Samoa, AT=Austria, AU=Australia, DZ=Algeria, AW=Aruba, AX=Åland Islands, AZ=Azerbaijan}
|
||||
```
|
||||
|
||||
而当你运行 Groovy 版本的代码,你会看到:
|
||||
|
||||
```
|
||||
m1 = [AF:Afghanistan, AX:Åland Islands, AL:Albania, DZ:Algeria, AS:American Samoa, AD:Andorra, AO:Angola, AI:Anguilla, AQ:Antarctica, AG:Antigua and Barbuda, AR:Argentina, AM:Armenia, AW:Aruba, AU:Australia, AT:Austria, AZ:Azerbaijan, BS:Bahamas, BH:Bahrain, BD:Bangladesh, BB:Barbados]
|
||||
```
|
||||
|
||||
再一次,你将看到 Groovy 是如何简化事情的。这样的语法非常直观,有点像 Python 里的字典,并且,即使你有一个超过 10 个键值对的初始列表,你也不需要去记住各种必要的别扭方式。注意我们使用的表达式:
|
||||
|
||||
```
|
||||
m1[“BY”] = “Belarus”
|
||||
```
|
||||
|
||||
而在 Java 中,你需要这样做:
|
||||
|
||||
```
|
||||
m1.put(“BY”, “Belarus”)
|
||||
```
|
||||
|
||||
还有,这个映射默认是可变的,这么做的利弊很难评判,还是得取决于你的需求是什么。我个人觉得,Java 在这种情况下的 “默认不可变” 机制,最让我困扰的地方是,它没有一个类似于 `Map.mutableOfMutableEntries()` 的方法。这迫使一些刚学会如何声明和初始化一个映射的程序员,不得不转念去思考该如何把他们手中不可变的映射,转换为可变的。同时我也想问,创建一个不可变的对象然后再舍弃它,这样真的好吗?
|
||||
|
||||
另一个值得考虑的事情是,Groovy 使用方括号代替 Java 中的 `put()` 和 `get()` 方法来进行关键字查找。因此你可以这样写:
|
||||
|
||||
```
|
||||
m1[“ZZ”] = m1[“BY”]
|
||||
```
|
||||
|
||||
而不需要这样写:
|
||||
|
||||
```
|
||||
m1.put(“ZZ”,m1.get(“BY”))
|
||||
```
|
||||
|
||||
有时候,就像使用某个类的实例变量一样来使用映射中的关键字和值是一个好办法。设想你现在有一堆想要设置的属性,在 Groovy 中,它们看起来就像下面这样:
|
||||
|
||||
```
|
||||
def properties = [
|
||||
verbose: true,
|
||||
debug: false,
|
||||
logging: false]
|
||||
```
|
||||
|
||||
然后,你可以改变其中的某个属性,就像下面这样:
|
||||
|
||||
```
|
||||
properties.verbose = false
|
||||
```
|
||||
|
||||
之所以这样能工作,是因为,只要关键字符合特定的规则,你就可以省略引号,然后直接用点操作符来代替方括号。尽管这个功能非常有用,也非常好用,它也同时也意味着,如果你要把一个变量作为一个映射的关键字来使用,你就必须把这个变量包裹在圆括号里,就像下面这样:
|
||||
|
||||
```
|
||||
def myMap = [(k1): v1, (k2): v2]
|
||||
```
|
||||
|
||||
是时候告诉勤奋的读者 Groovy 是一门为编写脚本而量身定制的语言了。映射通常是脚本中的关键元素,它为脚本提供了<ruby>查找表<rt>lookup table</rt></ruby>,并且通常起到了作为内存数据库的作用。我在这里使用的例子是 ISO 3166 规定的两个字母的国家代码和国家名称。对在世界上各个国家的互联网使用者来说,这些代码是很熟悉的。此外,假设我们要编写一个从日志文件中查找互联网主机名,并借此来了解用户的地理位置分布的脚本工具,那么这些代码会是十分有用的部分。
|
||||
|
||||
### Groovy 相关资源
|
||||
|
||||
[Apache Groovy 网站][10] 上有非常多的文档。另一个很棒的 Groovy 资源是 [Mr. Haki][11]。[Baeldung 网站][12] 提供了大量 Java 和 Groovy 的有用教程。学习 Groovy 还有一个很棒的原因,那就是可以接着学习 [Grails][13],后者是一个优秀的、高效率的全栈 Web 框架。它基于许多优秀组件构建而成,比如有 Hibernate、Spring Boot 和 Micronaut 等。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/22/3/maps-groovy-vs-java
|
||||
|
||||
作者:[Chris Hermansen][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/clhermansen
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/lenovo-thinkpad-laptop-concentration-focus-windows-office.png?itok=-8E2ihcF (Woman using laptop concentrating)
|
||||
[2]: https://opensource.com/article/22/1/creating-lists-groovy-java
|
||||
[3]: https://opensource.com/article/22/2/accumulating-lists-groovy-vs-java
|
||||
[4]: https://en.wikipedia.org/wiki/Associative_array
|
||||
[5]: https://sdkman.io/
|
||||
[6]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+map
|
||||
[7]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+system
|
||||
[8]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Map.html
|
||||
[9]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string
|
||||
[10]: https://groovy-lang.org/
|
||||
[11]: https://blog.mrhaki.com/
|
||||
[12]: https://www.baeldung.com/
|
||||
[13]: https://grails.org/
|
@ -0,0 +1,160 @@
|
||||
[#]: subject: "Using FileZilla for Connecting to SFTP Server Via GUI"
|
||||
[#]: via: "https://itsfoss.com/filezilla-ubuntu/"
|
||||
[#]: author: "Pratham Patel https://itsfoss.com/author/pratham/"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "hwlife"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14410-1.html"
|
||||
|
||||
使用 FileZilla 以图形界面连接 SFTP 服务器
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202203/29/164256iljy9w3n053qv28x.jpg)
|
||||
|
||||
如果你问那些极客系统管理员,他们会肯定的说使用 [rsync 或者 scp 命令在远程服务器和本地系统之间传输文件][1]。
|
||||
|
||||
然而,这些都是命令行方式,并不是每个人都能用起来感到舒适。
|
||||
|
||||
谢天谢地的是,有一些图形化工具能够让你从远程服务器来传输文件。
|
||||
|
||||
[FileZilla][2] 是一个流行的、跨平台的传输文件为目的开源软件。它支持使用通过 TLS 或者 SSL 加密的 FTP 协议(FTPS),也支持借助 SSH 的 FTP 协议,以及旧的 FTP 协议。
|
||||
|
||||
让我展示怎样在 Linux 上安装 FileZilla 然后用它来文件传输。
|
||||
|
||||
那么,让我们开始吧!
|
||||
|
||||
### 在 Ubuntu 和其他 Linux 发行版上安装 FileZilla
|
||||
|
||||
你可以使用源码来安装,但是还是建议使用你的发行版提供的软件包。因为它是一个热门软件,它应该在许多 Linux 发行版(即便不是全部)的软件仓库中可用。请使用你的发行版的软件中心和包管理器来安装。
|
||||
|
||||
在 Ubuntu 上,你可以从软件中心来安装它:
|
||||
|
||||
![FileZilla is available in the Ubuntu Software Center][3]
|
||||
|
||||
你也可以使用命令行的方式来安装它:
|
||||
|
||||
```
|
||||
sudo apt install filezilla
|
||||
```
|
||||
|
||||
如果你看到 [软件包不存在的错误][4],你应该 [开启 Universe 仓库][5]。
|
||||
|
||||
一旦安装成功,打开菜单(通过按 `Super` 键),键入 “FileZilla”来启动它。
|
||||
|
||||
![Start FileZilla from the system menu][6]
|
||||
|
||||
### 使用 FileZilla
|
||||
|
||||
第一次使用 FileZilla 时,你将会看到如下图所示的一个界面:
|
||||
|
||||
![Screenshot of FileZilla running][7]
|
||||
|
||||
左边窗口显示来自你本地系统的文件和目录。右边窗口显示目前是空的。当你连接到远程服务器时,来自你的远程系统的文件会显示在这里。
|
||||
|
||||
在我向你展示之前,让我分享一下关于理解 FileZilla 图形界面重要方面的一些细节。
|
||||
|
||||
#### 了解 FileZilla 图形界面
|
||||
|
||||
下图总体上给你展示了 FileZilla 窗口布局的不同部分。
|
||||
|
||||
![FileZilla Window Layout | image credit][8]
|
||||
|
||||
图形界面由 6 个不同的区域/窗口来组成。让我简短的给你解释一下:
|
||||
|
||||
**1、工具栏**:它有许多选项,如打开站点管理器、刷新本地和远程目录文件和文件列表、开始处理当前的文件传输队列、停止正在传输的任务并取消队列中的文件,等等。
|
||||
|
||||
**2、快速连接栏**:顾名思义,它允许你快速连接到一个远程站点,除了主机名、用户名、密码和端口之外,不需要指定更多细节。
|
||||
|
||||
**3、消息日志**:它显示了一个日志,不论你连接成功与否。错误消息标记为红色,正常消息为白色,命令是蓝色。
|
||||
|
||||
**4 & 5、本地窗口和远程窗口**:这两个窗口非常相似,除了本地窗口显示本地目录内容,并且有用来上传文件的上下文菜单;而远程窗口显示的是远程目录的内容,并有从远程目录下载到本地文件的选项。
|
||||
|
||||
**6、传输队列**:最后,传输队列窗口显示正在传输的项目的状态和它们的传输速度,以及队列中的文件和传输历史(仅限当前实例)。
|
||||
|
||||
#### 使用 FileZilla 连接到 SFTP 服务器
|
||||
|
||||
你需要知道远程服务器的用户名、密码和 IP 地址。远程服务器也应该被设置成能够接受以这些信息进行的连接。你还需要在目标文件夹有正确的权限设置。
|
||||
|
||||
要新增一个 SFTP 连接,你需要打开站点管理器。有两种方式可以打开它。
|
||||
|
||||
在菜单栏上的“<ruby>文件<rt>Files</rt></ruby>”菜单选项下有一个“<ruby>站点管理器<rt>Site Manager</rt></ruby>”。或者,你可以直接点击工具栏上的“站点管理器”图标。
|
||||
|
||||
![the Site Manager button on the toolbar][9]
|
||||
|
||||
一旦站点管理器对话框弹出,点击“<ruby>新站点<rt>New site</rt></ruby>”按钮,并(可选地)重命名添加到条目中的新站点。我叫我的站点为“test8”。
|
||||
|
||||
![screenshot of the Site Manager][10]
|
||||
|
||||
在右侧的“<ruby>常规<rt>General</rt></ruby>”标签下,确保所使用的协议与服务器管理员为你设置的相一致。在我的例子中,我设置了一个 SFTP 服务器(<ruby>借助 SSH 通道的 FTP<rt>FTP over SSH</rt></ruby>),因此我选择了“<ruby>SFTP - SSH 文件传输协议<rt>SFTP – SSH File Transfer Protocol</rt></ruby>”。
|
||||
|
||||
下一个字段填写远程服务器的 IP 地址。
|
||||
|
||||
如果你没有设置“<ruby>端口号<rt>Port</rt></ruby>”,FileZilla 将假定要使用的端口号为缺省的 SSH 协议的 22 端口。
|
||||
|
||||
“<ruby>登录类型<rt>Logon Type</rt></ruby>”下拉列表有几个选项。在“<ruby>常规<rt>Normal</rt></ruby>”登录方式下,你只需要提供用户名和密码。
|
||||
|
||||
如果你设置了一对公钥和私钥来验证你的 SSH 用户连接,那么可以使用“<ruby>密钥文件授权<rt>Key file authentication</rt></ruby>”方式。
|
||||
|
||||
一旦你为远程服务器和认证填写了所有适当的细节,就可以点击底部的“<ruby>连接<rt>Connect</rt></ruby>”按钮连接到站点。别担心,你刚刚建立连接的新站点将会按“登录类型”保存起来。
|
||||
|
||||
![Remote pane being populated after a successful connection][11]
|
||||
|
||||
如果你看到一个 “连接到 <主机 IP 地址>” 的状态消息,并且最近的状态消息是 “目录列表 "/" 显示成功”,说明你已经成功的连接到了远程的 SFTP 服务器(使用 SSH 协议的 FTP)。
|
||||
|
||||
另一个 SFTP 连接成功的标志是,当连接成功建立的时候,远程目录窗口有了很多消息。
|
||||
|
||||
#### 发送文件到远程系统
|
||||
|
||||
你必须 **确保你位于要传输文件的目录里**。传输文件非常简单,只需**双击文件**,无需指定指定目标位置。
|
||||
|
||||
如果你在左边窗口双击了一个文件,它立即传输到右边科技的目录里(或者有传输任务的话,加到队列中)。
|
||||
|
||||
同样,从右边窗口到左边窗口也是一样双击,即从远程服务器到本地。**这就是为什么本地和远程系统都要在正确的位置是非常重要的原因**。
|
||||
|
||||
此外,你也可以鼠标右击文件上传它们(或者加它们到上传队列)。目标位置总是 FileZilla 界面中显示的目录。
|
||||
|
||||
![Transfer queue pane showing the local file name, remote destination, transfer speed and an ETA][12]
|
||||
|
||||
除了方便和快捷方面,这两种上传的文件方式没有什么不同。
|
||||
|
||||
#### 下载远程系统中的文件
|
||||
|
||||
像上传文件一样,当从远程服务器传输文件到本地时也有两种方式,但不是“上传”而是“下载”。
|
||||
|
||||
下载的文件将放在本地目录窗口中,也就是你当前打开的本地窗口。
|
||||
|
||||
你将会注意到除了发送方和接收方不同之外,下载和上传文件的行为是一样的。除非连接数受到限制,否则文件传输将是并行进行的。
|
||||
|
||||
### 总结
|
||||
|
||||
厉害!有了这些基础知识,你应该能够在你的计算机和服务器之间传输文件。我希望你能够学到一些新东西 : )
|
||||
|
||||
如果你感到这些对你有帮助,随意在评论部分留下你的问题、建议或简单的一句 “thank you”。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/filezilla-ubuntu/
|
||||
|
||||
作者:[Pratham Patel][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[hwlife](https://github.com/hwlife)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/pratham/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://linuxhandbook.com/transfer-files-ssh/
|
||||
[2]: https://filezilla-project.org/
|
||||
[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2022/03/filezilla-ubuntu-software-center.png?resize=751%2C382&ssl=1
|
||||
[4]: https://itsfoss.com/unable-to-locate-package-error-ubuntu/
|
||||
[5]: https://itsfoss.com/ubuntu-repositories/
|
||||
[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2022/03/filezilla-ubuntu.png?resize=763%2C224&ssl=1
|
||||
[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2022/01/01_filezilla.webp?resize=800%2C431&ssl=1
|
||||
[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2022/01/02_filezilla_layout.webp?resize=800%2C504&ssl=1
|
||||
[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2022/01/03_site_manager_annotated.webp?resize=386%2C170&ssl=1
|
||||
[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2022/01/04_site_manager.webp?resize=800%2C577&ssl=1
|
||||
[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2022/01/05_successful_connection.webp?resize=800%2C431&ssl=1
|
||||
[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2022/01/07_transfer_pane_populated-1.webp?resize=800%2C431&ssl=1
|
||||
[13]: https://itsfoss.community/
|
@ -0,0 +1,147 @@
|
||||
[#]: subject: "Using Homebrew Package Manager on Fedora Linux"
|
||||
[#]: via: "https://fedoramagazine.org/using-homebrew-package-manager-on-fedora-linux/"
|
||||
[#]: author: "Mehdi Haghgoo https://fedoramagazine.org/author/powergame/"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14380-1.html"
|
||||
|
||||
在 Fedora Linux 上使用 Homebrew 包管理器
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202203/21/193616z7kvf71b7z48kn92.jpg)
|
||||
|
||||
### 简介
|
||||
|
||||
Homebrew 是一个 macOS 的包管理器,用于在 macOS 上安装 UNIX 工具。但是,它也可以在 Linux(和 Windows WSL)上使用。它是用 Ruby 编写的,并提供主机系统(macOS 或 Linux)可能不提供的软件包,因此它在操作系统包管理器之外提供了一个辅助的包管理器。此外,它只以非 root 用户身份在前缀 `/home/linuxbrew/.linuxbrew` 或 `~/.linuxbrew` 下安装软件包,不会污染系统路径。这个包管理器在 Fedora Linux 上也适用。在这篇文章中,我将尝试告诉你 Homebrew 与 Fedora Linux 包管理器 `dnf` 有什么不同,为什么你可能想在 Fedora Linux 上安装和使用它,以及如何安装。
|
||||
|
||||
> 免责声明
|
||||
>
|
||||
> 你应该经常检查你在系统上安装的软件包和二进制文件。Homebrew 包通常以非 sudoer 用户运行,并工作在专门的前缀的路径下,因此它们不太可能造成破坏或错误配置。然而,所有的安装操作都要自己承担风险。作者和 Fedora 社区不对任何可能直接或间接因遵循这篇文章而造成的损失负责。
|
||||
|
||||
### Homebrew 如何工作
|
||||
|
||||
Homebrew 在底层使用 Ruby 和 Git。它使用特殊的 Ruby 脚本从源代码构建软件,这些脚本被称为 “<ruby>配方<rt>formula</rt></ruby>”,看起来像这样(使用 `wget` 包作为例子):
|
||||
|
||||
(LCTT 译注:Homebrew 本身意思是“家酿”,在这个软件中,有各种类似于酿酒的比喻。)
|
||||
|
||||
```
|
||||
class Wget < Formula
|
||||
homepage "https://www.gnu.org/software/wget/"
|
||||
url "https://ftp.gnu.org/gnu/wget/wget-1.15.tar.gz"
|
||||
sha256 "52126be8cf1bddd7536886e74c053ad7d0ed2aa89b4b630f76785bac21695fcd"
|
||||
|
||||
def install
|
||||
system "./configure", "--prefix=#{prefix}"
|
||||
system "make", "install"
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
### Homebrew 与 dnf 有何不同
|
||||
|
||||
Homebrew 是一个包管理器,提供了许多 UNIX 软件工具和包的最新版本,例如 FFmpeg、Composer、Minikube 等。当你想安装一些由于某种原因在 Fedora Linux RPM 仓库中没有的软件包时,它就会证明很有用。所以,它并不能取代 `dnf`。
|
||||
|
||||
### 安装 Homebrew
|
||||
|
||||
在开始安装 Homebrew 之前,确保你已经安装了 glibc 和 gcc。这些工具可以在 Fedora 上通过以下方式安装:
|
||||
|
||||
```
|
||||
sudo dnf groupinstall "Development Tools"
|
||||
```
|
||||
|
||||
然后,通过在终端运行以下命令来安装 Homebrew:
|
||||
|
||||
```
|
||||
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
||||
```
|
||||
|
||||
在安装过程中,你会被提示输入你的 `sudo` 密码。另外,你可以选择 Homebrew 的安装前缀,但默认的前缀就可以了。在安装过程中,你将成为 Homebrew 前缀目录的所有者,这样你就不必输入 `sudo` 密码来安装软件包。安装将需要数分钟。完成后,运行以下命令,将 `brew` 添加到你的 `PATH` 中:
|
||||
|
||||
```
|
||||
echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"' >> ~/.bash_profile
|
||||
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
|
||||
```
|
||||
|
||||
### 安装和检查软件包
|
||||
|
||||
要在 Homebrew 上使用“配方”安装一个软件包,只需运行:
|
||||
|
||||
```
|
||||
brew install <formula>
|
||||
```
|
||||
|
||||
将 `<formula>` 替换为你要安装的“配方”的名称。例如,要安装 Minikube,只需运行:
|
||||
|
||||
```
|
||||
brew install minikube
|
||||
```
|
||||
|
||||
你也可以用以下方式搜索“配方”:
|
||||
|
||||
```
|
||||
brew search <formula>
|
||||
```
|
||||
|
||||
要获得一个“配方”的信息,请运行:
|
||||
|
||||
```
|
||||
brew info <formula>
|
||||
```
|
||||
|
||||
另外,你可以用以下命令查看所有已安装的“配方”:
|
||||
|
||||
```
|
||||
brew list
|
||||
```
|
||||
|
||||
### 卸载软件包
|
||||
|
||||
要从你的 Homebrew 前缀中卸载一个软件包,请运行:
|
||||
|
||||
```
|
||||
brew uninstall <formula>
|
||||
```
|
||||
|
||||
### 升级软件包
|
||||
|
||||
要升级一个用 Homebrew 安装的特定软件包,请运行:
|
||||
|
||||
```
|
||||
brew upgrade <formula>
|
||||
```
|
||||
|
||||
要更新 Homebrew 和所有已安装的“配方”到最新版本,请运行:
|
||||
|
||||
```
|
||||
brew update
|
||||
```
|
||||
|
||||
### 总结
|
||||
|
||||
Homebrew 是一个简单的包管理器,可以与 `dnf` 一起成为有用的工具(两者完全没有关系)。尽量坚持使用 Fedora 原生的 `dnf` 包管理器,以避免软件冲突。然而,如果你在 Fedora Linux 软件库中没有找到某个软件,那么你也许可以用 Homebrew 找到并安装它。请看 [“配方”列表][2] 以了解有哪些可用的软件。另外,Fedora Linux 上的 Homebrew 还不支持图形化应用(在 Homebrew 术语中称为“<ruby>酒桶<rt>cask</rt></ruby>”)。至少,我在安装 GUI 应用时没有成功过。
|
||||
|
||||
### 参考资料和进一步阅读
|
||||
|
||||
要了解更多关于 Homebrew 的信息,请查看以下资源:
|
||||
|
||||
* Homebrew 主页:<https://brew.sh>
|
||||
* Homebrew 文档:<https://docs.brew.sh>
|
||||
* 维基百科 Homebrew 页面:<https://en.wikipedia.org/wiki/Homebrew_(package_manager)>
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://fedoramagazine.org/using-homebrew-package-manager-on-fedora-linux/
|
||||
|
||||
作者:[Mehdi Haghgoo][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/powergame/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://fedoramagazine.org/wp-content/uploads/2022/03/homebrew_sized-up-816x346.png
|
||||
[2]: https://formulae.brew.sh/formula/
|
229
published/202203/20220310 How to use undocumented web APIs.md
Normal file
229
published/202203/20220310 How to use undocumented web APIs.md
Normal file
@ -0,0 +1,229 @@
|
||||
[#]: subject: "How to use undocumented web APIs"
|
||||
[#]: via: "https://jvns.ca/blog/2022/03/10/how-to-use-undocumented-web-apis/"
|
||||
[#]: author: "Julia Evans https://jvns.ca/"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "lxbwolf"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14358-1.html"
|
||||
|
||||
如何调用没有文档说明的 Web API
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202203/15/103119ab6yoika09og669a.jpg)
|
||||
|
||||
大家好!几天前我写了篇 [小型的个人程序][1] 的文章,里面提到了调用没有文档说明的“秘密” API 很有意思,你需要从你的浏览器中把 cookie 复制出来才能访问。
|
||||
|
||||
有些读者问如何实现,因此我打算详细描述下,其实过程很简单。我们还会谈谈在调用没有文档说明的 API 时,可能会遇到的错误和道德问题。
|
||||
|
||||
我们用谷歌 Hangouts 举例。我之所以选择它,并不是因为这个例子最有用(我认为官方的 API 更实用),而是因为在这个场景中更有用的网站很多是小网站,而小网站的 API 一旦被滥用,受到的伤害会更大。因此我们使用谷歌 Hangouts,因为我 100% 肯定谷歌论坛可以抵御这种试探行为。
|
||||
|
||||
我们现在开始!
|
||||
|
||||
### 第一步:打开开发者工具,找一个 JSON 响应
|
||||
|
||||
我浏览了 <https://hangouts.google.com>,在 Firefox 的开发者工具中打开“<ruby>网络<rt>Network</rt></ruby>”标签,找到一个 JSON 响应。你也可以使用 Chrome 的开发者工具。
|
||||
|
||||
打开之后界面如下图:
|
||||
|
||||
![][2]
|
||||
|
||||
找到其中一条 “<ruby>类型<rt>Type</rt></ruby>” 列显示为 `json` 的请求。
|
||||
|
||||
为了找一条感兴趣的请求,我找了好一会儿,突然我找到一条 “people” 的端点,看起来是返回我们的联系人信息。听起来很有意思,我们来看一下。
|
||||
|
||||
### 第二步:复制为 cURL
|
||||
|
||||
下一步,我在感兴趣的请求上右键,点击 “<rt>复制<rt>Copy</rt></ruby>” -> “<ruby>复制为 cURL<rt>Copy as cURL</rt></ruby>”。
|
||||
|
||||
然后我把 `curl` 命令粘贴到终端并运行。下面是运行结果:
|
||||
|
||||
```
|
||||
$ curl 'https://people-pa.clients6.google.com/v2/people/?key=REDACTED' -X POST ........ (省略了大量请求标头)
|
||||
Warning: Binary output can mess up your terminal. Use "--output -" to tell
|
||||
Warning: curl to output it to your terminal anyway, or consider "--output
|
||||
Warning: <FILE>" to save to a file.
|
||||
```
|
||||
|
||||
你可能会想 —— 很奇怪,“二进制的输出在你的终端上无法正常显示” 是什么错误?原因是,浏览器默认情况下发给服务器的请求头中有 `Accept-Encoding: gzip, deflate` 参数,会把输出结果进行压缩。
|
||||
|
||||
我们可以通过管道把输出传递给 `gunzip` 来解压,但是我们发现不带这个参数进行请求会更简单。因此我们去掉一些不相关的请求头。
|
||||
|
||||
### 第三步:去掉不相关的请求头
|
||||
|
||||
下面是我从浏览器获得的完整 `curl` 命令。有很多行!我用反斜杠(`\`)把请求分开,这样每个请求头占一行,看起来更清晰:
|
||||
|
||||
```
|
||||
curl 'https://people-pa.clients6.google.com/v2/people/?key=REDACTED' \
|
||||
-X POST \
|
||||
-H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0' \
|
||||
-H 'Accept: */*' \
|
||||
-H 'Accept-Language: en' \
|
||||
-H 'Accept-Encoding: gzip, deflate' \
|
||||
-H 'X-HTTP-Method-Override: GET' \
|
||||
-H 'Authorization: SAPISIDHASH REDACTED' \
|
||||
-H 'Cookie: REDACTED'
|
||||
-H 'Content-Type: application/x-www-form-urlencoded' \
|
||||
-H 'X-Goog-AuthUser: 0' \
|
||||
-H 'Origin: https://hangouts.google.com' \
|
||||
-H 'Connection: keep-alive' \
|
||||
-H 'Referer: https://hangouts.google.com/' \
|
||||
-H 'Sec-Fetch-Dest: empty' \
|
||||
-H 'Sec-Fetch-Mode: cors' \
|
||||
-H 'Sec-Fetch-Site: same-site' \
|
||||
-H 'Sec-GPC: 1' \
|
||||
-H 'DNT: 1' \
|
||||
-H 'Pragma: no-cache' \
|
||||
-H 'Cache-Control: no-cache' \
|
||||
-H 'TE: trailers' \
|
||||
--data-raw 'personId=101777723309&personId=1175339043204&personId=1115266537043&personId=116731406166&extensionSet.extensionNames=HANGOUTS_ADDITIONAL_DATA&extensionSet.extensionNames=HANGOUTS_OFF_NETWORK_GAIA_GET&extensionSet.extensionNames=HANGOUTS_PHONE_DATA&includedProfileStates=ADMIN_BLOCKED&includedProfileStates=DELETED&includedProfileStates=PRIVATE_PROFILE&mergedPersonSourceOptions.includeAffinity=CHAT_AUTOCOMPLETE&coreIdParams.useRealtimeNotificationExpandedAcls=true&requestMask.includeField.paths=person.email&requestMask.includeField.paths=person.gender&requestMask.includeField.paths=person.in_app_reachability&requestMask.includeField.paths=person.metadata&requestMask.includeField.paths=person.name&requestMask.includeField.paths=person.phone&requestMask.includeField.paths=person.photo&requestMask.includeField.paths=person.read_only_profile_info&requestMask.includeField.paths=person.organization&requestMask.includeField.paths=person.location&requestMask.includeField.paths=person.cover_photo&requestMask.includeContainer=PROFILE&requestMask.includeContainer=DOMAIN_PROFILE&requestMask.includeContainer=CONTACT&key=REDACTED'
|
||||
```
|
||||
|
||||
第一眼看起来内容有很多,但是现在你不需要考虑每一行是什么意思。你只需要把不相关的行删掉就可以了。
|
||||
|
||||
我通常通过删掉某行查看是否有错误来验证该行是不是可以删除 —— 只要请求没有错误就一直删请求头。通常情况下,你可以删掉 `Accept*`、`Referer`、`Sec-*`、`DNT`、`User-Agent` 和缓存相关的头。
|
||||
|
||||
在这个例子中,我把请求删成下面的样子:
|
||||
|
||||
```
|
||||
curl 'https://people-pa.clients6.google.com/v2/people/?key=REDACTED' \
|
||||
-X POST \
|
||||
-H 'Authorization: SAPISIDHASH REDACTED' \
|
||||
-H 'Content-Type: application/x-www-form-urlencoded' \
|
||||
-H 'Origin: https://hangouts.google.com' \
|
||||
-H 'Cookie: REDACTED'\
|
||||
--data-raw 'personId=101777723309&personId=1175339043204&personId=1115266537043&personId=116731406166&extensionSet.extensionNames=HANGOUTS_ADDITIONAL_DATA&extensionSet.extensionNames=HANGOUTS_OFF_NETWORK_GAIA_GET&extensionSet.extensionNames=HANGOUTS_PHONE_DATA&includedProfileStates=ADMIN_BLOCKED&includedProfileStates=DELETED&includedProfileStates=PRIVATE_PROFILE&mergedPersonSourceOptions.includeAffinity=CHAT_AUTOCOMPLETE&coreIdParams.useRealtimeNotificationExpandedAcls=true&requestMask.includeField.paths=person.email&requestMask.includeField.paths=person.gender&requestMask.includeField.paths=person.in_app_reachability&requestMask.includeField.paths=person.metadata&requestMask.includeField.paths=person.name&requestMask.includeField.paths=person.phone&requestMask.includeField.paths=person.photo&requestMask.includeField.paths=person.read_only_profile_info&requestMask.includeField.paths=person.organization&requestMask.includeField.paths=person.location&requestMask.includeField.paths=person.cover_photo&requestMask.includeContainer=PROFILE&requestMask.includeContainer=DOMAIN_PROFILE&requestMask.includeContainer=CONTACT&key=REDACTED'
|
||||
```
|
||||
|
||||
这样我只需要 4 个请求头:`Authorization`、`Content-Type`、`Origin` 和 `Cookie`。这样容易管理得多。
|
||||
|
||||
### 第四步:在 Python 中发请求
|
||||
|
||||
现在我们知道了我们需要哪些请求头,我们可以把 `curl` 命令翻译进 Python 程序!这部分是相当机械化的过程,目标仅仅是用 Python 发送与 cUrl 相同的数据。
|
||||
|
||||
下面是代码实例。我们使用 Python 的 `requests` 包实现了与前面 `curl` 命令相同的功能。我把整个长请求分解成了元组的数组,以便看起来更简洁。
|
||||
|
||||
```
|
||||
import requests
|
||||
import urllib
|
||||
|
||||
data = [
|
||||
('personId','101777723'), # I redacted these IDs a bit too
|
||||
('personId','117533904'),
|
||||
('personId','111526653'),
|
||||
('personId','116731406'),
|
||||
('extensionSet.extensionNames','HANGOUTS_ADDITIONAL_DATA'),
|
||||
('extensionSet.extensionNames','HANGOUTS_OFF_NETWORK_GAIA_GET'),
|
||||
('extensionSet.extensionNames','HANGOUTS_PHONE_DATA'),
|
||||
('includedProfileStates','ADMIN_BLOCKED'),
|
||||
('includedProfileStates','DELETED'),
|
||||
('includedProfileStates','PRIVATE_PROFILE'),
|
||||
('mergedPersonSourceOptions.includeAffinity','CHAT_AUTOCOMPLETE'),
|
||||
('coreIdParams.useRealtimeNotificationExpandedAcls','true'),
|
||||
('requestMask.includeField.paths','person.email'),
|
||||
('requestMask.includeField.paths','person.gender'),
|
||||
('requestMask.includeField.paths','person.in_app_reachability'),
|
||||
('requestMask.includeField.paths','person.metadata'),
|
||||
('requestMask.includeField.paths','person.name'),
|
||||
('requestMask.includeField.paths','person.phone'),
|
||||
('requestMask.includeField.paths','person.photo'),
|
||||
('requestMask.includeField.paths','person.read_only_profile_info'),
|
||||
('requestMask.includeField.paths','person.organization'),
|
||||
('requestMask.includeField.paths','person.location'),
|
||||
('requestMask.includeField.paths','person.cover_photo'),
|
||||
('requestMask.includeContainer','PROFILE'),
|
||||
('requestMask.includeContainer','DOMAIN_PROFILE'),
|
||||
('requestMask.includeContainer','CONTACT'),
|
||||
('key','REDACTED')
|
||||
]
|
||||
response = requests.post('https://people-pa.clients6.google.com/v2/people/?key=REDACTED',
|
||||
headers={
|
||||
'X-HTTP-Method-Override': 'GET',
|
||||
'Authorization': 'SAPISIDHASH REDACTED',
|
||||
'Content-Type': 'application/x-www-form-urlencoded',
|
||||
'Origin': 'https://hangouts.google.com',
|
||||
'Cookie': 'REDACTED',
|
||||
},
|
||||
data=urllib.parse.urlencode(data),
|
||||
)
|
||||
|
||||
print(response.text)
|
||||
```
|
||||
|
||||
我执行这个程序后正常运行 —— 输出了一堆 JSON 数据!太棒了!
|
||||
|
||||
你会注意到有些地方我用 `REDACTED` 代替了,因为如果我把原始数据列出来你就可以用我的账号来访问谷歌论坛了,这就很不好了。
|
||||
|
||||
### 运行结束!
|
||||
|
||||
现在我可以随意修改 Python 程序,比如传入不同的参数,或解析结果等。
|
||||
|
||||
我不打算用它来做其他有意思的事了,因为我压根对这个 API 没兴趣,我只是用它来阐述请求 API 的过程。
|
||||
|
||||
但是你确实可以对返回的一堆 JSON 做一些处理。
|
||||
|
||||
### curlconverter 看起来很强大
|
||||
|
||||
有人评论说可以使用 <https://curlconverter.com/> 自动把 curl 转换成 Python(和一些其他的语言!),这看起来很神奇 —— 我都是手动转的。我在这个例子里使用了它,看起来一切正常。
|
||||
|
||||
### 追踪 API 的处理过程并不容易
|
||||
|
||||
我不打算夸大追踪 API 处理过程的难度 —— API 的处理过程并不明显!我也不知道传给这个谷歌论坛 API 的一堆参数都是做什么的!
|
||||
|
||||
但是有一些参数看起来很直观,比如 `requestMask.includeField.paths=person.email` 可能表示“包含每个人的邮件地址”。因此我只关心我能看懂的参数,不关心看不懂的。
|
||||
|
||||
### (理论上)适用于所有场景
|
||||
|
||||
可能有人质疑 —— 这个方法适用于所有场景吗?
|
||||
|
||||
答案是肯定的 —— 浏览器不是魔法!浏览器发送给你的服务器的所有信息都是 HTTP 请求。因此如果我复制了浏览器发送的所有的 HTTP 请求头,那么后端就会认为请求是从我的浏览器发出的,而不是用 Python 程序发出的。
|
||||
|
||||
当然,我们去掉了一些浏览器发送的请求头,因此理论上后端是可以识别出来请求是从浏览器还是 Python 程序发出的,但是它们通常不会检查。
|
||||
|
||||
这里有一些对读者的告诫 —— 一些谷歌服务的后端会通过令人难以理解(对我来说是)方式跟前端通信,因此即使理论上你可以模拟前端的请求,但实际上可能行不通。可能会遭受更多攻击的大型 API 会有更多的保护措施。
|
||||
|
||||
我们已经知道了如何调用没有文档说明的 API。现在我们再来聊聊可能遇到的问题。
|
||||
|
||||
### 问题 1:会话 cookie 过期
|
||||
|
||||
一个大问题是我用我的谷歌会话 cookie 作为身份认证,因此当我的浏览器会话过期后,这个脚本就不能用了。
|
||||
|
||||
这意味着这种方式不能长久使用(我宁愿调一个真正的 API),但是如果我只是要一次性快速抓取一小组数据,那么可以使用它。
|
||||
|
||||
### 问题 2:滥用
|
||||
|
||||
如果我正在请求一个小网站,那么我的 Python 脚本可能会把服务打垮,因为请求数超出了它们的处理能力。因此我请求时尽量谨慎,尽量不过快地发送大量请求。
|
||||
|
||||
这尤其重要,因为没有官方 API 的网站往往是些小网站且没有足够的资源。
|
||||
|
||||
很明显在这个例子中这不是问题 —— 我认为在写这篇文章的过程我一共向谷歌论坛的后端发送了 20 次请求,他们肯定可以处理。
|
||||
|
||||
如果你用自己的账号身份过度访问这个 API 并导致了故障,那么你的账号可能会被暂时封禁(情理之中)。
|
||||
|
||||
我只下载我自己的数据或公共的数据 —— 我的目的不是寻找网站的弱点。
|
||||
|
||||
### 请记住所有人都可以访问你没有文档说明的 API
|
||||
|
||||
我认为本文最重要的信息并不是如何使用其他人没有文档说明的 API。虽然很有趣,但是也有一些限制,而且我也不会经常这么做。
|
||||
|
||||
更重要的一点是,任何人都可以这么访问你后端的 API!每个人都有开发者工具和网络标签,查看你传到后端的参数、修改它们都很容易。
|
||||
|
||||
因此如果一个人通过修改某些参数来获取其他用户的信息,这不值得提倡。我认为提供公开 API 的大部分开发者们都知道,但是我之所以再提一次,是因为每个初学者都应该了解。: )
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://jvns.ca/blog/2022/03/10/how-to-use-undocumented-web-apis/
|
||||
|
||||
作者:[Julia Evans][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[lxbwolf](https://github.com/lxbwolf)
|
||||
校对:[wxy
|
||||
](https://github.com/wxy
|
||||
)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://jvns.ca/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://jvns.ca/blog/2022/03/08/tiny-programs/
|
||||
[2]: https://jvns.ca/images/network-tab.png
|
@ -0,0 +1,158 @@
|
||||
[#]: subject: "Piwigo: An Open-Source Google Photos Alternative That You Can Self-Host"
|
||||
[#]: via: "https://itsfoss.com/piwigo/"
|
||||
[#]: author: "Ankush Das https://itsfoss.com/author/ankush/"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14389-1.html"
|
||||
|
||||
Piwigo:一个你可以自行托管的开源谷歌照片替代品
|
||||
======
|
||||
|
||||
> 如果你想摆脱“谷歌照片”,Piwigo 是一个令人印象深刻的开源替代方案,能够自我托管。让我们来探讨一下它的更多信息。
|
||||
|
||||
“谷歌照片”是备份你的照片和视频的最流行的选择之一。(LCTT 译注:并不是……)
|
||||
|
||||
考虑到它是大多数安卓手机的默认选择,使用谷歌照片管理照片/视频是一种无缝体验。
|
||||
|
||||
但是,如果你想从它那里转移到一些开源的、对隐私更友好的东西怎么办?不只是谷歌照片,还有其它一些照片托管平台也是专有的。
|
||||
|
||||
请看看 Piwigo,一个开源的 [照片管理软件][1] 来帮助你。
|
||||
|
||||
### Piwigo:你可以自行托管的开源照片库
|
||||
|
||||
![][2]
|
||||
|
||||
[Piwigo][3] 是一个开源解决方案,可以帮助管理你的照片和视频。
|
||||
|
||||
你可以选择自己托管,控制你的数据,或者选择云托管(**数据存储在法国,有备份**)。
|
||||
|
||||
顺便说一句,该公司起源于法国。
|
||||
|
||||
不仅仅是针对个人,Piwigo 也为组织和团队量身定做。
|
||||
|
||||
如果你担心使用谷歌照片或类似服务上传时的隐私政策,Piwigo 可以成为一个出色的替代品。
|
||||
|
||||
Piwigo 提供了一系列的功能和细粒度的控制来管理你的照片。
|
||||
|
||||
### Piwigo 的功能
|
||||
|
||||
![][4]
|
||||
|
||||
虽然它是主流服务的一个可行的替代品,但它为个人和组织提供了先进的功能。
|
||||
|
||||
一些功能包括:
|
||||
|
||||
* 通过云托管(\*.piwigo.com)获得你的专用子域
|
||||
* 能够批量下载
|
||||
* 创建相册
|
||||
* 选择照片来分配现有的相册集
|
||||
* 通过链接分享照片
|
||||
* 用公共和私人模式进行访问管理
|
||||
* 能够对用户进行分组,以管理你的相册或照片(对组织/团队来说很有效)。
|
||||
* 基本分析,以跟踪你的使用情况和使用的存储空间
|
||||
* 支持向相册/照片添加标签
|
||||
* 支持深色模式
|
||||
* 能够编辑照片的元数据
|
||||
* 过滤器,以快速找到照片/相册
|
||||
* 支持 JPG/JPEG、PNG 和 GIF 文件(针对个人)
|
||||
* 支持所有文件类型(仅适用于企业使用)
|
||||
* 为个人用户提供无限的存储空间
|
||||
* 支持自定义域名(即使是云托管选项)
|
||||
* 插件可扩展功能
|
||||
* 支持主题
|
||||
* 移动支持(安卓和 iOS)
|
||||
|
||||
除了上述功能外,你还可以获得改善用户管理和 Piwigo 的整体用户体验的更多选项。
|
||||
|
||||
![][5]
|
||||
|
||||
我使用其针对个人的云托管选项(**有 30 天的试用期**)对其进行了快速测试。让我分享我的一些见解,以帮助你在尝试之前了解它们。
|
||||
|
||||
### 使用 Piwigo 来管理照片
|
||||
|
||||
当你注册一个账户时,你可以指定你的自定义子域。
|
||||
|
||||
例如,我把我的测试账户放在 **ankushsoul.piwigo.com**。
|
||||
|
||||
![][6]
|
||||
|
||||
任何人都可以通过在他们的浏览器中输入上述 URL 来访问我公开分享的照片/相册。
|
||||
|
||||
所以,最好是尽可能保持子域的名称独一无二。在这两种情况下,你也可以将相册/照片限制给登录的用户(或你自己),其他人即使知道你的子域,也无法访问你的照片。
|
||||
|
||||
![][7]
|
||||
|
||||
你可以前往它的仪表板,检查你的存储使用情况和整体活动情况。
|
||||
|
||||
它有两个激活的插件,一个用于内部功能,另一个默认用于打击垃圾信息。
|
||||
|
||||
![][8]
|
||||
|
||||
你会发现有很多插件可以加强批量管理,启用管理员信息,激活相册的评论,在你的相册上添加到期时间,限制下载,以及访问一些令人兴奋的功能。
|
||||
|
||||
你可以花点时间浏览一下现有的插件选择,评估一下它们与谷歌照片相比能有多大用处。
|
||||
|
||||
当然,你在任何主流的云照片托管服务中都得不到这种控制。
|
||||
|
||||
所以,这很值得探索。
|
||||
|
||||
![][9]
|
||||
|
||||
对于现有的其他功能,你可以管理多个用户,控制访问,发送通知(通过电子邮件),还可以进行一些维护活动。
|
||||
|
||||
总的来说,用户体验是相当好的。它可能没有提供最现代的用户界面,但它可以工作,而且很容易管理。
|
||||
|
||||
**注意**:考虑到 Play Store 上的应用没有收到最新的更新,移动体验(在 Android 上)可能并不令人满意。然而,你可以在他们的 GitHub 上找到最新版本的 APK 文件。
|
||||
|
||||
### 开始使用 Piwigo
|
||||
|
||||
我认为 Piwigo 非常适合各类人使用,从想组织照片的人,到想合作/分享图片的用户,都可以使用。
|
||||
|
||||
如果你选择自我托管,你应该查看它的 [文档][10] 和探索 [GitHub 页面][11]。
|
||||
|
||||
考虑到你独自管理它,你将需要适当地维护实例,并对你的数据进行备份。
|
||||
|
||||
如果你选择 [云托管选项][12](作为个人),定价从每年 **39 欧元** 开始,不限图片文件上传,如果你订阅 3 年,价格会更便宜。
|
||||
|
||||
![][13]
|
||||
|
||||
个人计划没有提到具体的存储限制(无限)。因此,可以说你不应该有任何问题,除非你开始滥用该服务。
|
||||
|
||||
鉴于你在该服务中得到的控制权,大多数用户会更愿意使用云托管服务,而放弃像谷歌照片这样的服务。
|
||||
|
||||
企业/组织的定价计划将是昂贵的(每月)。然而,它支持企业的所有文件类型。
|
||||
|
||||
- [Piwigo][3]
|
||||
|
||||
你认为像 Piwigo 这样的谷歌照片的自行托管替代品如何?你试过吗?云主机选项是主流选项的可行替代品吗?
|
||||
|
||||
请在下面的评论中告诉我你的想法。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/piwigo/
|
||||
|
||||
作者:[Ankush Das][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://itsfoss.com/author/ankush/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://itsfoss.com/linux-photo-management-software/
|
||||
[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2022/03/piwigo-feature.jpg?resize=800%2C424&ssl=1
|
||||
[3]: https://piwigo.com/
|
||||
[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2022/03/piwigo-album-edit.png?resize=800%2C451&ssl=1
|
||||
[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2022/03/piwigo-upload.png?resize=800%2C665&ssl=1
|
||||
[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2022/03/piwigo-sign-up.png?resize=800%2C646&ssl=1
|
||||
[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2022/03/piwigo-dashboard.png?resize=800%2C435&ssl=1
|
||||
[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2022/03/piwigo-plugins.png?resize=800%2C499&ssl=1
|
||||
[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2022/03/piwigo-config.png?resize=800%2C632&ssl=1
|
||||
[10]: https://piwigo.org/doc/doku.php
|
||||
[11]: https://github.com/Piwigo
|
||||
[12]: https://piwigo.com/pricing
|
||||
[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2022/03/piwigo-pricing.png?resize=800%2C509&ssl=1
|
@ -0,0 +1,71 @@
|
||||
[#]: subject: "Zorin OS 16.1 Brings Much Needed Stability and Improvements"
|
||||
[#]: via: "https://www.debugpoint.com/2022/03/zorin-os-16-1-release/"
|
||||
[#]: author: "Arindam https://www.debugpoint.com/author/admin1/"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14365-1.html"
|
||||
|
||||
Zorin OS 16.1 带来了急需的稳定性和改进措施
|
||||
======
|
||||
|
||||
> Zorin OS 16.1 带来了安全补丁、新软件,团队的目标是打造更好的发行版。
|
||||
|
||||
Zorin OS 之所以受欢迎,是因为它为 Windows 用户的 Linux 之旅提供了一个完美的起点。由于其简单的设计、优雅的软件包选择和开箱即用的 Windows 外观,它是当今所有用户欢迎和追捧的 Linux 发行版之一。
|
||||
|
||||
自 [Zorin OS 16][1] 以来,经过近两个月的时间,这第一个小版本现在可以供已经在运行 16.0 版本的用户下载和升级了。
|
||||
|
||||
![Zorin OS 16.1 Desktop][2]
|
||||
|
||||
### Zorin OS 16.1 - 新内容
|
||||
|
||||
Zorin OS 16.1 为你的系统带来了最新安全补丁,包括 LibreOffice 7.3 办公套件和一些更新的软件包。
|
||||
|
||||
如果你刚买了一台新的笔记本电脑或安装了一个新的游戏工作站,Zorin OS 16.1 还支持索尼的 PlayStation 5 Dual Sense 游戏控制器和苹果的魔术鼠标 2。此外,你还得到了对英特尔第 12 代处理器和英伟达 RTX 3050 显卡的出色支持。
|
||||
|
||||
此外,由于最新的软件包,Zorin 开发人员承诺对汽车 Wi-Fi 和打印机有更好的支持。
|
||||
|
||||
下面是这个小版本的更新包和应用的快速总结。
|
||||
|
||||
* 基于 Ubuntu 20.04.3 LTS
|
||||
* Zorin 桌面,基于 GNOME 3.38.4
|
||||
* LibreOffice 7.3
|
||||
* Firefox 98
|
||||
* Linux Kernel 5.13
|
||||
* GIMP 2.10.18
|
||||
* Evolution 邮件客户端
|
||||
|
||||
如果你想深入了解这些变化,完整的细节可以在[这里][3]找到。
|
||||
|
||||
那么,在哪里下载?
|
||||
|
||||
### 下载
|
||||
|
||||
在你点击下载之前,你应该知道它有一个“专业”版本,带有额外的主题和开箱即用的设置,价值 39 美元,而“核心”版本是完全免费下载的。你可以在下载页面阅读“专业版”和“核心版”的比较。
|
||||
|
||||
在我看来,核心版应该足够了,如果你有足够的经验,你可以改变设置,使其成为专业版。因此,我们推荐核心版用于一般用途。
|
||||
|
||||
- [下载 Zorin OS 16.1][5]
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.debugpoint.com/2022/03/zorin-os-16-1-release/
|
||||
|
||||
作者:[Arindam][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://www.debugpoint.com/author/admin1/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://www.debugpoint.com/2021/12/zorin-os-16-lite-review-xfce/
|
||||
[2]: https://www.debugpoint.com/wp-content/uploads/2022/03/Zorin-OS-16.1-Desktop-1024x575.jpg
|
||||
[3]: https://blog.zorin.com/2022/03/10/zorin-os-16-1-released-support-for-ukraine/
|
||||
[5]: https://zorin.com/os/download/
|
||||
[6]: https://t.me/debugpoint
|
||||
[7]: https://twitter.com/DebugPoint
|
||||
[8]: https://www.youtube.com/c/debugpoint?sub_confirmation=1
|
||||
[9]: https://facebook.com/DebugPoint
|
@ -0,0 +1,169 @@
|
||||
[#]: subject: "Best 5 Alternatives to Microsoft Office [Compared]"
|
||||
[#]: via: "https://www.debugpoint.com/2022/03/best-alternatives-microsoft-office-2022/"
|
||||
[#]: author: "Arindam https://www.debugpoint.com/author/admin1/"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "aREversez"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14382-1.html"
|
||||
|
||||
横向对比 5 款微软 Office 替代品
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202203/22/102722qhd38mnle30sejnt.jpg)
|
||||
|
||||
> 在这篇文章中,我们将推荐 5 款可以替代微软 Office 的最佳软件,并从功能、操作难易程度等方面,对它们进行比较。看一看哪款更适合你?
|
||||
|
||||
可以说,Office 办公软件是微软开发的最优质的软件之一,受到世界各地用户的青睐,广泛应用于各行各业,当属近几十年来软件市场涌现出来的精品。
|
||||
|
||||
不过大家都知道,微软 Office 不仅没有开发适用于 Linux 的版本,而且价格高昂。对于企业用户或者个人用户来说,Office 365 的价格就更贵了,远超普通人能接受的价格水平。
|
||||
|
||||
那么,有哪些软件可以替代微软 Office 呢?
|
||||
|
||||
这篇文章推荐 5 款可以替代微软 Office 的最佳软件。
|
||||
|
||||
### LibreOffice
|
||||
|
||||
![LibreOffice][1]
|
||||
|
||||
首先推荐的是 [LibreOffice][2]。LibreOffice 是一款自由开源的办公套件,由文档基金会开发维护,支持 Linux、macOS 以及 Windows 系统。
|
||||
|
||||
LibreOffice 套件包括表格工具 [Calc][3]、文字处理工具 Writer、演示工具 Impress、画图工具 Draw 以及数据库工具 Base。
|
||||
|
||||
LibreOffice 办公软件的开发十分很活跃,同时不断提升对微软 Office 的兼容性。如果善加利用,LibreOffice 完全可以取代微软 Office。借助丰富的技术文档和社区资源,用户可以迅速掌握 LibreOffice 的使用方法。
|
||||
|
||||
企业用户也可以免费使用 LibreOffice,如果需要用它来完成关键工作,用户也可以购买配置服务和支持服务,相关费用十分低廉。
|
||||
|
||||
然而,LibreOffice 不提供像 Outlook 一样的邮箱服务。这可能是它的一个小缺点,不过好在现在的邮箱服务都可以在浏览器上运行。
|
||||
|
||||
* [主页][2]
|
||||
* [商业版][4]
|
||||
* [下载普通个人版][5]
|
||||
* [帮助文档][6]
|
||||
* [官方支持论坛][7]
|
||||
|
||||
### Google Docs
|
||||
|
||||
![Google Docs][8]
|
||||
|
||||
搜索引擎巨头谷歌为用户免费提供了一套网页版的办公套件 —— [Google Docs][9],其中包括 Docs(文档编辑器)、Sheets(表格程序)、Slides(演示程序)。
|
||||
|
||||
用户可以在谷歌云盘中免费创建、打开文档。随时随地,自由存取。Google Docs 界面设计优美,内置工具栏、高级选项、拼写检查、语音输入功能(仅支持 Chrome 浏览器)、加密功能以及云存储服务。谷歌也为 iOS 系统和安卓系统提供了移动端,用户可以在移动设备上轻松打开、编辑文档。
|
||||
|
||||
Google Docs 最为人称道的功能在于它的模板。有了这些内置模板,用户可以迅速编辑出一份专业的文档。此外,通过邀请其他谷歌用户,还可以使用多人协作在线编辑功能。
|
||||
|
||||
如果你需要更多的功能,可以付费使用 Google Workspace。这是一套全面的整合方案,你可以通过 Google Forms 收集信息,并集成到你的文档和表格中、网站编辑工具 Google Sites、Google 日历等服务,保存为文档。
|
||||
|
||||
* [主页][9]
|
||||
* [帮助文档][10]
|
||||
|
||||
### OnlyOffice
|
||||
|
||||
![OnlyOffice][11]
|
||||
|
||||
[OnlyOffice][12](显示名字为 ONLYOFFICE)是一套自由开源的办公软件,包括文本编辑器、表格工具、演示软件,提供共享文件实时协作编辑、修改痕迹记录查看以及制作可供填写的表格等高级功能。
|
||||
|
||||
外观上,OnlyOffice 的功能区模仿了微软 Office 365 功能区的设计风格,能让用户快速上手。此外,OnlyOffice 对微软 Office 文件格式(.docx .xlsx 以及 .pptx)的兼容性更好,方便用户与他人共享文件。
|
||||
|
||||
值得一提的是,OnlyOffice 还推出了需要付费使用的企业版本 —— ONLYOFFICE Workspace。该版本增加了一些其他的高级功能,提供即时支持服务,非常适合那些预算紧张但对格式兼容性要求又很高的用户。
|
||||
|
||||
ONLYOFFICE Workspace 集成了邮箱客户端、客户关系管理产品、项目管理工具以及日历。总体来说,ONLYOFFICE Workspace 是一款不错的软件,但也有一些不足,如拼写检查、打印预览、页面尺寸以及漏洞等问题。不过也不需要过分担心,你可以在 GitHub 上传错误报告,向开发团队寻求帮助。
|
||||
|
||||
* [主页][12]
|
||||
* [下载][14]
|
||||
* [帮助文档][15]
|
||||
|
||||
### Softmaker FreeOffice
|
||||
|
||||
![FreeOffice][16]
|
||||
|
||||
[FreeOffice][17] 由 SoftMaker 开发,是一套十分优秀的办公软件,包括 TextMaker(可替代 Word)、PlanMaker(可替代 Excel)以及 Presentations(可替代 PowerPoint)。FreeOffice 提供了两种用户界面:带有功能区选项的现代化界面与带有菜单和工具栏的传统界面,两种界面都十分受欢迎。此外,FreeOffice 还为触控设备提供专有的用户界面与功能。
|
||||
|
||||
FreeOffice 对 微软 Office 文档格式的兼容性是很好的,可以完成大部分工作。然而,你在处理开放文档格式(ODT)文件时可能会遇到一点麻烦,因为它的支持有限。
|
||||
|
||||
FreeOffice 是一款闭源软件。
|
||||
|
||||
* [主页][17]
|
||||
* [下载][18]
|
||||
* [帮助文档][19]
|
||||
|
||||
### WPS Office
|
||||
|
||||
![WPS Office][20]
|
||||
|
||||
还记得金山办公软件吗? 它现在的名字叫做 WPS Office。WPS 取 **W**ord, **P**resentation 与 **S**preadsheets 的首字母组合而成。到今天,WPS Office 已有 30 年的发展历史,是老牌办公软件之一。WPS 作为办公软件,功能齐全,支持移动端在内的各类平台。
|
||||
|
||||
WPS 最具特色的功能在于支持实时协作编辑。使用 WPS,团队成员可以同时编辑一份共享文档。WPS 还为用户提供了超过 10 万种文档模板,帮助用户编辑出专业美观的文档与演示文件。
|
||||
|
||||
WPS 的标准版本可以免费下载使用,不过有一些高级功能需要付费。
|
||||
|
||||
如果你需要额外的功能,比如编辑 PDF 文件、云空间扩容、团队协作以及企业支持,可以考虑付费开通会员,使用 WPS 企业版。
|
||||
|
||||
注意,这是一款闭源软件,而且可能会推送广告。(LCTT 译注:该公司内部人士表示,免费的 Linux 版没广告。)该软件由中国金山软件公司开发。
|
||||
|
||||
* [主页][21]
|
||||
* [帮助文档][22]
|
||||
* [下载][23]
|
||||
|
||||
### 对比表
|
||||
|
||||
下表基于功能以及其他细节,对上述 5 款办公软进行对比总结。
|
||||
|
||||
产品 | 价格 | 是否开源 | 优势 | 劣势
|
||||
---|---|---|---|---
|
||||
LibreOffice | 免费 | 开源 | 免费;跨平台;支持多种语言;完全支持 ODF 文件格式;对 微软 Office 兼容性最好;开发活跃 | 不提供邮箱应用;不提供项目管理功能;数据库基于 Java
|
||||
Google Docs | 免费 | 闭源 | 免费;跨平台;良好的文档支持;随时随地存取云文档;完美支持移动端 | 需要网络连接;网络连接导致卡顿或延迟;不提供可供安装的版本
|
||||
OnlyOffice | 免费(基础功能) | 开源 | 用户界面酷似微软 Office;对微软 Office 文件拥有更好的兼容性;云集成;支持插件;跨平台 | 基本功能可能出现问题;云集成服务违反欧盟通用数据保护条例;网页端延迟
|
||||
FreeOffice | 免费(基础功能)| 闭源 | 免费;相较于 LibreOffice 更加轻量;支持触屏;良好的微软 Office 兼容性;跨平台 | 免费版本只包括文档、表格与演示功能;其他产品需要付费;对 ODT 文件格式的支持有限;闭源软件
|
||||
WPS Office | 免费 | 闭源 | 良好的微软 Office 兼容性;跨平台;标签界面;支持多语言 | 闭源软件;可能弹出广告
|
||||
|
||||
### 我们推荐
|
||||
|
||||
抛开所有这些优势和劣势不管,如果你还不确定哪一款才是最适合你的,我推荐你使用 LibreOffice。因为 LibreOffice 与 TDF 格式前景广阔,开发活跃,在全世界都拥有广泛的支持。LibreOffice 有着庞大的在线知识库,为用户提供丰富的使用技巧。通过在 LibreOffice 中使用 Basic 语言或者 Python 宏,你还可以轻松实现办公自动化。
|
||||
|
||||
### 总结
|
||||
|
||||
我希望,我们的推荐能帮助你选择适合自己的可替代微软 Office 的办公软件。 说实话,上述软件没有一个能真正比得上微软 Office。但是并不是每个人都能付得起微软 Office 高昂的费用,我相信以上 5 款软件对这部分人来说会是不错的选择。
|
||||
|
||||
_一些图片来源:上述软件所属公司_
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.debugpoint.com/2022/03/best-alternatives-microsoft-office-2022/
|
||||
|
||||
作者:[Arindam][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[aREversez](https://github.com/aREversez)
|
||||
校对:[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/lujun9972
|
||||
[1]: https://www.debugpoint.com/wp-content/uploads/2022/03/LibreOffice-1024x535.jpg
|
||||
[2]: https://www.libreoffice.org/discover/libreoffice/
|
||||
[3]: https://www.debugpoint.com/category/libreoffice/libreoffice-calc/
|
||||
[4]: https://www.libreoffice.org/download/libreoffice-in-business/
|
||||
[5]: https://www.libreoffice.org/download/download/
|
||||
[6]: https://help.libreoffice.org/latest/en-US/text/shared/05/new_help.html
|
||||
[7]: https://ask.libreoffice.org/
|
||||
[8]: https://www.debugpoint.com/wp-content/uploads/2022/03/Google-Docs.jpg
|
||||
[9]: https://www.google.com/docs/about/
|
||||
[10]: https://support.google.com/docs/?hl=en#topic=1382883
|
||||
[11]: https://www.debugpoint.com/wp-content/uploads/2022/03/OnlyOffice.jpg
|
||||
[12]: https://www.onlyoffice.com/
|
||||
[13]: https://www.debugpoint.com/2021/12/best-gnome-apps-part-1/
|
||||
[14]: https://www.onlyoffice.com/desktop.aspx
|
||||
[15]: https://forum.onlyoffice.com/
|
||||
[16]: https://www.debugpoint.com/wp-content/uploads/2022/03/FreeOffice.jpg
|
||||
[17]: https://www.freeoffice.com/en/
|
||||
[18]: https://www.freeoffice.com/en/download/applications
|
||||
[19]: https://forum.softmaker.com/
|
||||
[20]: https://www.debugpoint.com/wp-content/uploads/2022/03/WPS-Office-1024x499.jpg
|
||||
[21]: https://www.wps.com/
|
||||
[22]: https://www.wps.com/academy/
|
||||
[23]: https://www.wps.com/download/
|
||||
[24]: https://t.me/debugpoint
|
||||
[25]: https://twitter.com/DebugPoint
|
||||
[26]: https://www.youtube.com/c/debugpoint?sub_confirmation=1
|
||||
[27]: https://facebook.com/DebugPoint
|
@ -0,0 +1,61 @@
|
||||
[#]: subject: "The C4C Linux Distro Rises from the Grave"
|
||||
[#]: via: "https://news.itsfoss.com/c4c-linux-distro-revived/"
|
||||
[#]: author: "John Paul https://news.itsfoss.com/author/john/"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "lkxed"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14377-1.html"
|
||||
|
||||
复活的 C4C Linux 发行版
|
||||
======
|
||||
|
||||
> Computers4Christians 项目以定制发行版的形式进行了改革,该发行版为有基督教信仰的人提供了软件。
|
||||
|
||||
![](https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2022/03/c4c-disto-rises-from-the-grave.png?w=1200&ssl=1)
|
||||
|
||||
当我刚开始在这里写作时,我介绍了一个 [基督徒的 Linux 发行版][1],距离现在已经有 6 个年头了,让我们来速览一下这个项目在 6 年的时间里都有哪些变化吧。
|
||||
|
||||
### 名字变了,性质也变了
|
||||
|
||||
当我们第一次碰到 [Computers4Christians][2],他们是一个基督教团体,通过安装 Linux 系统来翻新旧电脑,并把它们捐赠给当地社区。他们大约捐赠了 1000 台翻新的旧电脑。该团体基于 Lubuntu 定制了自己的 Linux 版本,名字叫 “Computers4Christians Linux Project”。
|
||||
|
||||
今天,Computers4Christians 已经不再捐赠翻新的旧电脑了。取而代之的是,这三个开发者正在专注于开发重命名的 [C4C Ubuntu][3]。
|
||||
|
||||
当我问他们为什么决定要继续开发这个发行版时,他们回答说:
|
||||
|
||||
> 我们希望引导那些不信奉上帝的人与耶稣·基督建立真正的联系,并借此发展一些信徒。任何人都可以,在几乎任何电脑上,下载、运行临场镜像或者安装我们的 Linux 发行版。C4C Ubuntu 用户可以通过多个版本的圣经、基督教教义、每日灵修、基督教视频和游戏等方式聆听上帝的教诲。我们祈祷每一次的下载、运行和安装 C4C Ubuntu 镜像,都能帮助用户走向基督,或是更接近上帝。“向软弱的人,我就作软弱的人,为要得软弱的人;向甚么样的人,我就作甚么样的人。无论如何总要救些人。” —— 哥林多前书 9:22(网络)
|
||||
|
||||
### C4C Ubuntu 中都有什么?
|
||||
|
||||
当前版本的 C4C Ubuntu 基于最新的 Ubuntu LTS(20.04.4)构建。它使用 Xfce 桌面环境代替了 GNOME 桌面环境。我问他们为什么决定基于 Ubuntu 而不是 Lubuntu。开发者 Eric Bradshaw 告诉我说,他们之所以切换到 Ubuntu,是因为 Lubuntu 的 LXQt 桌面环境有缺陷,而且它在旧电脑上表现不佳。
|
||||
|
||||
以下是 C4C Ubuntu 预装的内容:
|
||||
|
||||
* 主要的常用软件:Catfish、FileZilla、GIMP、Gnash、GnuCash、Gufw、LibreOffice、OpenJDK Java 11、Pidgin、Pinta、Synaptic、Thunderbird 和 VLC。
|
||||
* 与基督教或圣经相关的软件和媒体:十二使徒问答和记忆游戏、圣经、圣经桌面版、8 个圣经知识游戏、10 个圣经经文迷宫探索游戏、Diatheke、117 个 Flash 圣经游戏、24 个有趣的圣经故事、Verse、Wide Margin、西福斯圣经指南、新信徒和门徒的阅读材料以及基督教视频。
|
||||
* 圣经:有声圣经(WEB)、AKJV、ASV、BBE、ERV、KJV、NHEB 和 WEB。注释:MHC、NETnotesfree、Personal 和 TFG。每日灵修:DBD 和 SME。词典:MLStrong、Robinson、StrongsGreek 和 StrongsHebrew。通用书籍:MollColossions 和 Pilgram。地图:ABSMaps、eBibleTeacherMaps、EpiphanyMaps、HistMidEast、KretzmannMaps、NETMaps、SmithBibleAtlas 和 SonLightFreeMaps。
|
||||
* 我们的背景图片包括 150 张不同的“<ruby>上帝的创造<rt>God's creation</rt></ruby>”,提供高清、标准和宽屏等尺寸大小。我们还提供快捷方式或启动器,你可以在“基督教”子菜单中找到它们,点击即可直达 37 个在线的基督教视频集、音乐视频集和 YouTube 频道。
|
||||
* 预装的 Firefox 上有数百个手工挑选和分类的书签,不管你是要学习 Linux 还是要了解上帝,你都可以找到相关书签。有一个叫 “FoxFilter” 的家长控制扩展可以帮助过滤掉网页上不适当的内容,用户如果觉得有用,可以订阅它。
|
||||
* C4C Ubuntu 团队引入了 [GNU Gnash 的 snap 包][4],它是一个 Flash 播放器。有了它,用户就可以玩预装的 Flash 圣经游戏了。
|
||||
|
||||
如果你想要尝试 C4C Ubuntu,你可以在 [这里][5] 找到下载链接。这个网站有很多关于他们的历史版本信息。同时,开发团队也在不断更新这个网站。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://news.itsfoss.com/c4c-linux-distro-revived/
|
||||
|
||||
作者:[John Paul][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://news.itsfoss.com/author/john/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://itsfoss.com/computers-christians-linux/
|
||||
[2]: https://computers4christians.org/
|
||||
[3]: https://computers4christians.org/C4C.html
|
||||
[4]: https://snapcraft.io/gnash-raymii
|
||||
[5]: https://computers4christians.org/Download.html
|
@ -0,0 +1,110 @@
|
||||
[#]: subject: "Gitter: A Cross-Platform Open Source Community Platform for Developers"
|
||||
[#]: via: "https://itsfoss.com/gitter/"
|
||||
[#]: author: "Ankush Das https://itsfoss.com/author/ankush/"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14397-1.html"
|
||||
|
||||
Gitter:面向开发者的跨平台开源社区平台
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202203/26/132222ldtjfcxvfz9kx5jv.jpg)
|
||||
|
||||
> 一个为开发者量身定做的跨平台开源解决方案。你可以建立或加入现有的社区来进行协作和互动。
|
||||
|
||||
几乎每个网络用户都知道 Slack、Rocket.Chat、Trello、[Nextcloud][1],以及其他一些用于工作沟通和协作的解决方案。
|
||||
|
||||
如果你喜欢用 FOSS 来进行团队协作,我们也有一个 [Slack 的开源替代品列表][2]。
|
||||
|
||||
但是,作为一个软件开发者,如果你偶然发现了一个开发者社区怎么办?
|
||||
|
||||
与 Reddit 或其他社交媒体上的社区不同,你可以进入一个开源平台,在那里,开发者们遇见并就重要的开源项目进行合作。这对于社交协作和同行之间的互动来说,不是很令人兴奋吗?
|
||||
|
||||
![][3]
|
||||
|
||||
[Gitter][10](现在是 [Element][4] 的一部分,也是一个协作/聊天应用)的目标就是这样。它是一个由开源技术驱动的社区平台([Matrix][5] 协议)。
|
||||
|
||||
### Gitter:使用开源技术连接的开发者社区
|
||||
|
||||
Gitter 是一个令人兴奋的聊天和网络平台,有助于建立或加入现有社区。它可用于 Linux、macOS 和 Windows。
|
||||
|
||||
![][6]
|
||||
|
||||
它是专门为开发者定制的,可以为他们各自的语言/项目,如 CSS、JavaScript、Bootstrap、NodeJS 等,进行合作/加入社区。
|
||||
|
||||
你也可以轻松地创建你的社区,而无需设置任何邀请服务。
|
||||
|
||||
![][7]
|
||||
|
||||
该平台的关键亮点是,社区是完全开放的,可被搜索引擎索引。对于社区中的对话历史,你不会被任何定价计划所锁定,你所需要查看的是归档。
|
||||
|
||||
而且,你在 Gitter 获得的功能还有很多。
|
||||
|
||||
### Gitter 的功能
|
||||
|
||||
虽然 Gitter 最初是为开发者定制的,但如果你认为它的功能符合你的要求,你可以用它来建立任何类型的社区。
|
||||
|
||||
![][8]
|
||||
|
||||
* 由一个去中心化的 Matrix 网络支持。
|
||||
* 可公开加入的社区。
|
||||
* 能够将你的社区限制在选定的用户中。
|
||||
* 深色模式主题。
|
||||
* 访问归档,轻松找到过去的对话。
|
||||
* 能够导出信息/房间信息。
|
||||
* 从你的网络中添加用户(例如,如果你使用 Twitter 登录,你可以选择从 Twitter 邀请用户到你的社区)。
|
||||
* 几个可用的集成(GitHub、Bitbucket、Trello、GitLab、Docker Hub、Discourse 等)。
|
||||
* 支持 GitHub 风格的 Markdown。
|
||||
* 在同一社区下创建更多的房间,以保持事情的条理性。
|
||||
* 轻松地分享/嵌入聊天室的链接。
|
||||
* 帖子系统,以保持对话的整齐。
|
||||
* 删除/报告信息的能力。
|
||||
|
||||
总之,Gitter 提供了适合不同社区的各种功能。
|
||||
|
||||
而且,通过 GitHub、GitLab 和其他一些网站的集成,它成为开发者和团队的一个完美的合作选择。
|
||||
|
||||
![][9]
|
||||
|
||||
### 在 Linux 中安装 Gitter.im
|
||||
|
||||
开发人员主要专注于网络应用。因此,如果你想避免在你的 Linux 桌面上安装任何东西,请前往 [Gitter.im][10] 并注册/登录以开始使用。
|
||||
|
||||
如果你想让它成为一个桌面应用,你可以从其官方网站下载 DEB 包,或者可选择 [Snap 包][11]和 [Flatpak 包][12]。
|
||||
|
||||
我在简短的测试中尝试了 Flatpak 包,它在 Ubuntu 20.04 LTS 上运行良好。你可以在你喜欢的任何一个 Linux 发行版上尝试 Flatpak/Snap。
|
||||
|
||||
你也可以在你的移动设备上使用它。不幸的是,官方的 Gitter 移动应用已经不再维护。但是,你可以使用 Element 应用来登录房间/社区,考虑到两者都是由同一个去中心化的网络(即Matrix)驱动的。
|
||||
|
||||
要了解更多信息,请浏览 [GitLab 页面][13]或前往其网站。
|
||||
|
||||
你试过 Gitter 吗?你对它有什么看法?它适合你这个开发者吗?你用它做什么?请在下面的评论中告诉我们你的想法。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/gitter/
|
||||
|
||||
作者:[Ankush Das][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://itsfoss.com/author/ankush/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://itsfoss.com/nextcloud/
|
||||
[2]: https://itsfoss.com/open-source-slack-alternative/
|
||||
[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2022/03/gitter-dark-mode.png?resize=800%2C536&ssl=1
|
||||
[4]: https://itsfoss.com/element/
|
||||
[5]: https://matrix.org/
|
||||
[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2022/03/gitter-light-mode.png?resize=800%2C536&ssl=1
|
||||
[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2022/03/gitter-communities.png?resize=800%2C398&ssl=1
|
||||
[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2022/03/gitter-add-friends.png?resize=800%2C468&ssl=1
|
||||
[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2022/03/gitter-integrations.png?resize=800%2C597&ssl=1
|
||||
[10]: https://gitter.im/
|
||||
[11]: https://snapcraft.io/gitter-desktop
|
||||
[12]: https://flathub.org/apps/details/im.gitter.Gitter
|
||||
[13]: https://gitlab.com/gitterHQ/desktop
|
@ -0,0 +1,83 @@
|
||||
[#]: subject: "Ubuntu has a ‘Weird Looking’ New Logo"
|
||||
[#]: via: "https://news.itsfoss.com/ubuntu-new-logo/"
|
||||
[#]: author: "Abhishek https://news.itsfoss.com/author/root/"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "lkxed"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14370-1.html"
|
||||
|
||||
Ubuntu 有了一个“怪怪的”新标志
|
||||
======
|
||||
|
||||
> Ubuntu 已经重新设计了它的标志。不是每个人都会喜欢它。
|
||||
|
||||
![](https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2022/03/ubuntu-unveils-new-logo.png?w=1200&ssl=1)
|
||||
|
||||
Ubuntu 的标志包含了多个元素。对粉丝来说,橙色和紫色是 Ubuntu 的特征。
|
||||
|
||||
除此之外,Ubuntu 的标志上还写有 “ubuntu” 的字样,以及一个橙色的图案。
|
||||
|
||||
![Ubuntu’s old logo][1]
|
||||
|
||||
这个橙色的“<ruby>朋友圈<rt>circle of friends</rt></ruby>”图案是 Ubuntu 的身份标识,它象征着:自由、协作、精确和可靠。
|
||||
|
||||
这个图案实际上是三个朋友或团队成员“搭在一起”的一个俯视图。你可能在体育运动中见到过这样的画面。
|
||||
|
||||
![Image courtesy: Unsplash][2]
|
||||
|
||||
### Ubuntu 有了一个全新的标志
|
||||
|
||||
但这个图案正在发生变化。[OMG! Ubuntu][3] 报道说,Canonical 重新设计了标志的元素、文字和这个“朋友圈”的图案。
|
||||
|
||||
在旧的标志中,“朋友圈”图案在粗体 “ubuntu” 文字的右上角。
|
||||
|
||||
新的标志改变了这一点。“朋友圈”图案经过重新设计,看起来更平滑,而且被放置在一个橙色的矩形里。文字也有变化,现在使用了更细的字体。“Ubuntu” 中的 “U” 现在是大写的了。
|
||||
|
||||
有趣的是,新标志不再包含注册商标符号 “®” 了。
|
||||
|
||||
![][4]
|
||||
|
||||
Ubuntu 在官方博文中提到了关于新设计的 [这些变化][5]:
|
||||
|
||||
> 虽然(在设计上)和之前的朋友圈图案保持相对延续性很重要,但是更新后的版本更精简、更专注、更成熟。现在他们的头部在圆圈里,彼此面对,连接也更加直接,这看起来更合理一些。
|
||||
|
||||
你可以在这个视频中看到新标志的动画:
|
||||
|
||||
[![][6]](https://img.linux.net.cn/static/video/Ubuntu%20new%20logo%20animation-9DHUyz54flA.mp4)
|
||||
|
||||
这个新标志将会出现在 Ubuntu 22.04 发行版中。
|
||||
|
||||
### 这不是首次重新设计标志
|
||||
|
||||
这并不是 Ubuntu 第一次重新设计它的标志。早在 Ubuntu 项目于 2004 年初创时,“朋友圈”图案有三种颜色:黄色、红色和橙色。在 2010 年的时候,它被重新设计,“搭在一起的人” 变成了白色,他们被一个橙色的圆圈围绕着。
|
||||
|
||||
![Image courtesy: OMG! Ubuntu][7]
|
||||
|
||||
### 你喜欢这个新标志吗?
|
||||
|
||||
这次的新设计距离上一次已经过了 13 年。这个新“朋友圈”图案看起来还不错,但我还是觉得这个矩形背景有点怪怪的。
|
||||
|
||||
你怎么看?你喜欢 Ubuntu 的新标志吗,还是说更喜欢以前的那个呢?请在下方评论区分享你的观点吧!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://news.itsfoss.com/ubuntu-new-logo/
|
||||
|
||||
作者:[Abhishek][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://news.itsfoss.com/author/root/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2022/03/ubuntu-old-logo.png?w=1294&ssl=1
|
||||
[2]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2022/03/huddle.jpg?w=800&ssl=1
|
||||
[3]: https://www.omgubuntu.co.uk/2022/03/ubuntu-has-a-brand-new-logo
|
||||
[4]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2022/03/new-ubuntu-logo.png?w=780&ssl=1
|
||||
[5]: https://ubuntu.com/blog/a-new-look-for-the-circle-of-friends
|
||||
[6]: https://i0.wp.com/i.ytimg.com/vi/9DHUyz54flA/hqdefault.jpg?w=780&ssl=1
|
||||
[6a]: https://youtu.be/9DHUyz54flA
|
||||
[7]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2022/03/ubuntu-logo-comparison.jpg?w=1200&ssl=1
|
@ -0,0 +1,153 @@
|
||||
[#]: subject: "Customize GNOME Desktop in Ubuntu with a Clean Look"
|
||||
[#]: via: "https://www.debugpoint.com/2022/03/customize-gnome-clean-look-2022-1/"
|
||||
[#]: author: "Arindam https://www.debugpoint.com/author/admin1/"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14393-1.html"
|
||||
|
||||
在 Ubuntu 中定制简洁的 GNOME 桌面
|
||||
======
|
||||
|
||||
> 本教程为你提供了一些简单的步骤来自定义 GNOME 桌面,用最少的努力打造干净的外观。下面如何做的。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202203/25/095452nw8pt6pxu9owwsks.jpg)
|
||||
|
||||
如果你对最喜欢的 GNOME 桌面的样子已经看厌烦了,那么你就来对了。让我们安装一些主题图标并进行一些调整以提升你的桌面格调。我们将转换如下桌面(GNOME 40.5 和 Ubuntu 21.10)。
|
||||
|
||||
![Ubuntu Desktop with GNOME – Before Customization][1]
|
||||
|
||||
这个定制教程将使用漂亮的 Colloid GTK 主题、Mkos-Big-Sur 图标、一个带有额外扩展的酷炫光标主题,以及 Conky。
|
||||
|
||||
### 自定义 GNOME 桌面,用简洁的外观提升它的形象
|
||||
|
||||
#### 安装
|
||||
|
||||
首先,通过在终端运行以下命令来设置 GNOME Shell 扩展。
|
||||
|
||||
```
|
||||
sudo apt install chrome-gnome-shell
|
||||
```
|
||||
|
||||
然后 [打开这个页面][2],将 GNOME 扩展的插件添加到你的浏览器(Chrome/Firefox)。
|
||||
|
||||
![Add Browser Add-on for GNOME Shell Extension][3]
|
||||
|
||||
安装“扩展”应用([Flatpak][4]),你可能需要它来改变 GNOME 扩展的设置。
|
||||
|
||||
之后,从终端使用以下命令安装 <ruby>GNOME 优化工具<rt>GNOME Tweaks</rt></ruby>。我们将使用这个工具来改变主题和其他设置。
|
||||
|
||||
```
|
||||
sudo apt install gnome-tweaks
|
||||
```
|
||||
|
||||
[下载 Colloid GTK 主题][5]。下载后解压文件。然后将解压后的文件夹复制到你主目录下的 `~/.themes`。如果文件夹不存在,请创建它。完成这些后,打开终端,运行 `install.sh` 文件。
|
||||
|
||||
[下载 Mkos-Big-Sur 图标主题][6]。下载完成后,解压文件并将父文件夹复制到你的主目录中的 `~/.icons`。
|
||||
|
||||
[下载 Vimix 光标主题][7],并按照上述步骤操作。将提取的文件夹复制到 `~/.icons` 目录中。然后打开一个终端,运行 `install.sh` 文件。
|
||||
|
||||
现在,安装 Conky 和一些扩展,这些扩展最终会给你的 GNOME 桌面一个干净的外观。要安装 Conky 和 Conky 管理器,打开终端提示符并运行以下命令。
|
||||
|
||||
```
|
||||
sudo apt install conky
|
||||
sudo add-apt-repository ppa:tomtomtom/conky-manager
|
||||
sudo apt update && sudo apt install conky-manager2
|
||||
```
|
||||
|
||||
现在,打开下面每个扩展的链接,依次安装它们。要安装时,打开页面,点击 ON/OFF 切换开关(见下图)。它将要求你提供管理员密码和安装许可。
|
||||
|
||||
* [Move Clock][8]
|
||||
* [Dash to Dock][9]
|
||||
* [Tray Icons][10]
|
||||
* [Arc Menu][11]
|
||||
* [User Themes][12]
|
||||
|
||||
![GNOME Extension – Page][13]
|
||||
|
||||
#### 配置
|
||||
|
||||
在你完成上述步骤后,做一些基本配置。你可能会看到在你安装上面的 GNOME 扩展时,有些变化已经生效了。例如,在安装上面的 Move Clock 扩展时,时钟应该已经被移到了右边。
|
||||
|
||||
##### 优化工具
|
||||
|
||||
打开<ruby>优化<rt>GNOME Tweaks</rt></ruby>工具(从应用菜单中搜索“Tweaks”),进入“<ruby>外观<rt>Apperance</rt></ruby>”。
|
||||
|
||||
将应用主题改为 “Colloid Dark”,光标主题为 “Vimix Cursors”,图标主题为 “Mkos-big-sur”,Shell 主题为 “Colloid Dark”。如果你愿意,你可以选择浅色主题和不同的选项。
|
||||
|
||||
![Apply Themes][15]
|
||||
|
||||
##### Arc 菜单
|
||||
|
||||
打开“<ruby>扩展<rt>Extension</rt></ruby>”应用,进入 <ruby>Arc 菜单设置<rt>Arc Menu Settings</rt></ruby>。
|
||||
|
||||
将菜单布局改为 “<ruby>替代菜单布局<rt>Alternative Menu Layout</rt></ruby> > Raven”。
|
||||
|
||||
将应用的菜单按钮改成你喜欢的一些图标。在本指南中,我从 [这里][16] 下载了一个 GNOME 图标。并通过 Arc 菜单的 “<ruby>设置<rt>Settings</rt></ruby> > <ruby>按钮外观<rt>Button Appearance</rt></ruby> > <ruby>浏览图标<rt>Browse Icon</rt></ruby>”应用它。它应该看起来像这样。
|
||||
|
||||
![Arc Menu – Raven][17]
|
||||
|
||||
从“<ruby>扩展<rt>Extension</rt></ruby>”程序中打开 “Dash to Dock” 设置。在“<ruby>外观<rt>Appearance</rt></ruby>”选项卡中,改变以下项目:
|
||||
|
||||
* 启用收缩到 Dash 的功能
|
||||
* 自定义窗口计数指示器为 Dash
|
||||
* 启用自定义 Dash 颜色
|
||||
* 自定义不透明度为固定
|
||||
* 不透明度为 12%
|
||||
|
||||
在位置和大小选项卡中,将停靠区位置改为底部,图标大小限制为 39px。
|
||||
|
||||
如果你喜欢,你可以启动 Conky,并下载一张与 Colloid 主题相配的漂亮墙纸。在这个演示中,我[选择了一张漂亮的灰色墙纸][18],它与深色主题搭配看起来非常漂亮。
|
||||
|
||||
### 结果
|
||||
|
||||
在所有的配置之后,如果一切顺利,你的桌面应该是这样的。
|
||||
|
||||
![GNOME Customization in Ubuntu with a simple look-1][19]
|
||||
|
||||
![GNOME Customization in Ubuntu with a simple look-2][20]
|
||||
|
||||
![GNOME Customization in Ubuntu with a simple look-3][21]
|
||||
|
||||
你可以通过多种设置组合来玩转这个主题的不同变体。并创造一个更适合你的外观。
|
||||
|
||||
我希望这个指南能帮助你把你的 GNOME 桌面改造成简洁的外观。如果你喜欢这个设置,请在下面的评论中告诉我。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.debugpoint.com/2022/03/customize-gnome-clean-look-2022-1/
|
||||
|
||||
作者:[Arindam][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://www.debugpoint.com/author/admin1/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://www.debugpoint.com/wp-content/uploads/2022/03/Ubuntu-Desktop-with-GNOME-Before-Customization-1024x582.jpg
|
||||
[2]: https://extensions.gnome.org/
|
||||
[3]: https://www.debugpoint.com/wp-content/uploads/2022/03/Add-Browser-Add-on-for-GNOME-Shell-Extension.jpg
|
||||
[4]: https://dl.flathub.org/repo/appstream/org.gnome.Extensions.flatpakref
|
||||
[5]: https://github.com/vinceliuice/Colloid-gtk-theme/archive/refs/heads/main.zip
|
||||
[6]: https://github.com/zayronxio/Mkos-Big-Sur/archive/refs/heads/master.zip
|
||||
[7]: https://github.com/vinceliuice/Vimix-cursors
|
||||
[8]: https://extensions.gnome.org/extension/2/move-clock/
|
||||
[9]: https://extensions.gnome.org/extension/307/dash-to-dock/
|
||||
[10]: https://extensions.gnome.org/extension/2890/tray-icons-reloaded/
|
||||
[11]: https://extensions.gnome.org/extension/3628/arcmenu/
|
||||
[12]: https://extensions.gnome.org/extension/19/user-themes/
|
||||
[13]: https://www.debugpoint.com/wp-content/uploads/2018/05/GNOME-Extension-Page.png
|
||||
[15]: https://www.debugpoint.com/wp-content/uploads/2022/03/Apply-Themes.jpg
|
||||
[16]: https://icons.iconarchive.com/icons/tatice/operating-systems/32/Gnome-icon.png
|
||||
[17]: https://www.debugpoint.com/wp-content/uploads/2022/03/Arch-Menu-Raven.jpg
|
||||
[18]: https://i.redd.it/1ttvv79apo851.png
|
||||
[19]: https://www.debugpoint.com/wp-content/uploads/2022/03/GNOME-Customization-in-Ubuntu-with-a-simple-look-1-1024x579.jpg
|
||||
[20]: https://www.debugpoint.com/wp-content/uploads/2022/03/GNOME-Customization-in-Ubuntu-with-a-simple-look-2-1024x580.jpg
|
||||
[21]: https://www.debugpoint.com/wp-content/uploads/2022/03/GNOME-Customization-in-Ubuntu-with-a-simple-look-3-1024x576.jpg
|
||||
[22]: https://t.me/debugpoint
|
||||
[23]: https://twitter.com/DebugPoint
|
||||
[24]: https://www.youtube.com/c/debugpoint?sub_confirmation=1
|
||||
[25]: https://facebook.com/DebugPoint
|
@ -0,0 +1,81 @@
|
||||
[#]: subject: "Build Your Own Handheld Linux PC with Raspberry Pi and this Open Source Project"
|
||||
[#]: via: "https://news.itsfoss.com/penkesu-handheld-linux-pc/"
|
||||
[#]: author: "John Paul https://news.itsfoss.com/author/john/"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14408-1.html"
|
||||
|
||||
用树莓派打造你的手持 Linux 电脑
|
||||
======
|
||||
|
||||
> Penkesu 电脑:一个自制的复古式手持 Linux 电脑。
|
||||
|
||||
![](https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2022/03/penkesu-handheld-linux-pc.jpg?w=1200&ssl=1)
|
||||
|
||||
你是否曾希望有一台适合你手持的、带有键盘的 Linux 笔记本电脑?如果是这样,那么你幸运了。一位硬件设计师创造了这样一个设备,并将其设计开源,让任何人都可以在家里制作它。
|
||||
|
||||
### 它是什么?
|
||||
|
||||
![][1]
|
||||
|
||||
Penkēsu 电脑(Penkēsu 是日语中“铅笔盒”的意思)是由 [Penk Chen][2] 设计的。如果这个名字听起来很熟悉,他就是 [CutiePi][3] 背后的设计师。
|
||||
|
||||
根据该网站称,Penk 创建这个项目是因为:
|
||||
|
||||
> 自从 CutiePi 平板电脑成功获得了资金并开始发货后,我觉得有必要干一个新的项目,一个我不需要太担心商业可行性、并提醒自己做手工的初衷的项目。可以说,这是一个“反弹”项目。
|
||||
|
||||
他还说,他目前没有任何大规模生产 Penkēsu 的计划,所以他把该规划开源了。“我想公布所有的设计和规划,这样就可以给任何有兴趣制作一个的人足够的信息。”
|
||||
|
||||
### 零件
|
||||
|
||||
![][5]
|
||||
|
||||
Penk 围绕一个 7.9 英寸的触摸屏和一个定制键盘设计了 Penkēsu。内部结构由树莓派 Zero 2 W 和锂聚合物电池供电。树莓派 Zero 2 W 有一个 1GHz 的 ARM 四核 ARM Cortex-A53 处理器和 512MB 的内存。花上 15 美元,这块树莓派应该可以运行大多数为它设计的 Linux 发行版。
|
||||
|
||||
有趣的是,Penk 说,“我的 3D 打印机不够精确,无法打印出一个功能齐全的铰链锁”。因此,他决定使用来自任天堂 GBA SP 的替换铰链。
|
||||
|
||||
看起来最困难的部分是键盘,这涉及到一个定制的 PCB。Penk 确实注意到,“如果希望使用其他 40% 键盘来制作,可以通过编辑 CAD 文件和调整机箱中的隔间大小来完成”。
|
||||
|
||||
以下是所需零件的完整清单:
|
||||
|
||||
* 显示器
|
||||
* 微雪 7.9 英寸电容式触摸屏
|
||||
* Adafruit DIY HDMI 电缆部件 - 直角适配器、Mini-HDMI 适配器和 20 厘米带状电缆
|
||||
* 外壳
|
||||
* GBA SP 替代铰链
|
||||
* 3D 打印部件(STL 文件和 STEP 文件)
|
||||
* 电子产品
|
||||
* 树莓派 Zero 2 W
|
||||
* 3.7V 606090(或类似尺寸)锂聚合物电池
|
||||
* Adafruit PowerBoost 1000C
|
||||
* 键盘
|
||||
* 凯华 Choc 矮轴 V1 x 48
|
||||
* MBK Choc 矮轴键帽 x 48
|
||||
* 1N4148 二极管 x 48
|
||||
* Arduino Pro Micro x 1
|
||||
* PCB x 1(gerber 文件和 QMK 固件)
|
||||
|
||||
详见 [网站][4] 的完整细节。
|
||||
|
||||
你用树莓派做了什么项目?请在下面的评论中分享。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://news.itsfoss.com/penkesu-handheld-linux-pc/
|
||||
|
||||
作者:[John Paul][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://news.itsfoss.com/author/john/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2022/03/penkesu.computer-31.jpg?w=1000&ssl=1
|
||||
[2]: https://github.com/penk
|
||||
[3]: https://itsfoss.com/cutiepi-open-source-tab/
|
||||
[4]: http://penkesu.computer/
|
||||
[5]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2022/03/penkesu.computer-parts.jpg?w=1000&ssl=1
|
@ -0,0 +1,134 @@
|
||||
[#]: subject: "Linux Kernel 5.17 Released. This is What’s New"
|
||||
[#]: via: "https://www.debugpoint.com/2022/03/linux-kernel-5-17/"
|
||||
[#]: author: "Arindam https://www.debugpoint.com/author/admin1/"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "wxy"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14384-1.html"
|
||||
|
||||
Linux 内核 5.17 发布及新变化
|
||||
======
|
||||
|
||||
> Linux 内核 5.17 已经发布,它具有更好的硬件支持和核心模块改进。下面是对新功能的简要介绍,并附有下载和安装细节。
|
||||
|
||||
![Linux 内核 5.17 带来了更多的硬件兼容性][1]
|
||||
|
||||
Linux Torvalds [宣发了][2] Linux 内核 5.17,这是 2022 年第二个稳定版主线内核。这个版本的内核模块中引入了对新处理器、显卡、存储和其他硬件组件的支持。
|
||||
|
||||
比内核 5.16 发布后的时间表稍有延迟,Linux 主线内核 5.17 现在可供下载了。这些更新包括对 AMD Zen 系列设备的温度支持;长期存在的软盘挂起错误,几个 ARM/SoC 支持以及各个子系统的性能改进。
|
||||
|
||||
我们已经在第一个候选版本发布时介绍了大部分变化,下面是对 Linux 内核 5.17 新特性的快速回顾。
|
||||
|
||||
### Linux 内核 5.17 的新内容
|
||||
|
||||
#### 处理器
|
||||
|
||||
Linux 内核中的 ARM64 架构现在包括了<ruby>内核并发净化器<rt>Kernel Concurrency Sanitizer</rt></ruby>(KCSAN)。KSCAN 是一个竞争条件检测器,已经支持了其他架构。而现在 ARM64 也在支持名单上了。另外,<ruby>可扩展矩阵扩展<rt>Scalable Matrix Extensions</rt></ruby>(SME)的初始工作有望为矩阵操作提供更好、更快的支持。
|
||||
|
||||
AMD [带来了][3] 基于 k10temp 的 CPU 温度监控,用于 AMD Zen 系列第 19 代 CPU 型号。
|
||||
|
||||
一组广泛的 Arm/SoC 支持 [进入了][4] Linux 内核 5.17 中。其中主要包括新的 Snapdragon 8 Gen 1 和 X65 平台。其他 SoC 包括恩智浦 i.MX8ULP、德州仪器 J721S2 和瑞萨 R-Car S4-8。
|
||||
|
||||
CPU 的重大变化之一是加入了 AMD 的 P-state 驱动,这是与 Valve 为 Steam Deck 合作开发的。这将提供更好的电源效率,因为透过 ACPI <ruby>协作处理器性能控制<rt>Collaborative Processor Performance Controls</rt></ruby>(CPPC)支持,可以更加细化的控制电源。
|
||||
|
||||
这个内核中另一个重要的 RISC-V 变化是支持 sv48,提供了 48 位虚拟地址空间。这使得内核可以对高达 128TB 的虚拟地址空间进行寻址。
|
||||
|
||||
这个版本带来了很多笔记本电脑、平板电脑的驱动更新。[这里][5] 有一个列表,主要内容是:
|
||||
|
||||
- 为华硕 ROG 笔记本电脑增加了自定义风扇曲线支持。
|
||||
- 增加了对<ruby>通用手写笔计划<rt>Universal Stylus Initiative</rt></ruby>(USI)和 NVIDIA Tegra 平板电脑的支持。
|
||||
- 对基于 AMD 的笔记本电脑的一些性能改进和修复,涉及到睡眠和声音驱动。
|
||||
|
||||
#### 显卡
|
||||
|
||||
英特尔的 Alder Lake P 显卡经过前一年的多次迭代,现在已经在主线内核上稳定了。这个内核引入了 [对 Raptor Lake S 显卡的首批支持补丁][6]。
|
||||
|
||||
英特尔的 Gen Icelake 显卡家族 [获得了][7] 可变刷新率/自适应同步支持。
|
||||
|
||||
一些较新的笔记本电脑带来了内置的隐私屏幕,预计更多的 OEM 厂商会效仿。另外,值得注意的是,GNOME 桌面和其他公司正计划在之后使用这一隐私功能。所以,为了这个以隐私为中心的功能,最初的架构和代码工作都已经包含在这个内核版本中了。
|
||||
|
||||
你可以在 [这里][9] 找到一个很好的显卡驱动更新列表。
|
||||
|
||||
#### 存储
|
||||
|
||||
在内核的每个版本中都会对所有主要的文件系统和存储技术进行增量更新。这个版本也会有一些:
|
||||
|
||||
* 主要的更新包括流行的 EXT4 文件系统使用新的 Linux 挂载 API。
|
||||
* 像往常一样,[F2FS][10]、[Btrfs][11] 和 [XFS][12] 的性能得到改善。
|
||||
* FS-Cache 和 CacheFiles 模块 [做了][13] 重大重写。
|
||||
|
||||
#### 杂项硬件更新
|
||||
|
||||
今天谁还在使用软盘?我相信仍然有一些特定的商业用例仍在使用软盘。所以,这就给我们带来了这个特定的补丁,在这个内核版本中。内核中存在一个长期的错误:当系统试图读取一个坏掉的软盘时可能会挂起。所以,这个老毛病终于在这个版本中得到了解决,我希望能让少数仍然使用这种古老存储介质的人为此驻足一下。
|
||||
|
||||
其他值得注意的杂项硬件更新包括:
|
||||
|
||||
* 任天堂 GameCube/Wii/Wii U 实时时钟 [驱动][14]。
|
||||
* 一个通用的 USB GNSS(<ruby>全球导航卫星系统<rt>Global Navigation Satellite System</rt></ruby>)驱动程序。
|
||||
* Cirrus CS35L41 高清音频编解码器 [驱动][15]。
|
||||
* 许多英特尔 Wi-Fi 驱动程序 [改进][16]。
|
||||
* 英特尔 Alder Lake N [音频][17] 支持。
|
||||
|
||||
### 如何下载和安装 Linux 内核 5.17
|
||||
|
||||
我们总是建议不要在你的稳定系统中安装最新的主线内核,除非你拥有特定的新硬件或想做实验。对于普通用户来说,最好是通过你的 Linux 发行版(如 Ubuntu、Fedora)的官方部署渠道等待内核的更新。
|
||||
|
||||
如果你仍然想安装,请按照下面的说明来安装 Linux 内核 5.17。
|
||||
|
||||
访问 [主线内核页面][18]。
|
||||
|
||||
有两种类型的构建可供选择:**通用**的和**低延迟**的。对于标准的系统,你可以下载通用的构建,大部分时间都可以工作。对于音频录制和其他需要低延迟的设置,请下载低延迟的。
|
||||
|
||||
通过终端下载以下四个通用软件包并安装:
|
||||
|
||||
```
|
||||
wget -c https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.17/amd64/linux-headers-5.17.0-051700-generic_5.17.0-051700.202203202130_amd64.deb
|
||||
wget -c https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.17/amd64/linux-headers-5.17.0-051700_5.17.0-051700.202203202130_all.deb
|
||||
wget -c https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.17/amd64/linux-image-unsigned-5.17.0-051700-generic_5.17.0-051700.202203202130_amd64.deb
|
||||
wget -c https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.17/amd64/linux-modules-5.17.0-051700-generic_5.17.0-051700.202203202130_amd64.deb
|
||||
```
|
||||
|
||||
安装完毕后,重新启动系统。
|
||||
|
||||
低延迟和其他架构(ARM)的安装指令是一样的。替换上述 `wget` 命令中的软件包名称。你可以在主线内核页面找到它们。
|
||||
|
||||
对于 Arch Linux 用户来说,预计 Linux 内核 5.17 发布包将在 2022 年 4 月第一周的 Arch .iso 月度刷新中到达。
|
||||
|
||||
随着这个版本的发布,合并窗口将为接下来 Linux 内核 5.18 打开。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.debugpoint.com/2022/03/linux-kernel-5-17/
|
||||
|
||||
作者:[Arindam][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.debugpoint.com/author/admin1/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://www.debugpoint.com/wp-content/uploads/2022/03/kernel517-1024x576.png
|
||||
[2]: https://lkml.org/lkml/2022/3/20/213
|
||||
[3]: https://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git/commit/?h=hwmon-next&id=6482dd78c00c6d604ac1c757fb2d8a2be2878654
|
||||
[4]: https://lore.kernel.org/linux-arm-kernel/CAK8P3a0RDZpLtWjMEU1QVWSjOoqRAH6QxQ+ZQnJc8LwaV7m+JQ@mail.gmail.com/
|
||||
[5]: https://lore.kernel.org/lkml/aea4c26b-25a1-9480-f780-7eb3502a4ce4@redhat.com/T/#u
|
||||
[6]: https://lore.kernel.org/dri-devel/87ee6f5h9u.fsf@intel.com/
|
||||
[7]: https://lists.freedesktop.org/archives/intel-gfx/2021-November/284109.html
|
||||
[8]: https://www.debugpoint.com/2022/01/linux-kernel-5-17-rc1/
|
||||
[9]: https://lists.freedesktop.org/archives/dri-devel/2022-January/336492.html
|
||||
[10]: https://lore.kernel.org/lkml/YedlHVEa4sdbvB2F@google.com/
|
||||
[11]: https://lore.kernel.org/lkml/cover.1641841093.git.dsterba@suse.com/
|
||||
[12]: https://lore.kernel.org/lkml/YdyxjTFaLWif6BCM@mit.edu/
|
||||
[13]: https://lore.kernel.org/lkml/510611.1641942444@warthog.procyon.org.uk/
|
||||
[14]: https://lore.kernel.org/lkml/Yen7oaDXAbd4tFOD@piout.net/
|
||||
[15]: https://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git/commit/?h=for-next&id=7b2f3eb492dac7665c75df067e4d8e4869589f4a
|
||||
[16]: https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git/commit/?id=bc11517bc8219314948780570ec92814d14d6602
|
||||
[17]: https://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git/commit/?h=for-next&id=4d5a628d96532607b2e01e507f951ab19a33fc12
|
||||
[18]: https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.17
|
||||
[19]: https://t.me/debugpoint
|
||||
[20]: https://twitter.com/DebugPoint
|
||||
[21]: https://www.youtube.com/c/debugpoint?sub_confirmation=1
|
||||
[22]: https://facebook.com/DebugPoint
|
@ -0,0 +1,131 @@
|
||||
[#]: subject: "Mabox Linux – Beautiful Arch Linux with Openbox [Review]"
|
||||
[#]: via: "https://www.debugpoint.com/2022/03/mabox-linux-2022/"
|
||||
[#]: author: "Arindam https://www.debugpoint.com/author/admin1/"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14416-1.html"
|
||||
|
||||
Mabox Linux:带有 Openbox 的美丽的 Arch Linux
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202203/31/101104lieqiqhq3sezqtih.jpg)
|
||||
|
||||
> Mabox Linux 是一个 Manjaro Linux 重制版,带有一个轻量级的 Openbox 窗口管理器,已经预配置了主题和实用程序。我们将在这篇文章中点评这个发行版。
|
||||
|
||||
如果你喜欢窗口管理器,也喜欢基于滚动发布的 Arch Linux,并且正在寻找一个具有这种组合的现成 Linux 发行版,可以试试 Mabox Linux。Mabox Linux 是建立在很棒的 Manjaro Linux 之上的,带有 Openbox 窗口管理器和一些原生实用程序。
|
||||
|
||||
由于采用了 Openbox,这个 Linux 发行版在维持超轻量级的资源消耗的同时,也提供了一个漂亮的桌面。改编自 BunsenLabs,并受 Crunchbang 启发的 Mabox Linux 工具也带来了他们的一些应用。
|
||||
|
||||
让我们来深入了解一下这个了不起的 Linux 发行版。
|
||||
|
||||
### Mabox Linux 点评
|
||||
|
||||
#### 安装和现场介质
|
||||
|
||||
Mabox .ISO 的优势之一是它在<ruby>现场介质<rt>Live medium</rt></ruby>启动过程中为你提供了自由和专有的驱动程序的两种选择。如果你的系统中有英伟达或其他硬件,这对你有帮助。
|
||||
|
||||
<ruby>现场桌面<rt>Live desktop</rt></ruby>让你可以通过 Calamares 安装程序来安装 Mabox。在标准硬件上,安装大约需要 3 到 4 分钟,在我的测试中没有遇到错误。
|
||||
|
||||
安装程序也会检测测试设备中的其他操作系统。
|
||||
|
||||
#### 具有自定义的外观和感受
|
||||
|
||||
Mabox 带来了一个预配置的 Openbox 窗口管理器。这个搭配的版本看起来不错,有深色外观和带面板的菜单。
|
||||
|
||||
顶部的面板是用 Tint2 构建的,分成两个部分。左边的面板为你提供了主菜单、文件管理器、网页浏览器的快捷方式。面板上的鼠标左键和右键有不同的菜单。右边的面板包含资源监视器、音量控制、截屏快捷方式和电源菜单。顶部面板不是连续的,在某些主题下,应用程序窗口会停留在顶部。
|
||||
|
||||
![Mabox Linux with Nord Theme][1]
|
||||
|
||||
在桌面的右边部分,预配置的 Conky 脚本可以给你提供系统信息,包括日期、时间、存储和其他显示。
|
||||
|
||||
欢迎窗口为你提供了关于设置、帮助和支持的快速启动快捷方式,并有文档链接。
|
||||
|
||||
窗口管理器适合于键盘操作,有时不便于用鼠标操作。但由于 Openbox 和预配置的 Mabox,你可以轻松地使用鼠标,同时通过灵巧的键盘快捷方式提高你的工作效率。
|
||||
|
||||
桌面上的右键菜单为你提供了轻松的搜索和启动选项。
|
||||
|
||||
![Search and Launch from desktop][2]
|
||||
|
||||
如果你不喜欢默认的外观,你可以通过 Openbox 和 Tint2 面板配置工具,只需点击几下就可以自行定制。
|
||||
|
||||
![Main Application Menu][3]
|
||||
|
||||
Mabox 预设有不同的主题,包括面板和 Concky 脚本。你可以点击并应用这些令人惊叹的 Mabox 主题。如果你不想陷入自己配置面板、颜色和 Conky 的麻烦中,这是一个很好的功能。
|
||||
|
||||
一套好的墙纸可以让你随时让它在短时间内看起来更加美妙。
|
||||
|
||||
![Mabox Themes][5]
|
||||
|
||||
#### 应用
|
||||
|
||||
Mabox Linux 将所有必要的应用打包在其安装镜像中。以下是所包含的基本应用的简单列表。
|
||||
|
||||
* Terminator 终端
|
||||
* Xpad 快速写字板
|
||||
* PCManFM 文件管理器
|
||||
* FSearch 桌面文件搜索
|
||||
* Flameshot 截图工具
|
||||
* Geany 文本编辑器
|
||||
* Audacious 音乐播放器
|
||||
* Firefox 网页浏览器
|
||||
|
||||
Mabox 还包括控制中心,以有效管理你的系统。Mabox 控制中心可以让你添加/删除应用、更新你的系统、启动窗口管理组件的几个配置窗口,诸如此类。
|
||||
|
||||
如果你找不到某个设置,你可以在 Mabox 控制中心通过其系统设置的逻辑分组轻松找到它们。
|
||||
|
||||
![Mabox Control Center][6]
|
||||
|
||||
#### 性能如何?
|
||||
|
||||
Mabox Linux 的性能令人印象非常深刻。由于采用了 Openbox 窗口管理器,Mabox 只用了大约 350MB 多点的内存,而 CPU 在空闲状态下徘徊在 2% 到 3%。
|
||||
|
||||
默认安装需要大约 5.39GB 的磁盘空间,这对于预装的这些应用和设置程序来说是不可思议的。
|
||||
|
||||
在如此优化下,以至于它消耗内存最多的应用是 Xorg,有 90MB。
|
||||
|
||||
所以,我想尝试一下重度使用下的性能。而这个性能也是令人惊讶的。我打开了一个文件管理器、带三个标签的 Firefox、一个用于开发的文本编辑器、一个终端窗口和控制中心。在这样的工作负荷下,Mabox 只消耗了大约 920MB 的内存和 6% 到 7% 的 CPU。
|
||||
|
||||
![Mabox Linux Heavy Workload Performance][7]
|
||||
|
||||
在 [点评几个发行版][8] 的过程中,这是我第一次发现一个发行版在重度工作负荷下不超过 1GB 内存的情况。但在不同的使用情况下,结果可能有所不同。无论如何,这个指标还是令人印象深刻。
|
||||
|
||||
### Mabox Linux 可以作为日常使用吗?
|
||||
|
||||
如果你对带有窗口管理器的 Arch Linux 比较熟悉和适应,你可以把 Mabox Linux 作为日常使用。有几个打包好的带有窗口管理器的 Arch Linux 发行版,而 Mabox 是其中最好的一个。
|
||||
|
||||
![Mabox Linux Windows 95 pre-configured theme][9]
|
||||
|
||||
### 总结
|
||||
|
||||
我认为 Mabox Linux 团队将所有组件与 Arch Linux 打包在一起,并呈现出一个漂亮的 Linux 发行版,做得非常好。它的外观惊艳,而消耗的系统资源却很少。有了基于 Arch Linux 的滚动发布功能,我认为你可以信赖这个发行版的长期使用。
|
||||
|
||||
你可以从它的 [官方网页][10] 下载 Mabox Linux。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.debugpoint.com/2022/03/mabox-linux-2022/
|
||||
|
||||
作者:[Arindam][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://www.debugpoint.com/author/admin1/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://www.debugpoint.com/wp-content/uploads/2022/03/Mabox-Linux-with-Nord-Theme-1024x581.jpg
|
||||
[2]: https://www.debugpoint.com/wp-content/uploads/2022/03/Search-and-Launch-from-desktop.jpg
|
||||
[3]: https://www.debugpoint.com/wp-content/uploads/2022/03/Main-Application-Menu.jpg
|
||||
[5]: https://www.debugpoint.com/wp-content/uploads/2022/03/Mabox-Themes.jpg
|
||||
[6]: https://www.debugpoint.com/wp-content/uploads/2022/03/Mabox-Control-Center.jpg
|
||||
[7]: https://www.debugpoint.com/wp-content/uploads/2022/03/Mabox-Linux-Heavy-Workload-Performance-1024x508.jpg
|
||||
[8]: https://www.debugpoint.com/tag/linux-distro-review
|
||||
[9]: https://www.debugpoint.com/wp-content/uploads/2022/03/Mabox-Linux-Windows-95-preconfigured-theme-1-1024x577.jpg
|
||||
[10]: https://maboxlinux.org/
|
||||
[11]: https://t.me/debugpoint
|
||||
[12]: https://twitter.com/DebugPoint
|
||||
[13]: https://www.youtube.com/c/debugpoint?sub_confirmation=1
|
||||
[14]: https://facebook.com/DebugPoint
|
@ -0,0 +1,107 @@
|
||||
[#]: subject: "Junction: An Application Switcher to Open Files and Links"
|
||||
[#]: via: "https://itsfoss.com/junction/"
|
||||
[#]: author: "Ankush Das https://itsfoss.com/author/ankush/"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14414-1.html"
|
||||
|
||||
Junction:一个可以打开文件和链接的应用切换器
|
||||
======
|
||||
|
||||
> 这是一个有趣的工具,可以轻松地访问文件或打开链接。让我们来了解一下。
|
||||
|
||||
对于那些涉足使用多个应用访问不同文件和使用各种浏览器打开链接的用户来说,其工作流程往往没那么多顺畅。
|
||||
|
||||
你可能已经习惯了,但这可能不是完成事情的最快方式。
|
||||
|
||||
认识一下 **Junction**,这是一个应用切换器,帮助你用最喜欢的应用快速打开文件/链接。
|
||||
|
||||
### Junction: 开源的 Linux 应用或浏览器切换器
|
||||
|
||||
![][1]
|
||||
|
||||
虽然我们可以在打开文件时使用右键菜单中的 “用……打开” 选项来选择某个应用,但这并不是最快的方法。
|
||||
|
||||
有了 [Junction][2],你不必寻找希望用什么程序打开该文件(或不断改变默认值),而只需将 “Junction” 应用设置为你的默认值。
|
||||
|
||||
这样,每当你打开一个链接或访问一个文件、启动电子邮件编辑器等,Junction 应用就会启动,向你显示你可能想要访问的相关应用。
|
||||
|
||||
此外,它还支持键盘导航,使其成为键盘高级用户的一个有益补充。
|
||||
|
||||
![][3]
|
||||
|
||||
基本上,每次你想在不同的应用中访问文件/链接时,它都能为你节省一些点击次数。
|
||||
|
||||
### Junction 的特点
|
||||
|
||||
![][4]
|
||||
|
||||
它是一个适合于特定用户群的简单工具。你可能觉得它是多余的,也可能不是,但在你想尝试的情况下,它的功能应该可以弥补它的不足:
|
||||
|
||||
* 通过启动器/切换器选择要打开的应用
|
||||
* 在启动前显示文件位置
|
||||
* 在打开 URL 之前能够编辑它
|
||||
* 提示不安全的链接
|
||||
* 键盘导航
|
||||
* 能够在切换器/启动器中添加更多的应用(它也会记住添加的内容,以便下次使用)
|
||||
|
||||
![][5]
|
||||
|
||||
### 使用 Junction 来访问文件和链接
|
||||
|
||||
要设置它,你需要启动应用并将 Junction 设置为 Web 的默认值,如下图所示。
|
||||
|
||||
![][6]
|
||||
|
||||
要在任何文件类型上使用它,你可以前往各自的文件属性,并为它改变默认的应用,如下图所示:
|
||||
|
||||
![][7]
|
||||
|
||||
对于链接,如上面的截图所示,你可以通过点击 “Test Junction” 来测试它。或者,你可以点击其他应用的任何链接,看看 Junction 应用的运行情况。
|
||||
|
||||
下面是你试图点击一个链接并让 Junction 帮助你选择时的情况:
|
||||
|
||||
![][8]
|
||||
|
||||
### 在 Linux 中安装 Junction
|
||||
|
||||
Junction 主要以 Flatpak 应用的形式提供。因此,你可以从 [Flathub][9] 安装软件包,或者在软件中心寻找它(如果 Flatpak 集成完毕)。
|
||||
|
||||
考虑到你已经设置了 [Flatpak][10],你可以输入以下命令来安装它:
|
||||
|
||||
```
|
||||
flatpak install flathub re.sonny.Junction
|
||||
```
|
||||
|
||||
你也可以查看它的 [GitHub 页面][11],了解更多的使用案例或利用它的技巧/窍门。
|
||||
|
||||
- [Junction][9]
|
||||
|
||||
你认为像 Junction 这样的应用切换器怎么样?它对你有用吗?请在下面的评论中告诉我你的想法,或简单的一句“谢谢”。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/junction/
|
||||
|
||||
作者:[Ankush Das][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://itsfoss.com/author/ankush/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2022/03/Junction-ft.png?resize=800%2C450&ssl=1
|
||||
[2]: https://apps.gnome.org/app/re.sonny.Junction/
|
||||
[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2022/03/junction-action-screenshot.jpg?resize=800%2C450&ssl=1
|
||||
[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2022/03/junction-app-screenshot.jpg?resize=800%2C455&ssl=1
|
||||
[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2022/03/junction-app-more.jpg?resize=800%2C540&ssl=1
|
||||
[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2022/03/junction-app.jpg?resize=800%2C586&ssl=1
|
||||
[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2022/03/junction-properties.png?resize=800%2C511&ssl=1
|
||||
[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2022/03/junction-link-click.jpg?resize=800%2C505&ssl=1
|
||||
[9]: https://flathub.org/apps/details/re.sonny.Junction
|
||||
[10]: https://itsfoss.com/flatpak-guide/
|
||||
[11]: https://github.com/sonnyp/Junction
|
@ -0,0 +1,73 @@
|
||||
[#]: subject: "Clear Linux is the First Distro to Offer GNOME 42"
|
||||
[#]: via: "https://news.itsfoss.com/clear-linux-gnome-42/"
|
||||
[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "lkxed"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14400-1.html"
|
||||
|
||||
Clear Linux 是首个提供 GNOME 42 的发行版
|
||||
======
|
||||
|
||||
> 击败了 Arch 和 Fedora,Clear Linux 的最新版本提供了 GNOME 42 的稳定版本。
|
||||
|
||||
![](https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2022/03/clear-linux-gnome-42.jpg?w=1200&ssl=1)
|
||||
|
||||
Clear Linux 是一个开源的滚动发布的发行版,它为云计算和边缘计算的开发者量身定制。
|
||||
|
||||
你可能不知道,Clear Linux 是一个<ruby>英特尔<rt>Intel</rt></ruby>的项目。它针对英特尔的处理器做了优化,并且提供了一个容器快速部署的环境。
|
||||
|
||||
它同时支持了桌面和服务器(AWS、Google Compute Engine 和 Azure Hyper-V 等)。
|
||||
|
||||
> **注意:** _与即将发布的 Fedora 36 工作站版和 Ubuntu 22.04 长期支持版相比,Clear Linux 算不上是一个完美的替代桌面。如果你对这个发行版感兴趣,我建议你先在虚拟机上尝试一下。_
|
||||
|
||||
令人惊讶的是,Clear Linux 的最新发布版看起来会包括 GNOME 42(稳定版)。
|
||||
|
||||
更不用提,Clear Linux 比 Arch 和 Fedora 更新地还要快,提供了最新的 GNOME 稳定发布版。
|
||||
|
||||
### Clear Linux 上的 GNOME 42
|
||||
|
||||
![][1]
|
||||
|
||||
你可以期待在 Clear Linux 上看到 [最好的 GNOME 42 特性][2]。
|
||||
|
||||
根据我的简单使用,其中大部分功能都符合你对 GNOME 42 的预期。
|
||||
|
||||
![][3]
|
||||
|
||||
文件管理器、日历、照片、天气以及许多其他应用程序都反映出,最新的 GNOME 42 版本升级到了 GTK 4。
|
||||
|
||||
当然,在 Clear Linux 上,默认的桌面壁纸会有些不同,但你可以获取到同一套壁纸集的浅色/深色不同版本。
|
||||
|
||||
![][4]
|
||||
|
||||
我在虚拟机上测试过,它的运行情况和预期的一致,没有显著的缺陷。
|
||||
|
||||
如果你已经在使用 Clear Linux 了,或者对它好奇,想要了解更多,你可以在它的 [版本发布说明][5] 中找到更多细节,包括更新的软件包和其他变化。
|
||||
|
||||
### 下载附带 GNOME 42 的 Clear Linux
|
||||
|
||||
或许你在它的官网下载页面找不到最新的发布版。但是,你可以在 [官方下载仓库][6] 中找到它。
|
||||
|
||||
你可以根据自身需求(服务器/桌面),下载到对应的 ISO 文件。现在就开始体验吧!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://news.itsfoss.com/clear-linux-gnome-42/
|
||||
|
||||
作者:[Ankush Das][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://news.itsfoss.com/author/ankush/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2022/03/clearlinux-gnome-42-home.jpg?w=1269&ssl=1
|
||||
[2]: https://news.itsfoss.com/gnome-42-features/
|
||||
[3]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2022/03/clearlinux-gnome-42.png?w=868&ssl=1
|
||||
[4]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2022/03/clear-linux-appearance.jpg?w=794&ssl=1
|
||||
[5]: https://download.clearlinux.org/releases/36060/clear/RELEASENOTES-36030-to-36060
|
||||
[6]: https://download.clearlinux.org/releases/36060/clear/
|
@ -0,0 +1,109 @@
|
||||
[#]: subject: "Xonsh Shell Combines the Best of Bash Shell and Python in Linux Terminal"
|
||||
[#]: via: "https://itsfoss.com/xonsh-shell/"
|
||||
[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "lkxed"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14390-1.html"
|
||||
|
||||
Xnosh Shell:在 Linux 终端结合 Bash Shell 和 Python 的最佳特性
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202203/24/111824ufw1815lyvclnsr2.jpg)
|
||||
|
||||
最受欢迎的 shell 是什么?我猜你会回答 bash 或者 zsh,没错,的确如此。
|
||||
|
||||
UNIX 和 Linux 系统上有许多可用的 shell,包括 Bash、Ksh、Zsh、Fish 等等。
|
||||
|
||||
最近,我碰到了另外一个 shell,它结合了 Python 和 bash,还蛮特别的。
|
||||
|
||||
### Xonsh shell,为喜爱 Python 的 Linux 用户而打造
|
||||
|
||||
[Xonsh][1] 是一个使用 Python 编写的跨平台 shell 语言和命令提示符。
|
||||
|
||||
它结合了 Python 和 Bash shell,因此你可以在这个 shell 中直接运行 Python 命令(语句)。你甚至可以把 Python 命令和 shell 命令混合起来使用。
|
||||
|
||||
![][2]
|
||||
|
||||
听起来不错吧?如果你是一个 Python 程序员的话,你应该会更加兴奋。
|
||||
|
||||
### 在 Linux 上安装 Xonsh shell
|
||||
|
||||
有多种方式可以在 Linux 系统上安装 Xonsh shell。
|
||||
|
||||
你可以使用软件包管理器安装它(主要的 Linux 发行版的仓库中都有 Xonsh shell)。
|
||||
|
||||
在 Ubuntu 和 Debian 上,你可以尝试运行:
|
||||
|
||||
```
|
||||
sudo apt install xonsh
|
||||
```
|
||||
|
||||
因为它本质上是一个 Python 应用,所以你总是可以使用 Pip 来安装(如果你的系统已经安装了的话)。或者,你也可以使用 Conda 来安装 Xonsh。同时,它还提供了 AppImage 格式和 Docker 镜像。
|
||||
|
||||
你可以自由选择你喜欢的安装方式。
|
||||
|
||||
### Xonsh shell 初体验
|
||||
|
||||
如果你不熟悉 Linux 的“多 shell”概念和终端的相关知识,我推荐你阅读 [我写的一篇终端入门的文章][3]。这篇文章会帮助 Linux 新手弄清楚很多东西。
|
||||
|
||||
我在这里简单介绍一下。你的终端运行着一个默认的 shell(通常是 bash shell)。如果你在系统上安装了其他的 shell,你可以 [轻松地切换这些 shell][4]。
|
||||
|
||||
要进入 Xonsh shell,只需运行一条命令:
|
||||
|
||||
```
|
||||
xonsh
|
||||
```
|
||||
|
||||
![][5]
|
||||
|
||||
它会建议你运行一个设置向导,然后创建一个 Xonsh shell 的自定义 `rc` 配置文件。这是可选的,你也可以晚些时候再做。
|
||||
|
||||
一旦你开始使用它,你就立刻会感觉到一些不同。
|
||||
|
||||
当你开始输入一条命令时,Xonsh 会自动建议历史记录中的最后一条匹配命令。你可以按下右箭头键确认使用这条自动建议的命令。你也可以按下上、下箭头键来选择历史记录中的其他匹配命令。
|
||||
|
||||
![Xonsh shell automatically suggests last matching command from the history as you type][6]
|
||||
|
||||
不仅如此,它还支持交互式的 Tab 补全。当你开始输入命令,并按下 `tab` 键,它会显示一个类似于下拉式的交互式菜单。你可以在这个菜单中选择可用的命令。
|
||||
|
||||
![Tab completion in Xonsh shell][7]
|
||||
|
||||
你可以混合使用 Python 和 bash 命令,并且直接在 shell 中运行它们。
|
||||
|
||||
如果你对 [终端定制][8] 感兴趣,你可以花点时间和精力,根据自己的喜好来定制 Tab 补全、按键绑定和颜色样式。
|
||||
|
||||
它同时拥有一个叫做 [Xontrib][9] 的用户自定义插件系统,你可以使用这些插件来扩展 Xonsh shell 的功能。
|
||||
|
||||
如果你是一个终端爱好者,并渴望学习更多终端知识,你可以浏览它的 [丰富的文档系统][10]。
|
||||
|
||||
### 最后
|
||||
|
||||
大多数用户坚持使用默认的 Bash shell,这很正常。有一些开发者和系统管理员会选择使用 Zsh,因为它有很多附加特性。而 Xonsh 完全聚焦在 Python 上,对于 Python 使用者来说,它或许具有吸引力。对于其余的人来说,Bash 已经足够好了。
|
||||
|
||||
你使用过 Xonsh 或者其他的 shell 吗?你用它来代替 Bash 的原因是什么呢?欢迎在评论区留言。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/xonsh-shell/
|
||||
|
||||
作者:[Abhishek Prakash][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/abhishek/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://xon.sh/
|
||||
[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2022/03/xonsh-shell-combines-python-bash.png?resize=800%2C470&ssl=1
|
||||
[3]: https://itsfoss.com/basic-terminal-tips-ubuntu/
|
||||
[4]: https://linuxhandbook.com/change-shell-linux/
|
||||
[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2022/03/xonsh-shell.png?resize=800%2C451&ssl=1
|
||||
[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2022/03/auto-suggestions-from-history-in-xonsh-shell.png?resize=800%2C258&ssl=1
|
||||
[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2022/03/tab-completion-xonsh-shell.png?resize=800%2C354&ssl=1
|
||||
[8]: https://itsfoss.com/customize-linux-terminal/
|
||||
[9]: https://github.com/topics/xontrib
|
||||
[10]: https://xon.sh/tutorial.html
|
@ -0,0 +1,157 @@
|
||||
[#]: subject: "7 Reasons to Try Open Source Secure Messenger ‘Threema’"
|
||||
[#]: via: "https://news.itsfoss.com/reasons-to-try-threema/"
|
||||
[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "lkxed"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14404-1.html"
|
||||
|
||||
尝试开源的安全通讯软件 Threema 的 7 个理由
|
||||
======
|
||||
|
||||
> Threema 是一个优质的开源通讯软件,专注于安全和隐私,提供了一个去中心的基础设施。
|
||||
|
||||
![](https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2022/03/threema.png?w=1200&ssl=1)
|
||||
|
||||
现在已经有很多私密的 WhatsApp 代替品可供我们选择,Threema 则是其中最好的可选项之一。
|
||||
|
||||
可是,为什么你要考虑尝试它呢?它是“终极的”安全通讯软件吗?
|
||||
|
||||
怎么说呢,每个安全通讯软件都只满足特定用户群体的需求。所以,把任何开源的通讯软件当作是“终极的”选项,都是不明智的。
|
||||
|
||||
因此,我列举了一些你或许会想尝试 Threema 而不是其他类似选项的理由。
|
||||
|
||||
### Threema:背景概览
|
||||
|
||||
在我开始说明为什么要尝试 [Threema][2] 这款私密通讯软件之前,请允许我再介绍一下它。
|
||||
|
||||
Threema 是一个流行的安全通讯软件,它由瑞士团队研发,专注于个人隐私。它也是一个付费软件,你需要在 [Play Store][3] 或者 [App Store][4] 上,一次性支付费用(大约 4 美元),才能够在你喜爱的移动设备上使用它。
|
||||
|
||||
起初,它是一个专有的安全通讯软件,是 [Signal][5] 等其他软件的竞争者。
|
||||
|
||||
在 2020 年的时候,Threema 决定在 [GitHub][6] 上开源它的所有软件。
|
||||
|
||||
你可以下载到移动应用,也可以得到 Linux 桌面(包括 Windows 和 macOS)上的支持。遗憾的是,它在桌面上目前没有独立的客户端。
|
||||
|
||||
因此,你需要让移动设备保持开启状态,才能使用桌面上的 Threema(就和 WhatsApp Web 的工作方式一样)。
|
||||
|
||||
### 下面是你尝试 Threema 的可能理由
|
||||
|
||||
如果你正在寻找一个隐私友好的安全通讯软件,并且你的同事/朋友/家人不介意支付一次性费用的话,你可以把它作为一个可选项。
|
||||
|
||||
支持你这么做的理由包括:
|
||||
|
||||
#### 1. 不需要手机号码
|
||||
|
||||
![][7]
|
||||
|
||||
和 WhatsApp 不同,你不需要使用手机号码来注册 Threema。当然,你可以选择添加你的手机号码,如果你希望别人能够很快找到你的话。
|
||||
|
||||
但是,手机号码只是注册 Threema 的一个选填项。如果你不想让别人知道你的手机号码,你可以使用注册时生成的 **Threema ID**(用户名)。
|
||||
|
||||
这样的话,如果你要和别人交流,你必须分享你的 Threema ID,而不是你的手机号码。
|
||||
|
||||
值得一提的是,即使在没有 SIM 卡的设备上,它也能完美工作,因为你不必提供手机号码就可以注册成功。
|
||||
|
||||
#### 2. 开源
|
||||
|
||||
虽然这是一个显而易见的理由,但它十分重要。
|
||||
|
||||
我非常重视这一点。如果你想要一个值得信赖的 WhatsApp 替代品,你应该倾向于选择一个开发稳定的开源通讯软件。
|
||||
|
||||
#### 3. 去中心化的基础设施
|
||||
|
||||
![][8]
|
||||
|
||||
和大多数主流产品不同,Threema 提供了一个去中心化的基础设施,以确保更好地抵御检查。
|
||||
|
||||
换句话说,Threema 并不依赖于一个中心服务器架构,也就不会发生“一个错误导致整个网络瘫痪”这种情况。
|
||||
|
||||
这个错误可能是一次停电,或者是一次检查/限制服务的行动。
|
||||
|
||||
在这些情况下,Threema 会是更有用和更有效的选择。
|
||||
|
||||
#### 4. 收费软件
|
||||
|
||||
它是一个收费软件(一次性付费),这也算是一个好消息吗?
|
||||
|
||||
对于某些人来说,是的。
|
||||
|
||||
如果你想要寻找一个几乎不可能有垃圾消息的通讯软件,而且你也不想让你的联系人找到你(或是给你发一些你不想要的信息),那么 Threema 就是你的一个完美选项。
|
||||
|
||||
毕竟,为一个出色的开源解决方案而付费是值得的,对吧?
|
||||
|
||||
#### 5. 可靠的用户界面和特性
|
||||
|
||||
![Credits: Threema][9]
|
||||
|
||||
Threema 不是一个新产品,它已经开发了好几年了。
|
||||
|
||||
因此,它能够提供稳定的用户体验,以及一些激动人心的特性,比如说它支持在群聊中发起投票。
|
||||
|
||||
你可以使用“同意/不同意”选项,以一种静默的方式确认接收方是否收到了消息,而不会触发一个发送给他们的通知。
|
||||
|
||||
注意,“同意/不同意”的功能只在个人会话中有效。
|
||||
|
||||
你也可以使用二维码来验证你的联系人身份,以此来避免<ruby>中间人<rt>man-in-the-middle</rt></ruby>攻击。
|
||||
|
||||
和其他的安全通讯软件相比,Threema 对平板电脑的支持也不错。
|
||||
|
||||
![Credits: Threema][10]
|
||||
|
||||
#### 6. 瑞士团队 & 遵守 GDRP 准则
|
||||
|
||||
你可能会在意,开发团队是否会受到所在国家的司法管辖权和隐私法等限制,那么对你而言,Threema 就是一个理想的私密通讯软件。
|
||||
|
||||
Threema 受瑞士的法律约束,而众所周知,瑞士的法律是最重视个人隐私的。
|
||||
|
||||
除此之外,Threema 还提到了它完全遵守 GDRP 准则。如果你在意这一点的话,Threema 是一个不错的选择。
|
||||
|
||||
#### 7. 在工作中使用 Threema
|
||||
|
||||
![][11]
|
||||
|
||||
有趣的是,Threema 还有另外一个 [独立的版本][11],专注于加强公司内部的通讯安全。
|
||||
|
||||
所以,如果你需要一个安全通讯平台来作为即时通讯软件的话,Threema 将是一个吸引人的选择。
|
||||
|
||||
- [试试 Threema][12]
|
||||
|
||||
### 最后,我的看法
|
||||
|
||||
我已经使用 Threema 很长时间了,我承认我在上面没有很多联系人。
|
||||
|
||||
但我还是要说,它的用户体验是极佳的,并且我在 iOS 和 Android 端都使用过相当长的时间。
|
||||
|
||||
因此,Threema 更适合那些不想对任何有关隐私的特性妥协的严肃用户。
|
||||
|
||||
与此同时,作为一款收费软件,并不是每个人都愿意尝试它。但仔细想想,你将会得到一个可靠的注重隐私的通讯软件,它还是开源的,并且会接受定期的审查。
|
||||
|
||||
你对这款软件有什么看法?请在评论区分享你的观点吧!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://news.itsfoss.com/reasons-to-try-threema/
|
||||
|
||||
作者:[Ankush Das][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://news.itsfoss.com/author/ankush/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://itsfoss.com/private-whatsapp-alternatives/
|
||||
[2]: https://threema.ch/en/home
|
||||
[3]: https://play.google.com/store/apps/details?id=ch.threema.app&hl=en_US&gl=US
|
||||
[4]: https://apps.apple.com/us/app/threema-the-secure-messenger/id578665578
|
||||
[5]: https://itsfoss.com/install-signal-ubuntu/
|
||||
[6]: https://github.com/threema-ch
|
||||
[7]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2022/03/threema-phone-number.jpg?w=1200&ssl=1
|
||||
[8]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2022/03/threema-decentralize-1.jpg?w=1200&ssl=1
|
||||
[9]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2022/03/threema-ui.jpg?w=1280&ssl=1
|
||||
[10]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2022/03/threema-tablet.jpg?w=1213&ssl=1
|
||||
[11]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2022/03/threema-work.png?w=1081&ssl=1
|
||||
[12]: https://threema.ch/en
|
@ -0,0 +1,120 @@
|
||||
[#]: subject: "GNOME 42 is Here With Dark Mode, New Screenshot UI, and More Exciting Features"
|
||||
[#]: via: "https://news.itsfoss.com/gnome-42-release/"
|
||||
[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "lkxed"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14392-1.html"
|
||||
|
||||
GNOME 42 发布:深色模式、新的截图界面
|
||||
======
|
||||
|
||||
> GNOME 42 终于到来了,它带来了急需的视觉升级和功能改进。
|
||||
|
||||
![](https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2022/03/gnome-42.jpg?w=1200&ssl=1)
|
||||
|
||||
[GNOME 42][17] 是一个有着显著视觉变化的重大升级。
|
||||
|
||||
GNOME 42 提供了许多必要的改进和急需的升级。现在它已经发布了,就让我们来看看一些关键的亮点吧。
|
||||
|
||||
### GNOME 42 新特性
|
||||
|
||||
鉴于我们已经写了一篇 [详细的文章来介绍 GNOME 42 的新特性][1],请允许我在这里挑选其中最重要的几个来介绍。
|
||||
|
||||
[![][2]](https://youtu.be/du-2QpWbiLU)
|
||||
|
||||
### 1. 深色模式主题和外观调整
|
||||
|
||||
![][3]
|
||||
|
||||
尽管其他的一些桌面环境已经有了系统级的深色样式偏好设置,然而 GNOME 此前并不支持该功能。
|
||||
|
||||
在 GNOME 42 中,GNOME 团队从 elementary OS 团队那里获得了灵感(这要归功于 [elementary OS 6][4] 出色的深色模式)。
|
||||
|
||||
你可以注意到,一个新的“<ruby>外观<rt>Appearance</rt></ruby>”选项取代了“<ruby>背景<rt>Background</rt></ruby>”选项,它可以让你在浅色/深色模式间无缝切换。
|
||||
|
||||
![][5]
|
||||
|
||||
桌面壁纸也有浅色/深色的不同版本,以便在你选择的对应模式时,为你提供最佳的对比度。
|
||||
|
||||
### 2. 更新的文件夹图标主题
|
||||
|
||||
GNOME 的文件夹图标主题看起来也太古老了。为了摆脱这种印象,它接收了一些视觉更新,以便在浅色/深色主题下看起来更棒:
|
||||
|
||||
![][6]
|
||||
|
||||
### 3. 新的截图界面
|
||||
|
||||
新的 GNOME 42 截图的界面是本次发布的最好的特性之一。
|
||||
|
||||
它不仅仅局限于截图,只要简单切换一下,你就可以用它来录制屏幕。它的用户界面看起来很棒,而且在我最初使用的 Fedora 36(预发布版)中工作良好。
|
||||
|
||||
![][7]
|
||||
|
||||
### 4. GNOME 应用升级到了 GTK 4
|
||||
|
||||
为了与 GNOME 42 的总体用户体验保持一致,得益于 [libadwaita][8],默认应用程序获得了彻底的视觉更新。
|
||||
|
||||
不仅限于用户界面,一些 GNOME 应用本身也获得了新特性。
|
||||
|
||||
甚至一些第三方的 GNOME 应用,比如 [Fragments 2.0][9],也有了重大改变,以便在 GNOME 42 中提供最佳体验。
|
||||
|
||||
### 5. 新的文本编辑器和控制台
|
||||
|
||||
![][10]
|
||||
|
||||
你会注意到,[现代的 GNOME 文本编辑器][11] 取代了广受欢迎的 Gedit,成为了默认的文本编辑器。
|
||||
|
||||
并且,你再也找不到 GNOME 终端应用了。取而代之的是,现在有了一个新的终端应用,它提供了一些用户界面的增强,名字叫做“<ruby>控制台<rt>Console</rt></ruby>”。
|
||||
|
||||
![][12]
|
||||
|
||||
### 其他改进
|
||||
|
||||
除了视觉变化,新版本的 GNOME 还进行了性能优化和整个平台的细微改进。其中包括了以下升级:
|
||||
|
||||
* 提升了文件检索效率
|
||||
* 远程桌面功能现在支持 RDP 协议了
|
||||
* GNOME 网页浏览器现在开启了硬件加速
|
||||
|
||||
你可以在 [官方声明][13] 中了解这个版本的所有变化。
|
||||
|
||||
### 下载 GNOME 42
|
||||
|
||||
你可以在 [GNOME OS][14] 上,通过 Boxes 虚拟机来测试 GNOME 42 最新的稳定构建版本,或者你可以下载 [OpenSUSE Tumbleweed][15](应该会在近期发布)。
|
||||
|
||||
尽管 [Intel 的 Clear Linux 似乎在它的最新版本中增加了 GNOME 42][16],但和 Ubuntu 22.04 长期支持版和 Fefora 36 相比,它并不是一个完美的替代桌面。
|
||||
|
||||
你也可以尝试附带 GNOME 42 的 Arch,或者等待下个月将发布的 Ubuntu 22.04 长期支持版和 Fedora 36.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://news.itsfoss.com/gnome-42-release/
|
||||
|
||||
作者:[Ankush Das][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://news.itsfoss.com/author/ankush/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://linux.cn/article-14267-1.html
|
||||
[2]: https://i0.wp.com/i.ytimg.com/vi/du-2QpWbiLU/hqdefault.jpg?w=780&ssl=1
|
||||
[3]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2022/03/fedora-36-gnome-42-dark.jpg?resize=1568%2C882&ssl=1
|
||||
[4]: https://news.itsfoss.com/elementary-os-6-features/
|
||||
[5]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2022/02/gnome-42-dark-mode-wallpaper.jpg?w=1200&ssl=1
|
||||
[6]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2022/02/gnome-42-file-manager-light.jpg?resize=1568%2C1017&ssl=1
|
||||
[7]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2022/02/gnome-42-screenshot.jpg?w=1340&ssl=1
|
||||
[8]: https://news.itsfoss.com/gnome-libadwaita-library/
|
||||
[9]: https://news.itsfoss.com/fragments-2-0-release/
|
||||
[10]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2022/02/gnome-42-text-editor-alpha.jpg?w=1480&ssl=1
|
||||
[11]: https://linux.cn/article-14060-1.html
|
||||
[12]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2022/03/console-screenshot-1.png?w=694&ssl=1
|
||||
[13]: https://release.gnome.org/42/
|
||||
[14]: https://itsfoss.com/gnome-os/
|
||||
[15]: https://get.opensuse.org/tumbleweed
|
||||
[16]: https://news.itsfoss.com/clear-linux-gnome-42/
|
||||
[17]: https://os.gnome.org/
|
@ -0,0 +1,233 @@
|
||||
[#]: subject: "Top 10 Linux Distributions for Programmers in 2022 [Featured]"
|
||||
[#]: via: "https://www.debugpoint.com/2022/03/top-linux-distributions-programmers-2022/"
|
||||
[#]: author: "Arindam https://www.debugpoint.com/author/admin1/"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "aREversez"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14547-1.html"
|
||||
|
||||
最适合程序员的 10 款 Linux 发行版
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202205/05/143612dml7eizi0vh170v7.jpg)
|
||||
|
||||
> 我们为程序员和开发人员总结了 2022 年最好用的 10 款 Linux 发行版,以便他们开展日常工作和个人项目。
|
||||
|
||||
由于工作和项目需要,程序员和开发人员会用到各种工具和应用,包括代码编辑器、编译器、插件以及数据库等等。若对现代开发人员的工作流程做一番整理,一般流程如下:
|
||||
|
||||
- 创建代码仓库
|
||||
- 编程
|
||||
- 调试
|
||||
- 测试
|
||||
- 部署
|
||||
|
||||
上述工作流程需要用到各种各样的工具,一份标准的工具清单如下:
|
||||
|
||||
- 代码编辑器
|
||||
- 简单的文本编辑器
|
||||
- 网页浏览器(包括 Web 开发人员使用的各种浏览器)
|
||||
- 数据库引擎
|
||||
- 本地服务器
|
||||
- 各类编程语言的编译器
|
||||
- 调试器
|
||||
- 监视或分析工具(客户端或者网页端)
|
||||
|
||||
与 Windows 相比,Linux 可以说是编程的最佳平台。之所以这样说,主要是因为 Linux 发行版与 Windows 不同,预装了许多功能强大的包和软件,自行安装也比较容易。在本文中,考虑到一些原因,我不会将 macOS 纳入对比范围之内。
|
||||
|
||||
综上,本文将整理出 2022 年最适合程序员的 10 款 Linux 发行版。
|
||||
|
||||
### 2022 最适合程序员的 10 款 Linux 发行版
|
||||
|
||||
#### 1、Fedora 工作站
|
||||
|
||||
![Fedora 35 Workstation][1]
|
||||
|
||||
在这 10 款 Linux 发行版当中,最优秀的可能就要数 Fedora Linux 了。Fedora 默认的工作站版本精选了一些软件包,为用户带来真正的 GNOME 桌面体验。
|
||||
|
||||
Fedora Linux 默认安装了开箱即用的主流开发软件包,包括 PHP、OpenJDK、PostgreSQL、Django、Ruby on Rails 以及 Ansible 等等。
|
||||
|
||||
dnf 是 Fedora Linux 的包管理器,有了它,安装代码编辑器以及其他软件就相当容易了。此外,你还可以使用“软件”应用商店一键搜索、安装软件。
|
||||
|
||||
Fedora Linux 支持 Snap 和 Flatpak,使用起来会更加灵活方便。你还可以使用 RPM Fusion 仓库,获取大量自由或非自由的软件。因为许可证等一些原因,Fedora Linux 不希望在其主仓库内包括这些包,于是就有了 RPM Fusion。
|
||||
|
||||
点击下方链接,了解 Fedora Linux 最新版本。
|
||||
|
||||
> **[下载 Fedora][2]**
|
||||
|
||||
#### 2、Ubuntu Linux
|
||||
|
||||
![Ubuntu Desktop is a perfect Linux Distribution for Programmers.][3]
|
||||
|
||||
在今天,无论是服务器还是个人电脑,使用最为广泛的发行版当属 Ubuntu Linux。Ubuntu 提供长期支持版本,每个长期支持版本官方提供五年的支持(外加五年的维护支持),并且每年为高级用户提供两个短期版本。
|
||||
|
||||
由于 Ubuntu 非常流行,各种包与软件的供应商都会提供适用于 Ubuntu 的版本(.deb)。此外,得益于广泛的知名度,Ubuntu 有着更为庞大的论坛群体和更为丰富的帮助文档。所以说,Ubuntu 是开发人员的最佳之选,尤其是在开发过程中陷入难题的时候,Ubuntu 更能发挥其作用。点击下方链接,了解更多。
|
||||
|
||||
> **[下载 Ubuntu][4]**
|
||||
|
||||
#### 3、openSUSE
|
||||
|
||||
openSUSE 是用在全球关键系统中最稳定、最专业的 Linux 发行版之一,是企业界(包括个人电脑、服务器以及瘦客户机)的首选解决方案。
|
||||
|
||||
相较于 Ubuntu 和 Fedora,openSUSE 具有一些独特的优势。首先,openSUSE 有两个版本:Leap 和 Tumbleweed。其中,openSUSE Leap 属于长期支持版,为用户带来稳定的升级体验。openSUSE Tumbleweed 属于滚动发行版,有着最新、最尖端的软件包。
|
||||
|
||||
如果你想获得最新的包和硬件支持,助力开发工作,你可以选择 openSUSE Tumbleweed;如果你想要的是稳定性,无需频繁维护即可长期运行,openSUSE Leap 会更适合你。
|
||||
|
||||
使用 openSUSE 进行开发工作,最大的优势之一就是 YaST 包管理工具。有了 YaST,许多操作可以轻松实现自动化。
|
||||
|
||||
此外,openSUSE 获取软件非常方便。它有专属的应用网站,供用户查找、安装包和软件。
|
||||
|
||||
如果你有一些 Linux 发行版的使用经验,推荐选择 openSUSE 进行开发工作。
|
||||
|
||||
> **[下载 openSUSE][5]**
|
||||
|
||||
#### 4、Manjaro Linux
|
||||
|
||||
Manjaro Linux 基于 Arch Linux,不过安装起来更容易一些。Manjaro Linux 自身还有许多独特功能,比如带有图形用户界面的安装程序、pamac 软件安装器以及高质量的软件仓库等等。Manjaro 有三个主要的桌面版本:GNOME、KDE Plasma 和 Xfce,足以满足各类用户的需要。
|
||||
|
||||
如果你想使用 Arch Linux 及其滚动发行的软件包来满足开发需求,但又不想在安装原版 Arch 上来回折腾,Manjaro 绝对是你的最佳选择。
|
||||
|
||||
> **[下载 Manjaro][6]**
|
||||
|
||||
#### 5、Arch Linux
|
||||
|
||||
尽管有 Manjaro 以及其他基于 Arch Linux 的发行版,而且安装操作非常简单,你可能还是想在自己的定制电脑上折腾一番,亲自动手 [安装原版 Arch][7]。
|
||||
|
||||
不过这种选择更适合程序员和开发人员,因为他们想得到更多的掌控权,或者想要定制一个 Linux 操作系统,用于开发项目或满足开发需求。这样一来,他们可能就会安装 Arch Linux,选择自己最喜欢的桌面,设置专用于开发工作的操作系统。
|
||||
|
||||
假设你对 Arch Linux 和普通的电脑都比较熟悉,那么 Arch Linux 就是你的最佳选择,因为在自己定制的 Linux 操作系统上,你可以完全控制每一个软件包。
|
||||
|
||||
> **[下载 Arch Linux][9]**
|
||||
|
||||
#### 6、Pop OS
|
||||
|
||||
Pop OS(即 Pop!_OS)由电脑制造商 System76 针对其系列硬件开发,是一款基于 Ubuntu 的自由开源的发行版。发行周期与 Ubuntu 保持同步,并为用户提供了额外的调整工具和软件包。
|
||||
|
||||
![Pop OS 21.10 Desktop][10]
|
||||
|
||||
Pop OS 基于 Ubuntu,默认支持多种程序语言,所以非常适合程序员使用。Pop OS 的软件中心非常出色,设有开发软件专区,深受计算机科学家和程序员青睐。
|
||||
|
||||
此外,Pop OS 的 COSMIC 桌面(GNOME 桌面的定制版)支持窗口自动平铺,具有柔美的调色板、默认的深色模式以及丰富的设置选项,给程序员带来独特的使用体验。
|
||||
|
||||
如果你既想要基于 Ubuntu,又想要适合程序员的稳定 Linux 发行版,推荐选择 Pop OS。
|
||||
|
||||
> **[下载 POP OS][11]**
|
||||
|
||||
#### 7、KDE Neon
|
||||
|
||||
作为一个程序员,如果你喜欢 KDE Plasma 桌面,又想使用基于 Qt 的开发环境,那么你应该选择 KDE Neon。
|
||||
|
||||
KDE Neon 基于 Ubuntu 长期支持版本,兼具最新的 KDE Plasma 桌面和 KDE 框架。因此,使用 KDE Neon,你不仅可以享受 Ubuntu 长期支持版本的稳定性,还能体验基于 Qt 的最新版 KDE 软件。
|
||||
|
||||
运行速度快,程序开箱即用,用户界面友好,广泛的社区支持,如你所愿,完美如斯。
|
||||
|
||||
> **[下载 KDE Neon][12]**
|
||||
|
||||
#### 8、Debian
|
||||
|
||||
Debian GUN/Linux 就无需过多介绍了。Debian 的稳定分支是 Ubuntu 及其衍生系统的基础。换句话说,Debian 是最主要、最稳定的 Linux 发行版之一。优秀的稳定性和较长的支持时间使得 Debian 非常适合用做开发环境。
|
||||
|
||||
不过,Debian 的稳定分支比较保守,很少使用最新的软件包。毕竟全世界(几乎)都依赖 Debian 的稳定运行,所以维护者在检查、合并软件包时必须十分谨慎。
|
||||
|
||||
Debian 不仅能够长期稳定运行,而且维护成本较低,是高级用户和系统管理员绝佳的编程环境。
|
||||
|
||||
> **[下载 Debian Linux][13]**
|
||||
|
||||
#### 9、Kali Linux
|
||||
|
||||
Kali Linux 由 Offensive Security 开发,服务对象为道德黑客和查找网络漏洞的渗透测试人员,内置大量黑客软件和工具。
|
||||
|
||||
对技术娴熟的程序员和开发人员来说,Kali Linux 堪称最佳之选。如果你精通 Linux,具备解决错误和依赖问题的经验,推荐选择 Kali Linux。
|
||||
|
||||
> **[下载 Kali Linux][14]**
|
||||
|
||||
#### 10、Fedora Labs
|
||||
|
||||
最后,我们来看看 Fedora Linux 的各种 Fedora Labs 版本。
|
||||
|
||||
Fedora Labs 为程序员、科学家、学生等各类人群提供各类专业化的 Linux 发行版,内置各类专业软件、包和工具。很多人并没有意识到 Fedora Labs 的优势,只要经过适当的配置,这些版本都是非常优秀的发行版。
|
||||
|
||||
我们来总结一下这些 Fedora Labs:
|
||||
|
||||
Fedora Scientific:
|
||||
|
||||
* 采用 KDE Plasma 桌面,集成科学和数学领域的各种开源工具
|
||||
* 软件清单如下:
|
||||
* 基于 C/C++ 的 GNU Scientific Library
|
||||
* 兼容 MATLAB 的 MGNU Octave
|
||||
* LaTeX
|
||||
* Gnuplot:用于绘制 2D 与 3D 图像
|
||||
* Pandas:用于数据处理的 Python 库
|
||||
* IPython
|
||||
* Java 和 R 程序语言相关包
|
||||
|
||||
> **[下载 Fedora Scientific][15]**
|
||||
|
||||
Fedora COMP NEURO:
|
||||
|
||||
* 采用 GNOME 桌面环境,预装神经科学领域的各种开源包和应用。
|
||||
|
||||
> **[下载 Comp Neuro][25]**
|
||||
|
||||
Fedora Robotics Suite:
|
||||
|
||||
* 集成各种开源机器人技术包和软件,适合初学者、资深计算机科学家和编程人员。
|
||||
|
||||
> **[下载 Fedora Robotics][16]**
|
||||
|
||||
除了上述版本,还有 [Fedora Security Labs][17]、[Fedora Astronomy][18] 和 [Fedora Python Classroom][19] 可供选择。
|
||||
|
||||
在编程项目以及科学领域,Fedora Labs 堪称完美之选。
|
||||
|
||||
### 总结
|
||||
|
||||
那么,怎样才能从以上 10 款 最适合程序员的 Linux 发行版中选出自己最喜欢的呢?
|
||||
|
||||
如果你想要一款开发系统,但又不想耗费太多精力,拿不定主意的话,推荐使用 Fedora 工作站或者 Ubuntu。
|
||||
|
||||
如果你的空闲时间比较多或者想要进一步掌控自己的系统,乐于尝试并且能够忍受偶尔发生的错误,推荐选择基于 Arch Linux 的系统。
|
||||
|
||||
对于刚接触 Linux 生态的新手程序员来说,Pop OS 也是一个不错的选择。如果有特殊需要的话,可以试试 Fedora Labs。
|
||||
|
||||
我希望本文能帮助程序员和开发人员选出最喜欢的 Linux 发行版。
|
||||
|
||||
祝你好运!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.debugpoint.com/2022/03/top-linux-distributions-programmers-2022/
|
||||
|
||||
作者:[Arindam][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[aREversez](https://github.com/aREversez)
|
||||
校对:[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/lujun9972
|
||||
[1]: https://www.debugpoint.com/wp-content/uploads/2021/11/Fedora-35-Workstation-1024x528.jpg
|
||||
[2]: https://getfedora.org/
|
||||
[3]: https://www.debugpoint.com/wp-content/uploads/2022/03/Ubuntu-Desktop-is-a-perfect-Linux-Distribution-for-Programmers-1024x579.jpg
|
||||
[4]: https://ubuntu.com/download
|
||||
[5]: https://www.opensuse.org/
|
||||
[6]: https://manjaro.org/download/
|
||||
[7]: https://www.debugpoint.com/2022/01/archinstall-guide/
|
||||
[8]: https://www.debugpoint.com/2022/03/top-nitrux-maui-applications/
|
||||
[9]: https://archlinux.org/download/
|
||||
[10]: https://www.debugpoint.com/wp-content/uploads/2021/12/Pop-OS-21.10-Desktop-1024x579.jpg
|
||||
[11]: https://pop.system76.com/
|
||||
[12]: https://neon.kde.org/download
|
||||
[13]: https://www.debian.org/distrib/
|
||||
[14]: https://www.kali.org/
|
||||
[15]: https://labs.fedoraproject.org/en/scientific/
|
||||
[16]: https://labs.fedoraproject.org/en/robotics/
|
||||
[17]: https://labs.fedoraproject.org/en/security
|
||||
[18]: https://labs.fedoraproject.org/en/astronomy
|
||||
[19]: https://labs.fedoraproject.org/en/python-classroom
|
||||
[20]: https://t.me/debugpoint
|
||||
[21]: https://twitter.com/DebugPoint
|
||||
[22]: https://www.youtube.com/c/debugpoint?sub_confirmation=1
|
||||
[23]: https://facebook.com/DebugPoint
|
||||
[24]: https://www.debugpoint.com/2022/03/top-nitrux-maui-applications/
|
||||
[25]: https://labs.fedoraproject.org/en/comp-neuro/
|
@ -0,0 +1,107 @@
|
||||
[#]: subject: "Gitbase: Exploring Git repos with SQL"
|
||||
[#]: via: "https://opensource.com/article/18/11/gitbase"
|
||||
[#]: author: "Francesc Campoy https://opensource.com/users/francesc/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "lkxed"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14470-1.html"
|
||||
|
||||
Gitbase:使用 SQL 探索 Git 仓库
|
||||
======
|
||||
|
||||
> Gitbase 是一个由 Go 驱动的开源项目,它使得我们可以在 Git 仓库上运行 SQL 查询。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202204/13/230413ddcpm87p2bds18db.jpg)
|
||||
|
||||
Git 已经成为了代码版本控制的事实标准。虽然 Git 已经很流行了,但想用它来对源代码仓库的历史和内容进行深度分析,仍然是一件复杂的事情。
|
||||
|
||||
另一方面,SQL 则是一个经过实际检验、适合查询大型代码库的的语言,毕竟 Spark 和 BigQuery 等项目都采用了 SQL 作为查询语言。
|
||||
|
||||
因此,在 source{d} 公司,我们顺理成章地结合了这两种技术来创建了 Gitbase:这是一个用 SQL 对 Git 仓库进行大规模分析的“代码即数据”解决方案。
|
||||
|
||||
[Gitbase][2] 是一个完全开源的项目,它站在一系列巨人的肩膀上,是它们使 Gitbase 的发展成为可能。本文旨在指出其中的主要部分。
|
||||
|
||||
![][3]
|
||||
|
||||
*[Gitbase 试验场][4] 提供了一种使用 Gitbase 的可视化方式。*
|
||||
|
||||
### 使用 Vitess 解析 SQL
|
||||
|
||||
Gitbase 将 SQL 作为用户接口。这意味着我们需要解析基于 MySQL 协议传输的 SQL 请求,并理解它们。幸运的是,我们在 YouTube 的朋友和他们的 [Vitess][5] 项目已经实现了这一点。Vitess 是一个数据库集群系统,用于 MySQL 的水平扩展。
|
||||
|
||||
我们直接截取一些重要的代码片段,并把它做成了一个 [开源项目][6]。这个项目允许任何人在几分钟内编写一个 MySQL 服务器(正如我在 [justforfunc][7] 的专题:[CSVQL - 用 SQL 处理 CSV][8] 中所展示的那样)。
|
||||
|
||||
### 用 go-git 读取 Git 储存库
|
||||
|
||||
当成功解析了一个请求,我们还需要读取数据集里的 Git 仓库,才能够知道该如何回复它。为此,我们集成了 source{d} 最成功的仓库 [go-git][9]。go-git 是一个高度可扩展的纯 Go 语言的 Git 实现。
|
||||
|
||||
这使得我们能够轻松地分析以 [siva][10] 文件格式存储在磁盘上的源代码仓库(siva 也是一个 source{d} 的开源项目),或是直接使用 `git clone` 克隆的仓库。
|
||||
|
||||
### 使用 Enry 检测编程语言,使用 Babelfish 解析文件
|
||||
|
||||
Gitbase 并没有将其分析能力局限于 Git 历史记录上。它还使用(显然也是)我们的开源项目 [Enry][11] 集成了语言检测功能,并使用 [Babelfish][12] 实现了程序解析的功能。Babelfish 是一个用于通用源代码解析的自托管服务器,它可以将代码文件转化为<ruby>通用抽象语法树<rt>Universal Abstract Syntax Trees</rt></ruby>(UAST)。
|
||||
|
||||
这两个功能在 Gitbase 中呈现为用户函数 `LANGUAGE` 和 `UAST`。结合使用两个函数,许多查询请求都成为了可能,比如“找到上个月修改次数最多的函数名称”。
|
||||
|
||||
### 让它快速运行
|
||||
|
||||
Gitbase 经常要分析非常大的数据集,比如公共 Git 档案,其中有来自 GitHub 的 3TB 源代码(见 [公告][13])。为了做到这一点,每份 CPU 处理能力都很重要。
|
||||
|
||||
这就是为什么我们又集成了另外两个项目:Rubex 和 Pilosa。
|
||||
|
||||
### 使用 Rubex 和 Oniguruma 加快正则表达式的速度
|
||||
|
||||
[Rubex][14] 是 Go 的 `regexp` 标准库包的一个准替代品。之所以还不能完成替代,是因为他们没有在 `regexp.Regexp` 类型上实现 `LiteralPrefix` 方法,不过我也是直到现在才听说这个方法。
|
||||
|
||||
Rubex 的高性能得归功于高度优化的 C 语言库 [Oniguruma][15],它使用 [cgo][16] 来调用这个库。
|
||||
|
||||
### 使用 Pilosa 索引加快查询速度
|
||||
|
||||
索引基本上是每个关系型数据库的众所周知的特性,但 Vitess 却没有实现索引,因为它不是真正需要。
|
||||
|
||||
还好开源的 [Pilosa][17] 再一次拯救了我们,它是一个用 Go 实现的分布式位图索引,使得 Gitbase 可以用于大规模的数据集。Pilosa 是开源的,它极大地加快了对多个海量数据集的查询。
|
||||
|
||||
### 总结
|
||||
|
||||
我想通过这篇博文,亲自感谢开源社区,是他们让我们在如此短的时间内创建了 Gitbase,这是谁也没想到的。在 source{d} 公司,我们是开源的坚定信仰者,`github.com/src-d` 下的每一行代码(包括我们的 OKR 和投资者委员会)都可以证明这一点。
|
||||
|
||||
你想尝试一下 Gitbase 吗?最快、最简单的方法就是使用 source{d} 引擎。从 `sourced.tech/engine` 下载它,只需一个命令就能让 Gitbase 运行起来。
|
||||
|
||||
想了解更多吗?请查看我在 [Go SF meetup][18] 的演讲录音。
|
||||
|
||||
这篇文章 [最初发表在][20] Medium 上,经授权后在此重新发布。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/18/11/gitbase
|
||||
|
||||
作者:[Francesc Campoy][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/francesc/
|
||||
[b]: https://github.com/lkxed/
|
||||
[1]: https://opensource.com/sites/default/files/lead-images/bus_cloud_database.png
|
||||
[2]: https://github.com/src-d/gitbase
|
||||
[3]: https://opensource.com/sites/default/files/uploads/gitbase.png
|
||||
[4]: https://github.com/src-d/gitbase-web
|
||||
[5]: https://github.com/vitessio/vitess
|
||||
[6]: https://github.com/src-d/go-mysql-server
|
||||
[7]: http://justforfunc.com/
|
||||
[8]: https://youtu.be/bcRDXAraprk
|
||||
[9]: https://github.com/src-d/go-git
|
||||
[10]: https://github.com/src-d/siva
|
||||
[11]: https://github.com/src-d/enry
|
||||
[12]: https://github.com/bblfsh/bblfshd
|
||||
[13]: https://blog.sourced.tech/post/announcing-pga/
|
||||
[14]: https://github.com/moovweb/rubex
|
||||
[15]: https://github.com/kkos/oniguruma
|
||||
[16]: https://golang.org/cmd/cgo/
|
||||
[17]: https://github.com/pilosa/pilosa
|
||||
[18]: https://www.meetup.com/golangsf/events/251690574/
|
||||
[19]: https://youtu.be/OXL2KxOTmBQ
|
||||
[20]: https://medium.com/sourcedtech/gitbase-exploring-git-repos-with-sql-95ec0986386c
|
@ -0,0 +1,83 @@
|
||||
[#]: subject: "How do you contribute to open source without code?"
|
||||
[#]: via: "https://opensource.com/article/19/4/contribute-without-code"
|
||||
[#]: author: "Chris Hermansen https://opensource.com/users/clhermansen"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "lkxed"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14514-1.html"
|
||||
|
||||
如何以非代码形式贡献开源
|
||||
======
|
||||
|
||||
> 事实上,有无穷无尽的方法来为开源做贡献,其中一个简单的方法就是回答我们的投票问题。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202204/26/190136sd2nmv19m5vn905m.jpg)
|
||||
|
||||
你是如何参与开源贡献的呢?我们组织了一个投票,结果如下:
|
||||
|
||||
* 提交错误报告 - 67 票(35%)
|
||||
* 解答用户的问题 - 39 票(20%)
|
||||
* 写作(指南、故事、文档等) - 73 票(38%)
|
||||
* 其他 - 12 票(6%)
|
||||
|
||||
我的第一次开源贡献可以追溯到 20 世纪 80 年代中期,当时我们的机构第一次连上了 [UseNet][2],在那里我们发现了贡献代码,以及在其开发和支持过程中和别人分享的机会。
|
||||
|
||||
在今天,我们有无尽的贡献开源的机会。无论是贡献代码,还是制作一个视频教程,都是贡献的一种途径。
|
||||
|
||||
不过,我将直接跳过整个贡献代码的部分。诚然,我们中有许多写代码但不认为自己是开发者的人,他们也可以 [贡献代码][3]。但是,我更想提醒大家,还存在很多 [非代码形式可以贡献开源][4]。接下来,我会谈到其中的三种。
|
||||
|
||||
### 提交错误报告
|
||||
|
||||
有一种重要而具体的贡献形式,它可以被描述为“不要畏惧 [提交一个像样的错误报告][6]”以及 [与此相关的所有后果][5]。有时,要 [提交一个像样的错误报告][6] 是很有挑战性的。比如说:
|
||||
|
||||
* 某些错误可能很难记录或描述。当计算机启动时,屏幕上可能会出现又长又复杂的信息,其中包含各种不能理解的代码。或者屏幕上可能显示有一些“异常行为”,但是却没有提供具体的错误信息。
|
||||
* 某些错误可能很难重现。它可能只发生在某些特定的硬件/软件配置上,或者它可能很少被触发,或者错误的产生场景不明确。
|
||||
* 某些错误可能与一个非常特殊的开发环境配置有关,但是这个配置庞杂混乱,无法分享,需要先耗费大量精力创建一个精简后的例子才行。
|
||||
* 当向发行版报告一个错误时,维护者可能会建议将该错误提交给上游,这有时会需要付出大量的工作,因为发行版所提供的版本不是上游社区感兴趣的主要版本。(当发行版提供的版本落后于官方支持的发布和开发版本时,就会有这种情况发生)。
|
||||
|
||||
尽管如此,我还是鼓励那些潜在的错误报告者(包括我)继续努力,并尝试让错误得到完整的记录和确认。
|
||||
|
||||
但如何开始呢?你可以使用你最喜欢的搜索工具寻找类似的错误报告,看看它们是如何描述的,它们被归档在哪里,等等。你也可以留意你使用的发行版(例如,[Fedora][7]、[openSUSE][8]、[Ubuntu][9])或软件包([LibreOffice][10]、[Mozilla][11])的错误报告页面,它们定义了正式的报告机制,你可以按步骤为他们报告相关错误。
|
||||
|
||||
### 解答用户的问题
|
||||
|
||||
我潜伏在各种邮件列表和 [论坛][13] 里,偶尔也会冒个泡,例如 [Ubuntu 质量控制团队][12] 和 [论坛][13]、[LinuxQuestions.org][14],以及 [ALSA 用户的邮件列表][15] 等。在这里,我的贡献可能与错误报告的关系不大,更多的是记录复杂的用例。不过,看到有人热心帮助他人,解决他人在某个问题上的遇到的麻烦,对每个人来说,这都是无疑一种很棒的体验。
|
||||
|
||||
### 从事开源相关的写作
|
||||
|
||||
最后,另一个我非常喜欢贡献的领域是 [撰写][16] 关于使用开源软件的文章。无论是使用指南,还是对某一特定问题的不同解决方案进行比较评估,或者只是笼统地探索一个感兴趣的领域(就我而言,是使用开源音乐播放软件来享受音乐)。一个类似的选择是制作一个教学视频。你很容易就可以做到边演示一些复杂的桌面操作(比如用 GIMP 创建一个绚丽的标志),边 [录制桌面][17]。而那些精通两种或多种语言的人,也可以考虑将现有的使用指南或视频翻译成另一种语言。
|
||||
|
||||
(LCTT 译注:读了这篇文章,你是不是想要马上投身于开源贡献呢?那么请考虑加入“Linux 中国翻译组(LCTT)”吧!我们有能帮助你快速上手翻译的 [维基][18],有热心友爱的 QQ 群,你甚至还能够在我们的官网上获得属于自己的译者专页……心动了吗?那就立刻行动起来吧!阅读 [维基][18] 以了解如何加入我们。)
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/4/contribute-without-code
|
||||
|
||||
作者:[Chris Hermansen][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/clhermansen
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://opensource.com/sites/default/files/lead-images/dandelion_blue_water_hand.jpg
|
||||
[2]: https://en.wikipedia.org/wiki/Usenet
|
||||
[3]: https://opensource.com/article/19/2/open-science-git
|
||||
[4]: https://opensource.com/life/16/1/8-ways-contribute-open-source-without-writing-code
|
||||
[5]: https://producingoss.com/en/bug-tracker.html
|
||||
[6]: https://opensource.com/article/19/3/bug-reporting
|
||||
[7]: https://docs.fedoraproject.org/en-US/quick-docs/howto-file-a-bug/
|
||||
[8]: https://en.opensuse.org/openSUSE:Submitting_bug_reports
|
||||
[9]: https://help.ubuntu.com/stable/ubuntu-help/report-ubuntu-bug.html.en
|
||||
[10]: https://wiki.documentfoundation.org/QA/BugReport
|
||||
[11]: https://developer.mozilla.org/en-US/docs/Mozilla/QA/Bug_writing_guidelines
|
||||
[12]: https://wiki.ubuntu.com/QATeam
|
||||
[13]: https://ubuntuforums.org/
|
||||
[14]: https://www.linuxquestions.org/
|
||||
[15]: https://www.alsa-project.org/wiki/Mailing-lists
|
||||
[16]: https://opensource.com/users/clhermansen
|
||||
[17]: https://opensource.com/education/16/10/simplescreenrecorder-and-kazam
|
||||
[18]: https://lctt.github.io/wiki/intro/lctt.html
|
@ -0,0 +1,170 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (hwlife)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14522-1.html)
|
||||
[#]: subject: (6 tips for securing your WordPress website)
|
||||
[#]: via: (https://opensource.com/article/20/4/wordpress-security)
|
||||
[#]: author: (Lucy Carney https://opensource.com/users/lucy-carney)
|
||||
|
||||
保护 WordPress 网站的 6 个技巧
|
||||
======
|
||||
|
||||
> 即使初学者也可以,并且应该采取这些步骤来保护他们的 WordPress 网站免受网络攻击。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202204/29/154648l33xt7xg6gk2nr8v.jpg)
|
||||
|
||||
WordPress 已经驱动了互联网 30% 的网站,它是世界上增长最快的 <ruby>内容管理系统<rt>content management system</rt></ruby>(CMS),而且不难看出原因:通过大量可用的定制化代码和插件、一流的 <ruby>搜索引擎优化<rt>Search Engine Optimization</rt></ruby>(SEO),以及在博客界超高的美誉度,WordPress 赢得了很高的知名度。
|
||||
|
||||
然而,随着知名度而来的,也带来一些不太好的关注。WordPress 是入侵者、恶意软件和网络攻击的常见目标,事实上,在 2019 年被黑客攻击的 CMS 中,WordPress [约占 90%][2]。
|
||||
|
||||
无论你是 WordPress 新用户或者有经验的开发者,这里有一些你可以采取的重要步骤来保护你的 WordPress 网站。以下 6 个关键技巧将帮助你起步。
|
||||
|
||||
### 1、选择可靠的托管主机
|
||||
|
||||
主机是所有网站无形的基础,没有它,你不能在线发布你的网站。但是主机的作用远不止起简单的托管你的网站,它也要对你的网站速度、性能和安全负责。
|
||||
|
||||
第一件要做的事情就是检查主机在它的套餐中是否包含 SSL 安全协议。
|
||||
|
||||
无论你是运行一个小博客或是一个大的在线商店,SSL 协议都是所有网站必需的安全功能。如果你正在进行线上交易,你还需要 [高级 SSL 数字证书][3] ,但是对大多数网站来说,基本免费的 SSL 证书就很好了。
|
||||
|
||||
其他需要注意安全功能包括以下几种:
|
||||
|
||||
* 日常的自动离线网站备份
|
||||
* 恶意软件和杀毒软件扫描和删除
|
||||
* <ruby>分布式服务攻击<rt>Distributed denial of service</rt></ruby>(DDOS)保护
|
||||
* 实时网络监控
|
||||
* 高级防火墙保护
|
||||
|
||||
另外除了这些数字安全功能之外,你的主机供应商的 _物理_ 安全措施也是值得考虑的。这些包括用安全警卫、闭路监控和二次验证或生物识别来限制对数据中心的访问。
|
||||
|
||||
### 2、使用安全插件
|
||||
|
||||
保护你的网站安全最有效且容易的方法之一是安装一个安全插件,比如 [Sucuri][4],它是一个 GPLv2 许可的开源软件。安全插件是非常重要的,因为它们能将安全管理自动化,这意味着你能够集中精力运行你的网站,而不是花大量的时间来与在线威胁作斗争。
|
||||
|
||||
这些插件探测、阻止恶意攻击,并提醒你需要注意的任何问题。简言之,它们持续在后台运行,保护你的网站,这意味着你不必保持 7 天 24 小时地保持清醒,与黑客、漏洞和其他数字垃圾斗争。
|
||||
|
||||
一个好的安全插件会免费提供给你所有必要的安全功能,但是一些高级功能需要付费订阅。举个例子,如果你想要解锁 [Sucuri 的网站防火墙][5] ,你就需要付费。开启 <ruby>网站应用防火墙<rt>web application firewall</rt></ruby>(WAF)阻挡常见的威胁,并为给你的网站添加一个额外的安全层,所以当选择安全插件的时候,寻找带有这个功能的插件是一个好的主意。
|
||||
|
||||
### 3、选择值得信任的插件和主题
|
||||
|
||||
WordPress 的快乐在于它是开源的,所以任何人、每个人都能提供他们开发的主题和插件。但当选择高质量的主题和插件时,这也抛出一些问题。
|
||||
|
||||
在挑选免费的主题或插件时,有一些设计较差,或者更糟糕的是,可能会隐藏恶意代码。
|
||||
|
||||
为了避免这种情况,始终从可靠的来源来获取免费主题和插件,比如 WordPress 主题库。阅读对它的评论,并研究查看开发者是否构建过其他的程序。
|
||||
|
||||
过时的或设计不良的主题和插件可以为攻击者进入你的网站留下“后门”或错误,这就是为什么选择时要谨慎。然而,你也应该提防无效或者破解的主题。这些已经黑客破坏了的高级主题被非法销售。你可能会购买一个无效的主题,它看起来没什么问题,但会通过隐藏的恶意代码破坏你的网站。
|
||||
|
||||
为了避免无效主题,不要被打折的价格所吸引,始终坚持可靠的主题商店,比如官方的 [WordPress 目录][6]。如果你在其它地方寻找,坚持选择大型且值得信任的商店,比如 [Themify][7] ,这个主题和插件商店自从 2010 年就已经在经营了。Themify 确保它的所有 WordPress 主题通过了 <ruby>[谷歌友好移动][8]<rt>Google Mobile-Friendly</rt></ruby> 测试,并在 [GNU 通用公共许可证][9] 下开源。
|
||||
|
||||
### 4、运行定期更新
|
||||
|
||||
这是 WordPress 的基本规则: 始终保持你的网站最新。然而,不是所有人都坚持了这个规则,只有 [43% 的 WordPress 网站][10] 运行的是最新版本。
|
||||
|
||||
问题是,当你的网站过期的时候,由于它在安全和性能修复方面落后的原因,容易受到故障、漏洞、入侵和崩溃的影响。过期的网站不能像更新的网站一样修复漏洞,攻击者能够分辨出哪些网站是过期的。这意味着他们能够依此来搜索最易受攻击的网站并袭击它们。
|
||||
|
||||
这就是为什么你始终要运行最新的 WordPress 版本的原因。为了保持网站安全处于最强的状态,你必须更新你的插件和主题,以及你的核心 WordPress 软件。
|
||||
|
||||
如果你选择一个受管理的 WordPress 托管套餐,你可能会发现你的供应商会为你检查并运行更新,以了解你的主机是否提供了软件和插件更新。如果没有,你可以安装一个开源插件管理器。比如 GPLv2 许可的 [Easy Updates Manager plugin][11] 作为替代品。
|
||||
|
||||
### 5、强化你的登录
|
||||
|
||||
除了通过仔细选择主题和安装安全插件来创建一个安全的 WordPress 网站外,你还需要防止未经授权的登录访问。
|
||||
|
||||
#### 密码保护
|
||||
|
||||
如果你在使用 [容易猜到的短语][12] 比如 “123456” 或 “qwerty” ,第一步要做的增强登录安全最简单的方法是更改你的密码。
|
||||
|
||||
尝试使用一个长的密码而不是一个单词,这样它们很难被破解。最好的方式是用一系列你容易记住且不相关的单词合并起来。
|
||||
|
||||
这里有一些其它的提示:
|
||||
|
||||
* 绝不要重复使用密码
|
||||
* 密码不要包括像家庭成员的名字或者你喜欢的球队等明显的单词
|
||||
* 不要和任何人分享你的登录信息
|
||||
* 你的密码要包括大小写和数字来增加复杂程度
|
||||
* 不要在任何地方写下或者存储你的登录信息
|
||||
* 使用 [密码管理器][13]
|
||||
|
||||
#### 变更你的登录地址
|
||||
|
||||
将默认登录网址从标准格式 `yourdomain.com/wp-admin` 变更是一个好主意。这是因为黑客也知道这个缺省登录网址,所以不变更它会有被暴力破解的风险。
|
||||
|
||||
为避免这种情况,可以将登录网址变更为不同的网址。使用开源插件比如 GPLv2 许可的 [WPS Hide Login][14] 可以更加安全、快速和轻松的自定义登录地址。
|
||||
|
||||
#### 应用双因素认证
|
||||
|
||||
为了提供更多的保护,阻止未授权的登录和暴力破解,你应该添加双因素认证。这意味着即使有人 _确实_ 得到了你的登录信息,但是他们还需要一个直接发送到你的手机上的验证码,来获得对你的 WordPress 网站管理的权限。
|
||||
|
||||
添加双因素认证是非常容易的,只需要安装另一个插件,在 WordPress 插件目录搜索 “two-factor authentication” ,然后选择你要的插件。其中一个选择是 [Two Factor][15] ,这是一个流行的 GPLv2 许可的插件,已经有超过 10000 次安装。
|
||||
|
||||
#### 限制登录尝试
|
||||
|
||||
WordPress 可以让你多次猜测登录信息来帮助你登录。然而,这对黑客尝试获取未授权访问 WordPress 网站并发布恶意代码也是有帮助的。
|
||||
|
||||
为了应对暴力破解,安装一个插件来限制登录尝试,并设置你允许猜测的次数。
|
||||
|
||||
### 6、禁用文件编辑功能
|
||||
|
||||
这不是一个适合初学者的步骤,除非你是个自信的程序员,不要尝试它。并且一定要先备份你的网站。
|
||||
|
||||
那就是说,如果你真的想保护你的 WordPress 网站,禁用文件编辑功能 _是_ 一个重要的措施 。如果你不隐藏你的文件,它意味着任何人从管理后台都可以编辑你的主题和插件代码,如果入侵者进入,那就危险了。
|
||||
|
||||
为了拒绝未授权的访问,转到你的 `.htaccess` 文件并输入:
|
||||
|
||||
```
|
||||
<Files wp-config.php>
|
||||
order allow,deny
|
||||
deny from all
|
||||
</Files>
|
||||
```
|
||||
|
||||
或者,要从你的 WordPress 管理后台直接删除主题和插件的编辑选项,可以添加编辑你的 `wp-config.php` 文件:
|
||||
|
||||
```
|
||||
define( 'DISALLOW_FILE_EDIT', true );
|
||||
```
|
||||
|
||||
保存并重新加载这个文件,插件和主题编辑器将会从你的 WordPress 管理后台菜单中消失,阻止任何人编辑你的主题或者插件代码,包括你自己。如果你需要恢复访问你的主题和插件代码,只需要删除你添加在 `wp-config.php` 文件中的代码即可。
|
||||
|
||||
无论你阻止未授权的访问,还是完全禁用文件编辑功能,采取行动保护你网站代码是很重要的。否则,不受欢迎的访问者编辑你的文件并添加新代码是很容易的。这意味着攻击者可以使用编辑器从你的 WordPress 站点来获取数据,或者甚至利用你的网站对其他站点发起攻击。
|
||||
|
||||
隐藏文件更容易的方式是利用安全插件来为你服务,比如 Sucuri 。
|
||||
|
||||
### WordPress 安全概要
|
||||
|
||||
WordPress 是一个优秀的开源平台,初学者和开发者都应该享受它,而不用担心成为攻击的受害者。遗憾的是,这些威胁不会很快消失,所以保持网站的安全至关重要。
|
||||
|
||||
利用以上措施,你可以创建一个更加健壮、更安全的保护水平的 WordPress 站点,并给自己带来更好的使用体验。
|
||||
|
||||
保持安全是一个持续的任务,而不是一次性的检查清单,所以一定要定期重温这些步骤,并在建立和使用你的CMS时保持警惕。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/20/4/wordpress-security
|
||||
|
||||
作者:[Lucy Carney][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[hwlife](https://github.com/hwlife)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/lucy-carney
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/BUSINESS_3reasons.png?itok=k6F3-BqA (A lock on the side of a building)
|
||||
[2]: https://cyberforces.com/en/wordpress-most-hacked-cms
|
||||
[3]: https://opensource.com/article/19/11/internet-security-tls-ssl-certificate-authority
|
||||
[4]: https://wordpress.org/plugins/sucuri-scanner/
|
||||
[5]: https://sucuri.net/website-firewall/
|
||||
[6]: https://wordpress.org/themes/
|
||||
[7]: https://themify.me/
|
||||
[8]: https://developers.google.com/search/mobile-sites/
|
||||
[9]: http://www.gnu.org/licenses/gpl.html
|
||||
[10]: https://wordpress.org/about/stats/
|
||||
[11]: https://wordpress.org/plugins/stops-core-theme-and-plugin-updates/
|
||||
[12]: https://www.forbes.com/sites/kateoflahertyuk/2019/04/21/these-are-the-worlds-most-hacked-passwords-is-yours-on-the-list/#4f157c2f289c
|
||||
[13]: https://opensource.com/article/16/12/password-managers
|
||||
[14]: https://wordpress.org/plugins/wps-hide-login/
|
||||
[15]: https://en-gb.wordpress.org/plugins/two-factor/
|
411
published/202204/20200916 Analyze Linux startup performance.md
Normal file
411
published/202204/20200916 Analyze Linux startup performance.md
Normal file
@ -0,0 +1,411 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (jiamn)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14462-1.html)
|
||||
[#]: subject: (Analyze Linux startup performance)
|
||||
[#]: via: (https://opensource.com/article/20/9/systemd-startup-configuration)
|
||||
[#]: author: (David Both https://opensource.com/users/dboth)
|
||||
|
||||
Linux 启动性能分析
|
||||
======
|
||||
|
||||
> 用 systemd-analyze 洞悉并解决 Linux 启动性能问题。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202204/12/120909ygssda7j3t3a3a3a.jpg)
|
||||
|
||||
系统管理员的一部分工作就是分析系统性能,发现并解决引起性能不佳、启动时间长的问题。系统管理员也需要去检查 systemd 的配置和使用的其它方面。
|
||||
|
||||
systemd 初始化系统提供了 `systemd-analyze` 工具,可以帮助发现性能问题和其他重要的 systemd 信息。在以前的文章《[分析 systemd 日历和时间跨度][2]》里,我用了 `systemd-analyze` 去分析 systemd 里的时间戳和时间跨度,但是这个工具还有很多其他用法,这个文章里我将再揭示一些。
|
||||
|
||||
(LCTT 译注:systemd 是目前主流 Linux 发行版采用的系统管理系统)
|
||||
|
||||
(LCTT 译注:为了区分英文的 “boot” 和 “startup” 的不同涵义,此处将 “boot” 翻译为“引导”,“startup” 翻译为“启动”。)
|
||||
|
||||
### 概述启动
|
||||
|
||||
Linux 启动过程是值得学习关注的地方,因为 `systemd-analyze` 工具很多功能聚焦在<ruby>启动<rt>startup</rt></ruby>过程。但是首先,要理解<ruby>引导<rt>boot</rt></ruby>和<ruby>启动<rt>startup</rt></ruby>。引导阶段从 BIOS 加电自检(POST)开始,结束于内核完成加载并控制主机系统,然后是开始了启动过程,也是 systemd 日志的开始点。
|
||||
|
||||
这个系列的第二篇文章《[理解 Linux 启动时的 systemd][3]》中,我详细讨论了启动阶段的内容和过程。在这篇文章里,我想研究一下启动过程,看看需要多少时间和大部分时间花费在哪里。
|
||||
|
||||
下面我将展示的结果来自我的主要工作站,这比虚拟机的结果要有趣得多。这个工作站包括一块 华硕 TUF X299 Mark 2 主板、一个英特尔 i9-7960X CPU(16 核 32 线程),64 G 内存。下面的一些命令非 root 用户也可以使用,但是我在这篇文章里使用了 root 用户,以避免在用户之间切换。
|
||||
|
||||
检查启动过程有几种方法,最简单的 `systemd-analyze` 命令显示了启动的几个主要部分耗费的时间,包括内核启动、装载运行 initrd(即初始 ramdisk,这是一个用来初始化一些硬件、挂载 `/` 根文件系统的临时系统镜像),还有用户空间(加载所有使主机达到可用状态的程序和守护程序)。如果没有像该命令传递子命令,默认是 `systemd-analyze time`:
|
||||
|
||||
```
|
||||
[root@david ~]$ systemd-analyze
|
||||
Startup finished in 53.921s (firmware) + 2.643s (loader) + 2.236s (kernel) + 4.348s (initrd) + 10.082s (userspace) = 1min 13.233s
|
||||
graphical.target reached after 10.071s in userspace
|
||||
[root@david ~]#
|
||||
```
|
||||
|
||||
这个输出中最值得注意的数据是在固件(BIOS)中花费的时间:几乎 54 秒。这是一个不太正常的时间,我的其他物理系统都没有花费这么长的时间来通过 BIOS。
|
||||
|
||||
我的 System76 Oryx Pro 笔记本在 BIOS 阶段只花了 8.506 秒,我家里所有的系统都在 10 秒以内。在线搜索一阵之后,我发现这块主板以其超长的 BIOS 引导时间而闻名。我的主板从不“马上启动”,总是挂起,我需要关机再开机,BIOS 报错,按 `F1` 进入 BIOS 设置,选择要引导的驱动器完成引导,多花费的时间就是这样用掉的。
|
||||
|
||||
不是所有主机都会显示固件数据(LCTT 译注:固件引导中不涉及 systemd)。我的不科学的实验使我相信,这个数据只显示给英特尔 9 代或以上的处理器。但这可能是不正确的。
|
||||
|
||||
这个关于引导、启动的概述提供了很好的(虽然有限)的信息,但是还有很多关于启动的信息,我将在下面描述。
|
||||
|
||||
### 分配责任
|
||||
|
||||
你可以用 `systemd-analyze blame` 来发现哪个 systemd 单元的初始化时间最长。其结果按照初始化时间长短排序,从多到少:
|
||||
|
||||
```
|
||||
[root@david ~]$ systemd-analyze blame
|
||||
5.417s NetworkManager-wait-online.service
|
||||
3.423s dracut-initqueue.service
|
||||
2.715s systemd-udev-settle.service
|
||||
2.519s fstrim.service
|
||||
1.275s udisks2.service
|
||||
1.271s smartd.service
|
||||
996ms upower.service
|
||||
637ms lvm2-monitor.service
|
||||
533ms lvm2-pvscan@8:17.service
|
||||
520ms dmraid-activation.service
|
||||
460ms vboxdrv.service
|
||||
396ms initrd-switch-root.service
|
||||
<截断:删去了好多时间不长的条目>
|
||||
```
|
||||
|
||||
因为很多服务是并行开始的,在 BIOS 之后所有单元加在一起的总数大大超过了 `systemd-analyze time` 汇总数。很多都是小数,不能显著的节省时间。
|
||||
|
||||
这个命令提供的数据指明了改善启动时间的办法。无用的服务可以禁用(`disable`)。在这个启动过程中,似乎没有任何一个服务需要花费过长的时间。你可能会在每次启动时看到不同的结果。(LCTT 译注:并行启动服务的原因)
|
||||
|
||||
### 关键链
|
||||
|
||||
就像项目管理中的关键路径一样,关键链显示了在启动过程中发生的时间关键的事件链(LCTT 译注:systemd 可以定义服务间的依赖,构成关键链)。如果启动缓慢,这些是你想查看的 systemd 单元,因为它们是导致延迟的单元。这个工具不会显示所有启动的单元,只显示这个关键事件链中的单元。(LCTT 译注:相当于最短路径。并不显示依赖不在关键链上的服务单元)
|
||||
|
||||
```
|
||||
[root@david ~]# systemd-analyze critical-chain
|
||||
The time when unit became active or started is printed after the "@" character.
|
||||
The time the unit took to start is printed after the "+" character.
|
||||
|
||||
graphical.target @10.071s
|
||||
└─lxdm.service @10.071s
|
||||
└─plymouth-quit.service @10.047s +22ms
|
||||
└─systemd-user-sessions.service @10.031s +7ms
|
||||
└─remote-fs.target @10.026s
|
||||
└─remote-fs-pre.target @10.025s
|
||||
└─nfs-client.target @4.636s
|
||||
└─gssproxy.service @4.607s +28ms
|
||||
└─network.target @4.604s
|
||||
└─NetworkManager.service @4.383s +219ms
|
||||
└─dbus-broker.service @4.434s +136ms
|
||||
└─dbus.socket @4.369s
|
||||
└─sysinit.target @4.354s
|
||||
└─systemd-update-utmp.service @4.345s +9ms
|
||||
└─auditd.service @4.301s +42ms
|
||||
└─systemd-tmpfiles-setup.service @4.254s +42ms
|
||||
└─import-state.service @4.233s +19ms
|
||||
└─local-fs.target @4.229s
|
||||
└─Virtual.mount @4.019s +209ms
|
||||
└─systemd-fsck@dev-mapper-vg_david2\x2dVirtual.service @3.742s +274ms
|
||||
└─local-fs-pre.target @3.726s
|
||||
└─lvm2-monitor.service @356ms +637ms
|
||||
└─dm-event.socket @319ms
|
||||
└─-.mount
|
||||
└─system.slice
|
||||
└─-.slice
|
||||
[root@david ~]#
|
||||
```
|
||||
|
||||
前面有 `@` 的数字表示单元激活开始启动所使用的绝对秒数。前面有 `+` 的数字显示单元启动所需的时间。
|
||||
|
||||
### 系统状态
|
||||
|
||||
有时候你需要确定系统的当前状态,`systemd-analyze dump` 命令转储了当前系统状态的大量数据。有主要的启动时间戳,一个每个 systemd 单元的列表,并对每个单元状态进行了完整描述:
|
||||
|
||||
```
|
||||
[root@david ~]# systemd-analyze dump
|
||||
Timestamp firmware: 1min 7.983523s
|
||||
Timestamp loader: 3.872325s
|
||||
Timestamp kernel: Wed 2020-08-26 12:33:35 EDT
|
||||
Timestamp initrd: Wed 2020-08-26 12:33:38 EDT
|
||||
Timestamp userspace: Wed 2020-08-26 12:33:42 EDT
|
||||
Timestamp finish: Wed 2020-08-26 16:33:56 EDT
|
||||
Timestamp security-start: Wed 2020-08-26 12:33:42 EDT
|
||||
Timestamp security-finish: Wed 2020-08-26 12:33:42 EDT
|
||||
Timestamp generators-start: Wed 2020-08-26 16:33:42 EDT
|
||||
Timestamp generators-finish: Wed 2020-08-26 16:33:43 EDT
|
||||
Timestamp units-load-start: Wed 2020-08-26 16:33:43 EDT
|
||||
Timestamp units-load-finish: Wed 2020-08-26 16:33:43 EDT
|
||||
Timestamp initrd-security-start: Wed 2020-08-26 12:33:38 EDT
|
||||
Timestamp initrd-security-finish: Wed 2020-08-26 12:33:38 EDT
|
||||
Timestamp initrd-generators-start: Wed 2020-08-26 12:33:38 EDT
|
||||
Timestamp initrd-generators-finish: Wed 2020-08-26 12:33:38 EDT
|
||||
Timestamp initrd-units-load-start: Wed 2020-08-26 12:33:38 EDT
|
||||
Timestamp initrd-units-load-finish: Wed 2020-08-26 12:33:38 EDT
|
||||
-> Unit system.slice:
|
||||
Description: System Slice
|
||||
Instance: n/a
|
||||
Unit Load State: loaded
|
||||
Unit Active State: active
|
||||
State Change Timestamp: Wed 2020-08-26 12:33:38 EDT
|
||||
Inactive Exit Timestamp: Wed 2020-08-26 12:33:38 EDT
|
||||
Active Enter Timestamp: Wed 2020-08-26 12:33:38 EDT
|
||||
Active Exit Timestamp: n/a
|
||||
Inactive Enter Timestamp: n/a
|
||||
May GC: no
|
||||
<截断:删除了大量的输出行>
|
||||
```
|
||||
|
||||
在我的主工作站上,这个命令生成了 49680 行输出,大概 1.66MB,这个命令非常快,不需要等待。
|
||||
|
||||
我很喜欢为各种连接设备(如存储设备)提供的大量细节。每个 systemd 单元有一个部分,包括各种运行时、缓存、日志目录的模式、启动单元的命令行、PID、开始时间戳,以及内存和文件限制等细节。
|
||||
|
||||
`systemd-analyze` 的手册页里展示了 `systemd-analyze --user dump` 选项,目的是显示用户管理器的内部状态。但这个选项对我来说是失败的,互联网搜索之后表明它可能有一些问题。在 systemd 里,`--user` 实例用来管理和控制处理器给每个用户的进程资源。处理能力按分给每个用户的进程都属于一个控制组,我将在以后的文章中介绍。
|
||||
|
||||
### 分析图表
|
||||
|
||||
大多数啥都不懂的猥琐老板(PHB)和许多优秀的管理者都发现漂亮的图表比我通常喜欢的基于文本的系统性能数据更容易阅读和理解。但有时,即使是我也喜欢一个好的图表,`systemd-analyze` 提供了显示引导/启动数据的 [SVG][4] 矢量图表。
|
||||
|
||||
下面的命令生成一个矢量图文件,来显示在引导和启动过程发生的事件。生成这个文件只需要几秒:
|
||||
|
||||
```
|
||||
[root@david ~]# systemd-analyze plot > /tmp/bootup.svg
|
||||
```
|
||||
|
||||
这个命令创建了一个 SVG 文件,SVG 是一个定义了一系列图形矢量的文本文件,包括 Image Viewer、Ristretto、Okular、Eye of Mate、LibreOffice Draw 在内的这些可以生成图形的应用,可以用 SVG 来创建图像。
|
||||
|
||||
我用 LibreOffice Draw(LCTT 译注:一个办公文档软件)来渲染一幅图形。这张图形很大,你需要放到很大才能看清细节。这里是它的一小部分:
|
||||
|
||||
![The bootup.svg file displayed in LibreOffice Draw.][5]
|
||||
|
||||
图中时间轴上零点(0)的左边是引导阶段,零点的右边是启动阶段。这一小部分显示了内核、initrd 和 initrd 启动的进程。
|
||||
|
||||
这张图一目了然地显示了什么时候启动,启动需要多少时间,以及主要的依赖项。关键路径用红色高亮显示。
|
||||
|
||||
另外一个生成图形输出的命令是 `systemd-analyze plot`,它生成了 [DOT][7] 格式的文本依赖图。产生的数据流通过 `dot` 工具进行处理,这是一组用来从多种类型数据中生成矢量图文件的程序。这些 SVG 文件也能被上面列出的工具处理。
|
||||
|
||||
首先,生成文件,在我的主工作站花了 9 分钟:
|
||||
|
||||
```
|
||||
[root@david ~]# time systemd-analyze dot | dot -Tsvg > /tmp/test.svg
|
||||
Color legend: black = Requires
|
||||
dark blue = Requisite
|
||||
dark grey = Wants
|
||||
red = Conflicts
|
||||
green = After
|
||||
|
||||
real 8m37.544s
|
||||
user 8m35.375s
|
||||
sys 0m0.070s
|
||||
[root@david ~]#
|
||||
```
|
||||
|
||||
我不会在这里重现输出,因为产生的图形就像一大堆意大利面条。但是你应该试试,看看我想让你看到的结果。
|
||||
|
||||
### 条件
|
||||
|
||||
在阅读 systemd-analyze(1) 的手册页时,我发现了一个更有趣的功能,但又有点通用,就是条件子命令。(是的,我确实在读手册页,而且我神奇地通过这种方式学到了很多东西!)。这个 `condition` 子命令能用来测试 systemd 单元文件中的条件和断言。
|
||||
|
||||
它也可以在脚本中用来评估一个或多个条件 —— 如果所有条件都满足,则返回 0;如果有条件不满足,则返回 1。在其它情况下,它都会输出其结果文本。
|
||||
|
||||
下面的例子来自手册页,稍微有点复杂。它测试了内核版本是否在 4.0 和 5.1 之间,主机是否使用交流电供电,系统结构是否是 ARM,以及 `/etc/os-release` 目录是否存在。我添加了 `echo $?` 来打印返回值。
|
||||
|
||||
```
|
||||
[root@david ~]# systemd-analyze condition 'ConditionKernelVersion = ! <4.0' \
|
||||
'ConditionKernelVersion = >=5.1' \
|
||||
'ConditionACPower=|false' \
|
||||
'ConditionArchitecture=|!arm' \
|
||||
'AssertPathExists=/etc/os-release' ; \
|
||||
echo $?
|
||||
test.service: AssertPathExists=/etc/os-release succeeded.
|
||||
Asserts succeeded.
|
||||
test.service: ConditionArchitecture=|!arm succeeded.
|
||||
test.service: ConditionACPower=|false failed.
|
||||
test.service: ConditionKernelVersion=>=5.1 succeeded.
|
||||
test.service: ConditionKernelVersion=!<4.0 succeeded.
|
||||
Conditions succeeded.
|
||||
0
|
||||
[root@david ~]#
|
||||
```
|
||||
|
||||
条件和断言的列表大约从 systemd.unit(5) 手册页的第 600 行左右开始。
|
||||
|
||||
### 列出配置文件
|
||||
|
||||
`systemd-analyze` 工具提供了一种将各种配置文件的内容发送到 STDOUT 的方法,如图所示。其基本目录是 `/etc/`。
|
||||
|
||||
```
|
||||
[root@david ~]# systemd-analyze cat-config systemd/system/display-manager.service
|
||||
# /etc/systemd/system/display-manager.service
|
||||
[Unit]
|
||||
Description=LXDM (Lightweight X11 Display Manager)
|
||||
#Documentation=man:lxdm(8)
|
||||
Conflicts=getty@tty1.service
|
||||
After=systemd-user-sessions.service getty@tty1.service plymouth-quit.service livesys-late.service
|
||||
#Conflicts=plymouth-quit.service
|
||||
|
||||
[Service]
|
||||
ExecStart=/usr/sbin/lxdm
|
||||
Restart=always
|
||||
IgnoreSIGPIPE=no
|
||||
#BusName=org.freedesktop.lxdm
|
||||
|
||||
[Install]
|
||||
Alias=display-manager.service
|
||||
[root@david ~]#
|
||||
```
|
||||
|
||||
打了这么多字却和标准的 `cat` 命令做的差不多。我发现下一条命令小有帮助,它能在标准的 systemd 所在的位置搜索具有指定模式的内容:
|
||||
|
||||
```
|
||||
[root@david ~]# systemctl cat backup*
|
||||
# /etc/systemd/system/backup.timer
|
||||
# This timer unit runs the local backup program
|
||||
# (C) David Both
|
||||
# Licensed under GPL V2
|
||||
#
|
||||
|
||||
[Unit]
|
||||
Description=Perform system backups
|
||||
Requires=backup.service
|
||||
|
||||
[Timer]
|
||||
Unit=backup.service
|
||||
OnCalendar=*-*-* 00:15:30
|
||||
|
||||
[Install]
|
||||
WantedBy=timers.target
|
||||
|
||||
|
||||
# /etc/systemd/system/backup.service
|
||||
# This service unit runs the rsbu backup program
|
||||
# By David Both
|
||||
# Licensed under GPL V2
|
||||
#
|
||||
|
||||
[Unit]
|
||||
Description=Backup services using rsbu
|
||||
Wants=backup.timer
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
Environment="HOME=/root"
|
||||
ExecStart=/usr/local/bin/rsbu -bvd1
|
||||
ExecStart=/usr/local/bin/rsbu -buvd2
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
|
||||
[root@david ~]#
|
||||
```
|
||||
|
||||
这两个命令在每个文件的内容前面都有一个注释行,包含文件的完整路径和名称。
|
||||
|
||||
### 单元文件检查
|
||||
|
||||
当创建了一个新的单元文件,可以利用 `verify` 子命令帮助检查语法是否正确。它能指出来不正确的拼写,并列出缺失的服务单元。
|
||||
|
||||
```
|
||||
[root@david ~]# systemd-analyze verify /etc/systemd/system/backup.service
|
||||
```
|
||||
|
||||
秉承 Unix/Linux 的“沉默是金”的宗旨,没有输出意味着扫描的文件中没有错误。
|
||||
|
||||
### 安全性
|
||||
|
||||
`security` 子命令检查指定服务的安全级别。它只能针对服务单元,其他类型的单元文件不起作用:
|
||||
|
||||
```
|
||||
[root@david ~]# systemd-analyze security display-manager
|
||||
NAME DESCRIPTION >
|
||||
✗ PrivateNetwork= Service has access to the host's network >
|
||||
✗ User=/DynamicUser= Service runs as root user >
|
||||
✗ CapabilityBoundingSet=~CAP_SET(UID|GID|PCAP) Service may change UID/GID identities/capabilities >
|
||||
✗ CapabilityBoundingSet=~CAP_SYS_ADMIN Service has administrator privileges >
|
||||
✗ CapabilityBoundingSet=~CAP_SYS_PTRACE Service has ptrace() debugging abilities >
|
||||
✗ RestrictAddressFamilies=~AF_(INET|INET6) Service may allocate Internet sockets >
|
||||
✗ RestrictNamespaces=~CLONE_NEWUSER Service may create user namespaces >
|
||||
✗ RestrictAddressFamilies=~… Service may allocate exotic sockets >
|
||||
✗ CapabilityBoundingSet=~CAP_(CHOWN|FSETID|SETFCAP) Service may change file ownership/access mode/capabilities unres>
|
||||
✗ CapabilityBoundingSet=~CAP_(DAC_*|FOWNER|IPC_OWNER) Service may override UNIX file/IPC permission checks >
|
||||
✗ CapabilityBoundingSet=~CAP_NET_ADMIN Service has network configuration privileges >
|
||||
✗ CapabilityBoundingSet=~CAP_SYS_MODULE Service may load kernel modules
|
||||
<截断>
|
||||
✗ CapabilityBoundingSet=~CAP_SYS_TTY_CONFIG Service may issue vhangup() >
|
||||
✗ CapabilityBoundingSet=~CAP_WAKE_ALARM Service may program timers that wake up the system >
|
||||
✗ RestrictAddressFamilies=~AF_UNIX Service may allocate local sockets >
|
||||
|
||||
→ Overall exposure level for backup.service: 9.6 UNSAFE ?
|
||||
lines 34-81/81 (END)
|
||||
```
|
||||
|
||||
是的,表情符是输出的一部分。但是,当然,许多服务需要几乎完全访问所有的东西,以便完成它们的工作。我针对几个服务运行了这个程序,包括我自己的备份服务;结果可能有所不同,但最底下一行似乎大多是一样的。
|
||||
|
||||
这个工具对于在严格的安全环境检查和修复用户空间的服务单元是很有用的。我不认为我们的大多数都能用到它。
|
||||
|
||||
### 最后总结
|
||||
|
||||
这个强力的工具提供了一些有趣而惊人的有用选项。本文探讨的大部分内容是关于使用 systemd-analyze 来深入了解 Linux 使用 systemd 的启动性能。它还可以分析 systemd 的其他方面。
|
||||
|
||||
其中有些工具的作用有限,有几个应该完全忘记。但在解决启动和其他 systemd 功能的问题时,大多数都能起到很好的作用。
|
||||
|
||||
### 资源
|
||||
|
||||
互联网上关于 systemd 有很多信息,但是很多过于简略、晦涩,甚至是误导。除了这篇文章中提到的资源外,以下网页提供了关于systemd启动的更详细和可靠的信息。这个列表在我开始写这一系列文章后有所增长,以反映我所做的研究。
|
||||
|
||||
* [systemd.unit(5) 手册页][9] 包含了一份单元文件部分及其配置选项的清单,并对每个部分进行了简明的描述。
|
||||
* Fedora 项目有一个很好的实用 [systemd 指南][10]。它包含了配置、管理和维护使用 systemd 的 Fedora 计算机所需的几乎所有知识。
|
||||
* Fedora 项目还有一份很好的 [备忘录][11],将旧的 SystemV 命令与 systemd 命令进行了对照。
|
||||
* Red Hat 文档包含了对 [单元文件结构][12] 的详细描述和其他重要的信息。
|
||||
* 关于 systemd 技术的细节和创建它的原因,可以去看 Freedesktop.org [systemd 详述][13]。
|
||||
* [Linux.com][14] 的“更多 systemd 乐趣”提供了很多高级的 systemd [信息和技巧][15]。
|
||||
|
||||
此外,systemd 设计者和主要开发者 Lennart Poettering 也为 Linux 系统管理员撰写了一系列深度技术文档,尽管这些文章写于 2010 年 4 月到 2011 年 9 月,现在看也是非常适应时宜。关于 systemd 及其生态系统的其他好文章,大部分都是基于这些文章的。
|
||||
|
||||
* [Rethinking PID 1][16]
|
||||
* [systemd for Administrators, Part I][17]
|
||||
* [systemd for Administrators, Part II][18]
|
||||
* [systemd for Administrators, Part III][19]
|
||||
* [systemd for Administrators, Part IV][20]
|
||||
* [systemd for Administrators, Part V][21]
|
||||
* [systemd for Administrators, Part VI][22]
|
||||
* [systemd for Administrators, Part VII][23]
|
||||
* [systemd for Administrators, Part VIII][24]
|
||||
* [systemd for Administrators, Part IX][25]
|
||||
* [systemd for Administrators, Part X][26]
|
||||
* [systemd for Administrators, Part XI][27]
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/20/9/systemd-startup-configuration
|
||||
|
||||
作者:[David Both][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[jiamn](https://github.com/jiamn)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/dboth
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/find-file-linux-code_magnifying_glass_zero.png?itok=E2HoPDg0 (Magnifying glass on code)
|
||||
[2]: https://opensource.com/article/20/7/systemd-calendar-timespans
|
||||
[3]: https://opensource.com/article/20/5/systemd-startup?utm_campaign=intrel
|
||||
[4]: https://en.wikipedia.org/wiki/Scalable_Vector_Graphics
|
||||
[5]: https://opensource.com/sites/default/files/uploads/bootup.svg-graph.png (The bootup.svg file displayed in LibreOffice Draw.)
|
||||
[6]: https://creativecommons.org/licenses/by-sa/4.0/
|
||||
[7]: https://en.wikipedia.org/wiki/DOT_(graph_description_language)
|
||||
[8]: mailto:getty@tty1.service
|
||||
[9]: https://man7.org/linux/man-pages/man5/systemd.unit.5.html
|
||||
[10]: https://docs.fedoraproject.org/en-US/quick-docs/understanding-and-administering-systemd/index.html
|
||||
[11]: https://fedoraproject.org/wiki/SysVinit_to_Systemd_Cheatsheet
|
||||
[12]: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/configuring_basic_system_settings/managing-services-with-systemd_configuring-basic-system-settings#Managing_Services_with_systemd-Unit_File_Structure
|
||||
[13]: https://www.freedesktop.org/wiki/Software/systemd/
|
||||
[14]: http://Linux.com
|
||||
[15]: https://www.linux.com/training-tutorials/more-systemd-fun-blame-game-and-stopping-services-prejudice/
|
||||
[16]: http://0pointer.de/blog/projects/systemd.html
|
||||
[17]: http://0pointer.de/blog/projects/systemd-for-admins-1.html
|
||||
[18]: http://0pointer.de/blog/projects/systemd-for-admins-2.html
|
||||
[19]: http://0pointer.de/blog/projects/systemd-for-admins-3.html
|
||||
[20]: http://0pointer.de/blog/projects/systemd-for-admins-4.html
|
||||
[21]: http://0pointer.de/blog/projects/three-levels-of-off.html
|
||||
[22]: http://0pointer.de/blog/projects/changing-roots
|
||||
[23]: http://0pointer.de/blog/projects/blame-game.html
|
||||
[24]: http://0pointer.de/blog/projects/the-new-configuration-files.html
|
||||
[25]: http://0pointer.de/blog/projects/on-etc-sysinit.html
|
||||
[26]: http://0pointer.de/blog/projects/instances.html
|
||||
[27]: http://0pointer.de/blog/projects/inetd.html
|
@ -0,0 +1,149 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (lkxed)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14427-1.html)
|
||||
[#]: subject: (Linux Jargon Buster: What is Grub in Linux? What is it Used for?)
|
||||
[#]: via: (https://itsfoss.com/what-is-grub/)
|
||||
[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
|
||||
|
||||
Linux 黑话解释:Linux 中的 GRUB 是什么?
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202204/03/111835u4rcmcf7qze8pawa.png)
|
||||
|
||||
如果你曾经使用过 Linux 桌面,你一定见过这个屏幕。这就是所谓的 GRUB 屏幕。是的,它的字母全部都是大写的。
|
||||
|
||||
![Remember this screen? This is GRUB][1]
|
||||
|
||||
在 “<ruby>Linux 黑话解释<rt>Linux Jargon Buster</rt></ruby>”系列的这一个章节中,我将告诉你 GRUB 是什么,以及它有什么用处。此外,我还会简要地介绍一下配置和定制的部分。
|
||||
|
||||
### GRUB 是什么?
|
||||
|
||||
[GRUB][2] 是一个用于加载和管理系统启动的完整程序。它是 Linux 发行版中最常见的<ruby>引导程序<rt>bootloader</rt></ruby>。引导程序是计算机启动时运行的第一个软件。它加载 [操作系统的内核][3],然后再由内核初始化操作系统的其他部分(包括 Shell、[显示管理器][4]、[桌面环境][5] 等等)。
|
||||
|
||||
### 引导程序和引导管理器
|
||||
|
||||
我不想现在就把你搞糊涂,但是我认为这个话题是不可避免的。<ruby>引导程序<rt>boot loader</rt></ruby>和<ruby>引导管理器<rt>boot manager</rt></ruby>之间有着一条模糊的界限。
|
||||
|
||||
你已经知道了引导程序是什么。它会首先启动,然后将内核加载到内存中并执行它。引导管理器则允许你在不同的操作系统之间进行选择(如果你的电脑上不止一个操作系统的话)。引导管理器并不会直接加载系统。
|
||||
|
||||
随着 Linux 内核 3.3 版本的推出,[Linux 内核包括了一个内置的 EFI 引导程序][6]。事实上,任何一个[支持 EFI 的系统都包括一个 EFI 引导程序][7]。在支持 EFI 的系统中,固件会读取 <ruby>EFI 系统分区<rt>EFI System Partition</rt></ruby>(ESP)中的 EFI 文件,从而获得启动信息。
|
||||
|
||||
这里插入一张图片,图中显示了带有 ESP 分区的分区表:
|
||||
|
||||
![][8]
|
||||
|
||||
GRUB 既是一个引导程序,也是一个引导管理器。一会儿我再来谈 GRUB。让我们先看看其他类似 GRUB 的程序。
|
||||
|
||||
> 小知识:GRUB 是 **GR**and **U**nified **B**ootloader(大一统引导程序) 的首字母缩写。
|
||||
|
||||
### GRUB 屏幕上的那些行是什么意思?
|
||||
|
||||
你会在 GRUB 屏幕上看到几行字。这些行对于不同的设置、不同的发行版会有所不同。
|
||||
|
||||
通常情况下,第一行是你的 Linux 发行版。如果你看到类似高级选项的东西,你可以进入其中,找到一些以 “linux-generic-x-y-z” 等开头的行。
|
||||
|
||||
当你的 Linux 发行版更新内核版本时,它至少会保留一个旧版本。你可以选择启动到旧的 Linux 内核,以防你的系统遇到新更新的 Linux 内核的任何问题。
|
||||
|
||||
在基于 Ubuntu 的发行版中,你也可以看到一个恢复选项。
|
||||
|
||||
![][8a]
|
||||
|
||||
*在高级选项下,通常有一个旧的内核版本和恢复选项*
|
||||
|
||||
在最后,你可能会看到一个条目,如系统设置或 UEFI 设置,以访问系统的 BIOS 设置。
|
||||
|
||||
### 还有哪些类似 GRUB 的引导管理器?
|
||||
|
||||
GRUB 是 Linux 中最流行的引导管理器。但它并不是唯一的一个。有一个高度可定制的引导管理器,名字叫做 [rEFInd 引导管理器][9],它同样受到了一些 Linux 用户的喜爱。
|
||||
|
||||
![定制化的 rEFInd 引导管理器屏幕 | 图片来源:kofler.info/pop_os][10]
|
||||
|
||||
还有一个基于文本的引导管理器,名字叫做 [systemd-boot][11]。你可以猜到这是专为基于 systemd 的 Linux 发行版准备的。有一些发行版正在使用 systemd-boot,比如 Pop OS。
|
||||
|
||||
![Pop OS 中的 systemd-boot | 图片来源:kofler.info/pop_os][12]
|
||||
|
||||
### 访问或编辑 GRUB
|
||||
|
||||
通常你看到的 GRUB 屏幕是它的菜单界面。如果你安装了一个以上的操作系统,它会允许你在其中选择一个来启动。如果你的 Linux 发行版安装了不止一个内核,你也可以选择加载不同的内核。
|
||||
|
||||
根据不同的 Linux 发行版的配置,你的 GRUB 菜单上可能会有一些其他选项。
|
||||
|
||||
你可以在 GRUB 菜单界面按 `e` 键来编辑菜单项。这样你就可以在内核加载前修改它的参数。例如,在某些情况下,[禁用内核提供的图形驱动可以帮助你解决 Linux 系统在启动时卡住的问题][13]。
|
||||
|
||||
![][14]
|
||||
|
||||
你也可以在 GRUB 菜单界面上按 `c` 键来进入 GRUB 的命令行菜单。
|
||||
|
||||
### GRUB 配置文件
|
||||
|
||||
你在菜单界面里对 GRUB 所做的任何改变都是暂时的。如果你想对 GRUB 做一些永久性的改变,比如改变默认的超时时间,你可以在 Linux 系统启动后修改 GRUB 配置文件。
|
||||
|
||||
默认的 GRUB 配置文件是 `/etc/default/grub`。还有一个 `/etc/default/grub.d` 目录,里面也存放一些配置。你可以直接编辑 `/etc/default/grub` 文件,但是我还是建议通过在这个目录中添加配置文件(`.cfg` 文件)进行额外的修改。
|
||||
|
||||
![默认的 GRUB 配置文件][15]
|
||||
|
||||
你必须 [更新 GRUB 才能使这些修改生效][16]。
|
||||
|
||||
### 使用 GRUB 定制器来定制 GRUB
|
||||
|
||||
如果你不太习惯 [在终端里使用文本编辑器编辑文件][17],你可以 [使用一个叫做 GRUB 定制器的图形工具][18]。
|
||||
|
||||
它允许你改变启动顺序、默认超时时间等等。你还可以用它来把 GRUB 的背景设置成一张自定义的墙纸。
|
||||
|
||||
![][19]
|
||||
|
||||
GRUB 定制器可以在 Ubuntu 20.04 中从 Universe 仓库安装,在 Ubuntu 18.04 中 [通过 PPA 安装][22]。它可以 [通过 AUR][23] 在基于 Arch Linux 的发行版中使用。
|
||||
|
||||
### 总结
|
||||
|
||||
至此,本文几乎涉及到了所有与 GRUB 相关的简单内容。至于 EFI、引导加载和 GRUB 本身,它们都是详细而复杂的话题,因此不在本文的讨论范围之内。这篇文章旨在给你一个关于 GRUB 引导程序的总体概述。
|
||||
|
||||
或许我以后会写一篇关于 GRUB 的详细指南,解释它底层的一些细节。目前,如果你想了解更多关于 GRUB 的信息,你可以在你的 Linux 终端里使用 `info grub` 命令访问到 GRUB 文档。
|
||||
|
||||
![你可以在终端中访问 GRUB 手册][20]
|
||||
|
||||
我希望你现在对什么是 GRUB 有了一点点的了解。这里有一个 GIF 动图供你一乐。
|
||||
|
||||
![什么是 GRUB? UEFI 再也伤害不到我了 :)][21]
|
||||
|
||||
或许我没有回答你关于 GRUB 的所有疑问,但请随时在评论区告诉我。我可能会根据你的问题或建议来更新这篇文章。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/what-is-grub/
|
||||
|
||||
作者:[Abhishek Prakash][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/abhishek/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/grub-screen-linux.png?resize=800%2C450&ssl=1
|
||||
[2]: https://www.gnu.org/software/grub/
|
||||
[3]: https://itsfoss.com/what-is-linux/
|
||||
[4]: https://linux.cn/article-12773-1.html
|
||||
[5]: https://linux.cn/article-12579-1.html
|
||||
[6]: https://www.rodsbooks.com/efi-bootloaders/efistub.html
|
||||
[7]: https://jdebp.eu/FGA/efi-boot-process.html
|
||||
[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/disk-partition-gparted.png?resize=744%2C385&ssl=1
|
||||
[8a]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2012/07/boot-into-recovery-mode-ubuntu-1.jpg?w=635&ssl=1
|
||||
[9]: https://www.rodsbooks.com/refind/
|
||||
[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/refind-boot-manager.png?resize=800%2C602&ssl=1
|
||||
[11]: https://wiki.gentoo.org/wiki/Systemd-boot
|
||||
[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/systemd-boot.png?resize=714%2C333&ssl=1
|
||||
[13]: https://itsfoss.com/fix-ubuntu-freezing/
|
||||
[14]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/04/editing-grub-to-fix-nvidia-issue.jpg?resize=800%2C343&ssl=1
|
||||
[15]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/11/default-grub-config-file.png?resize=759%2C437&ssl=1
|
||||
[16]: https://itsfoss.com/update-grub/
|
||||
[17]: https://itsfoss.com/command-line-text-editors-linux/
|
||||
[18]: https://itsfoss.com/grub-customizer-ubuntu/
|
||||
[19]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2013/05/make-windows-default-grub-2.jpeg?resize=799%2C435&ssl=1
|
||||
[20]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/grub-manual-Linux-terminal.png?resize=800%2C462&ssl=1
|
||||
[21]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/what_is_GRUB.gif?resize=500%2C343&ssl=1
|
||||
[22]: https://itsfoss.com/ppa-guide/
|
||||
[23]: https://itsfoss.com/aur-arch-linux/
|
@ -0,0 +1,188 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (lkxed)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14431-1.html)
|
||||
[#]: subject: (Power up your Linux terminal text editor with ed)
|
||||
[#]: via: (https://opensource.com/article/20/12/gnu-ed)
|
||||
[#]: author: (Seth Kenlon https://opensource.com/users/seth)
|
||||
|
||||
在 Linux 终端上使用行编辑器 ed
|
||||
======
|
||||
|
||||
> 这个看似简单的编辑器为用户提供了许多易于学习和使用的命令。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202204/04/145334l9w92ngiccginicn.jpg)
|
||||
|
||||
GNU `ed` 命令是一个行编辑器。它被认为是标准的 Unix 文本编辑器,因为它是首个出现在 Unix 的文本编辑器,并且它曾经无处不在,你在任何一个 POSIX 系统中都能找到它(通常来说,你现在也可以)。在某种程度上,你可以很容易看出来它是第一个文本编辑器,因为它在许多方面的功能都十分基础。和其他大多数的文本编辑器不同,它不会打开一个属于自己的窗口或显示区域,事实上,在默认情况下,它甚至不会提示用户输入文字。从另一个方面来说,它在交互功能上的缺失也可以成为一个优点。它是一个多功能的编辑器,你可以用简短的命令控制它,无论是在交互式的命令行中,还是在编写的 shell 脚本里。
|
||||
|
||||
### 安装 ed
|
||||
|
||||
如果你正在使用 Linux 或者 BSD 的话,你很可能已经默认安装了 `ed`(在 Linux 上是 GNU 版 `ed`,而在 BSD 上是 BSD 版 `ed`)。但是,一些极简的环境可能没有包括 `ed`,这也没关系,你的发行版的软件仓库中很可能有 `ed` 可供下载。macOS 默认安装了 BSD 版 `ed`。
|
||||
|
||||
### 启动 ed
|
||||
|
||||
当你启动 `ed` 的时候,你的终端提示符不见了,看起来好像是 `ed` 停止运行了。其实它没有,它只是在等待你输入指令而已。
|
||||
|
||||
```
|
||||
$ ed
|
||||
```
|
||||
|
||||
为使 `ed` 显示更详细的信息,你可以输入命令 `p` 让它返回一个提示符:
|
||||
|
||||
```
|
||||
$ ed
|
||||
p
|
||||
?
|
||||
```
|
||||
|
||||
这个问号(`?`)是默认的 `ed` 提示符。
|
||||
|
||||
### 缓冲区
|
||||
|
||||
当 `ed` 激活时,你其实是在和一个叫 <ruby>缓冲区<rt>buffer</rt></ruby> 的东西打交道。缓冲区是内存中的一块区域。你并不会直接编辑文件,而是在编辑它对应的缓冲区。当你退出 `ed` 却没有把修改保存到磁盘的文件上时,所有的修改都会丢失,因为它们只在缓冲区里存在。(这对于一个已经习惯了初始的 <ruby>草图缓冲区<rt>scratch buffer</rt></ruby> 的资深 Emacs 用户可能很耳熟。)
|
||||
|
||||
### 使用 ed 输入文本
|
||||
|
||||
启动 `ed` 后,你处于命令模式。这意味着你可以向编辑器发送指令,比如让它显示一个提示符,而不是空白区域。你可以使用 `a` 命令开始附加文本到当前的缓冲区,使用一个实心的点 `.` 来终止输入。比如,下面的这个例子往缓冲区里附加了两行文字(“hello world” 和 “hello ed”):
|
||||
|
||||
```
|
||||
?
|
||||
a
|
||||
hello world
|
||||
hello ed
|
||||
.
|
||||
```
|
||||
|
||||
使用点 `.` 终止输入后,你将回到命令模式。
|
||||
|
||||
### 查看缓冲区
|
||||
|
||||
怎样查看当前缓冲区里都有什么呢?你可以输入想要查看的行号,也可以使用 `,p` 命令来显示所有的行:
|
||||
|
||||
```
|
||||
?
|
||||
1
|
||||
hello world
|
||||
2
|
||||
hello ed
|
||||
,p
|
||||
hello world
|
||||
hello ed
|
||||
```
|
||||
|
||||
### 写入文件
|
||||
|
||||
如果你现在对文本很满意,你可以使用 `w` 命令把缓冲区写入到文件中,后面跟上目标文件名:
|
||||
|
||||
```
|
||||
?
|
||||
w example.txt
|
||||
19
|
||||
```
|
||||
|
||||
写操作后显示的那个数字代表着写入到文件中的字符数。
|
||||
|
||||
### 读取文件
|
||||
|
||||
除了使用 `ed` 来读取文本,你也可以使用 `r` 命令把一个已经存在的文件加载到到缓冲区里:
|
||||
|
||||
```
|
||||
?
|
||||
r myfile.txt
|
||||
```
|
||||
|
||||
另外,你也可以在启动 `ed` 时,在它后面加上你想要加载到缓冲区里的文件名:
|
||||
|
||||
```
|
||||
$ ed myfile.txt
|
||||
```
|
||||
|
||||
### 编辑缓冲区
|
||||
|
||||
鉴于 `ed` 是一个文本编辑器,你当然可以使用一种特殊的语法来编辑缓冲区里的文本。使用 `sed` 或 `vim` 的用户或许会觉得这个语法很熟悉。假设现在缓冲区里已经加载了一个文件:
|
||||
|
||||
```
|
||||
$ ed myfile.txt
|
||||
,p
|
||||
This is an example document.
|
||||
There is some text, but not much.
|
||||
There is some errors, but not much.
|
||||
```
|
||||
|
||||
如果你要把第一句话中的 `document` 修改为 `file`,你可以先选择目标行(`1`),然后使用 `s` 命令调用搜索函数,后面跟着搜索文本和替换文本:
|
||||
|
||||
```
|
||||
?
|
||||
1
|
||||
This is an example document.
|
||||
s/document/file/
|
||||
1
|
||||
This is an example file.
|
||||
```
|
||||
|
||||
如果你要编辑其他行,步骤也是一样的,只需提供一个不同的行号即可:
|
||||
|
||||
```
|
||||
?
|
||||
3
|
||||
There is some errors, but not much.
|
||||
s/is/are/
|
||||
s/much/many/
|
||||
```
|
||||
|
||||
你可以使用 `,p` 命令来看到你对缓冲区的历史编辑记录:
|
||||
|
||||
```
|
||||
This is an example file.
|
||||
There is some text, but not much.
|
||||
There are some errors, but not many.
|
||||
```
|
||||
|
||||
当然,这些修改只存在于缓冲区里。你如果在 `ed` 编辑器外查看这个文件,你只会看到原始的文本:
|
||||
|
||||
```
|
||||
$ cat myfile.txt
|
||||
This is an example document.
|
||||
There is some text, but not much.
|
||||
There is some errors, but not much.
|
||||
```
|
||||
|
||||
如果你要把这些修改保存回文件中,使用 `w` 命令即可:
|
||||
|
||||
```
|
||||
w myfile.txt
|
||||
258
|
||||
```
|
||||
|
||||
### 清空缓冲区
|
||||
|
||||
如果想要得到一个新的缓冲区,以此来打开一个新的文件,或者把一个新的文件加载到不同的环境中,你可以使用 `c` 命令。使用这个清空缓冲区后,什么也不会输出,因为缓冲已经是空的了:
|
||||
|
||||
```
|
||||
c
|
||||
,p
|
||||
```
|
||||
|
||||
### 退出
|
||||
|
||||
如果要退出当前的 `ed` 会话,你可以使用 `q` 命令。它并不会给你一个保存缓冲区的机会,所以你要确保自己在这之前执行了保存操作。
|
||||
|
||||
### 尝试一下 ed 吧
|
||||
|
||||
`ed` 还可以做到很多事情,学习 `ed` 可以让你知道它和部分的 `vim` 是如何工作的。我并没有尝试使用 `ed` 来写这篇文章,老实说,我也不认为它是通常意义上的最佳文本编辑器。但是,`ed` 仍然是一个出色的编辑器。通过阅读它的文档,你可以很轻松地学会它。在 GNU 系统上,你可以使用 `info ed` 来查看它的操作手册。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/20/12/gnu-ed
|
||||
|
||||
作者:[Seth Kenlon][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/seth
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/terminal_command_linux_desktop_code.jpg?itok=p5sQ6ODE (Terminal command prompt on orange background)
|
@ -0,0 +1,156 @@
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "hwlife"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14419-1.html"
|
||||
[#]: subject: "Install Privacy-friendly WhatsApp Alternative Signal on Linux Desktop"
|
||||
[#]: via: "https://itsfoss.com/install-signal-ubuntu/"
|
||||
[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/"
|
||||
|
||||
在 Linux 桌面上安装隐私友好的 Signal
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202204/01/101558k7l28z2lh3h8655h.jpg)
|
||||
|
||||
自从我们报道将 Signal 作为即时通讯软件的理想选择以来,已经过去一年多了。虽然具有隐私意识的人和静态技术的人已经意识到了这个了不起的软件的存在,与此同时,在最近的 WhatsApp 隐私政策更新之后,Signal 更是得到了很多人的褒奖。
|
||||
|
||||
无论什么原因,如果你对 Signal 一无所知,想知道是否能在桌面上使用 Signal,那么答案是肯定的。你可以在 Linux、Windows 和 macOS 系统以及智能手机上安装 Signal。
|
||||
|
||||
![Signal Messenger on Pop OS Linux distribution][3]
|
||||
|
||||
我不打算强调 Signal 的功能,因为你可能已经有所了解。我只想向你展示在 Linux 桌面上安装 Signal 的不同方法:
|
||||
|
||||
* 用 Snap 包在 Liunx 上安装 Signal(Snap 应用程序需要更长的时间来加载,但可以获得自动更新和轻松的安装)
|
||||
* 用 apt 包在基于 Debian 和 Ubuntu 的发行版上安装 Signal(添加软件库需要额外的操作,但已安装的应用程序会自动更新)
|
||||
* 用 AUR 在 Arch 和 Manjaro Linux 上安装 Signal
|
||||
* 用 Flatpak 包在 Fedora 等 Linux 系统上安装 Signal
|
||||
|
||||
你可以基于你的发行版和偏好来选择这些安装方法的其中一种:
|
||||
|
||||
### 方法 1:用 Snap 包在 Linux 上安装 Signal
|
||||
|
||||
如果你正在使用 Ubuntu,你可以在软件中心找到 Signal 桌面版程序的 Snap 格式的软件包。
|
||||
|
||||
![][4]
|
||||
|
||||
或者,你可以在任何 [有 Snap 包支持功能的 Linux 发行版][6] 上 [使用 Snap 命令][5] 安装 Signal。
|
||||
|
||||
```
|
||||
sudo snap install signal-desktop
|
||||
```
|
||||
|
||||
你可以使用 `snap remove` 命令或者从软件中心删除它。
|
||||
|
||||
有些人不喜欢 Snap 包是因为它们启动时间太长。好消息是你能够使用 `apt` 命令来安装 Signal。下一节我们讨论它。
|
||||
|
||||
### 方法 2:通过 apt 在基于 Debian 和 Ubuntu 的发行版上安装 Signal(使用官方 Signal 仓库)
|
||||
|
||||
这里是你在 Debian、Ubuntu、Linux Mint、elementary OS 和基于 Debian/Ubuntu 的其他发行版中安装 Signal 必须遵循的步骤。你可以 [复制这些命令并将其粘贴到终端][7]。
|
||||
|
||||
第一件事是得到官方 Signal 仓库的 GPG 密钥,并且把它加入到你的 APT 包管理器可信任的密钥中。
|
||||
|
||||
```
|
||||
wget -O- https://updates.signal.org/desktop/apt/keys.asc | sudo apt-key add -
|
||||
```
|
||||
|
||||
密钥添加之后,你可以将仓库安全的添加的你的系统中。**不要因为仓库名称使用了 xenial 就惊慌失措**。它可以在 Ubuntu 18.04、20.04 和更新的版本以及 Debian、Mint 等系统中工作。
|
||||
|
||||
```
|
||||
echo "deb [arch=amd64] https://updates.signal.org/desktop/apt xenial main" | sudo tee -a /etc/apt/sources.list.d/signal-xenial.list
|
||||
```
|
||||
|
||||
借助 [Linux 的 tee 命令][8],在 `/etc/apt/sources.list.d` 目录下你将会有一个叫做 `signal-xenial.list` 的新文件。这个新文件有 Signal 仓库信息即 `deb [arch=amd64] https://updates.signal.org/desktop/apt xenial main`。
|
||||
|
||||
既然你已经添加了仓库,那么来更新缓存并安装 Signal 桌面程序吧:
|
||||
|
||||
```
|
||||
sudo apt update && sudo apt install signal-desktop
|
||||
```
|
||||
|
||||
一旦安装成功,在程序菜单找到 Signal 然后启动它。
|
||||
|
||||
![][9]
|
||||
|
||||
由于你已经添加了仓库,你安装的 Signal 程序将会伴随系统日常更新而自动更新。
|
||||
|
||||
享受在 Linux 桌面上使用 Signal 加密通讯的乐趣吧。
|
||||
|
||||
#### 删除 Signal
|
||||
|
||||
如果我不分享给你删除的步骤,那么指南是不完整的。让我们看一下。
|
||||
|
||||
首先,删除该程序:
|
||||
|
||||
```
|
||||
sudo apt remove signal-desktop
|
||||
```
|
||||
|
||||
你可以留下它,也可以从系统中删除 Signal 仓库。对你来说是都是可以的。仓库继续在系统里的话,你可以轻松的再次安装 Signal。如果你删除了仓库的话,你得按照之前的步骤再次重新添加仓库。
|
||||
|
||||
如果你也想同时删除掉 Signal 仓库,你可以选择图形化方法,通过“软件和更新”工具,在那里删除它。
|
||||
|
||||
![][10]
|
||||
|
||||
或者,你可以用 `rm` 命令来删除这个文件:
|
||||
|
||||
```
|
||||
rm -i /etc/apt/sources.list.d/signal-xenial.list
|
||||
```
|
||||
|
||||
### 方法 3:用 AUR 在 Arch 和 Manjaro Linux 上安装 Signal
|
||||
|
||||
通过 [AUR][12] 在 [基于 Arch 的 Linux 发行版][11] 上安装 Signal 是有效的。如果你在 Manjaro 上使用 Pamac 并且启用了 AUR,在包管理器里你可以找到 Signal。
|
||||
|
||||
否则,你可以经常 [使用 AUR 辅助工具][13]。
|
||||
|
||||
```
|
||||
sudo yay -Ss <package-name>
|
||||
```
|
||||
|
||||
我相信你能够在相似的功能中删除 Signal。
|
||||
|
||||
### 方法 4:用 Flatpak 包在 Fedora 等 Linux 系统上安装 Signal
|
||||
|
||||
Signal 没有 RPM 的安装文件。然而,[Flatpak 包是有的][14],你可以在 Fedora 上用它来安装 Signal。
|
||||
|
||||
```
|
||||
flatpak install flathub org.signal.Signal
|
||||
```
|
||||
|
||||
一旦安装成功,你可以从菜单中运行它,或者在终端中输入以下命令:
|
||||
|
||||
```
|
||||
flatpak run org.signal.Signal
|
||||
```
|
||||
|
||||
|
||||
Signal 和 Telegram 是抛弃掉 WhatsApp 的两个主流而可行的选择。这两个软件都提供原生的 Linux 桌面程序。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/install-signal-ubuntu/
|
||||
|
||||
作者:[Abhishek Prakash][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[hwlife](https://github.com/hwlife)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/abhishek/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://itsfoss.com/signal-messaging-app/
|
||||
[2]: https://signal.org/
|
||||
[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/12/signal-shot.jpg?resize=800%2C565&ssl=1
|
||||
[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/signal-desktop-ubuntu.png?resize=800%2C425&ssl=1
|
||||
[5]: https://itsfoss.com/use-snap-packages-ubuntu-16-04/
|
||||
[6]: https://itsfoss.com/install-snap-linux/
|
||||
[7]: https://itsfoss.com/copy-paste-linux-terminal/
|
||||
[8]: https://linuxhandbook.com/tee-command/
|
||||
[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/signal-app-in-ubuntu.jpg?resize=795%2C230&ssl=1
|
||||
[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/remove-signal-repository.png?resize=800%2C401&ssl=1
|
||||
[11]: https://itsfoss.com/arch-based-linux-distros/
|
||||
[12]: https://itsfoss.com/aur-arch-linux/
|
||||
[13]: https://itsfoss.com/best-aur-helpers/
|
||||
[14]: https://flathub.org/apps/details/org.signal.Signal
|
||||
[15]: https://t.me/joinchat/AAAAAEPRGUJrEE1itjpH6A
|
@ -0,0 +1,160 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (hwlife)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14524-1.html)
|
||||
[#]: subject: (Automate setup and delivery for virtual machines in the cloud)
|
||||
[#]: via: (https://opensource.com/article/21/1/testcloud-virtual-machines)
|
||||
[#]: author: (Sumantro Mukherjee https://opensource.com/users/sumantro)
|
||||
|
||||
在云端自动化设置和交付虚拟机
|
||||
======
|
||||
|
||||
> 通过使用 Testcloud 自动化设置过程并交付一个准备运行的虚拟机,在几分钟之内准备好一个云镜像。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202204/30/130336l2l1a77p7m8hwp28.jpg)
|
||||
|
||||
如果你是一个在云端使用 Fedora [qcow2 镜像][2] 的开发者或者爱好者,在一个镜像准备使用之前,你总是不得不做一大堆初始化设置。我对此深有体会,所以我很想找到一种使设置过程更加简单的方法。碰巧,整个 Fedora 质量保证团队也有同感,所以我们开发了 [Testcloud][3] 。
|
||||
|
||||
Testcloud 是一个可以轻松的在几分钟之内准备云镜像测试的工具。它用几个命令就可以在云端自动化设置并交付准备运行的虚拟机(VM)。
|
||||
|
||||
Testcloud:
|
||||
|
||||
1. 下载 qcow2 镜像
|
||||
2. 用你选择的名称创建实例
|
||||
3. 创建一个密码为 `passw0rd`,用户名为 `fedora` 的用户
|
||||
4. 分配一个 IP 地址,以便于你之后用 SSH 登录到云端
|
||||
5. 启动、停止、删除和列出一个实例
|
||||
|
||||
### 安装 Testcloud
|
||||
|
||||
要开始你的旅程,首先你必须安装 Testcloud 软件包。你可以通过终端或者“软件”应用来安装它。在这两种情况下,软件包的名字都是 `testcloud` 。用以下命令安装:
|
||||
|
||||
```
|
||||
$ sudo dnf install testcloud -y
|
||||
```
|
||||
|
||||
一旦安装完成,将你所需要的用户添加到 `testcloud` 用户组,这有助于 Testcloud 自动完成设置过程的剩余部分。执行这两个命令,添加你的用户到 `testcloud` 用户组,并通过提升组权限重启会话:
|
||||
|
||||
```
|
||||
$ sudo usermod -a -G testcloud $USER
|
||||
$ su - $USER
|
||||
```
|
||||
|
||||
![添加用户到 testcloud 组][4]
|
||||
|
||||
### 像老手一样玩转云镜像
|
||||
|
||||
一旦你的用户获得了所需的组权限,创建一个实例:
|
||||
|
||||
```
|
||||
$ testcloud instance create <instance name> -u <url for qcow2 image>
|
||||
```
|
||||
|
||||
或者,你可以使用 `fedora:latest/fedora:XX`(`XX` 是你的 Fedora 发行版本)来代替 完整的 URL 地址:
|
||||
|
||||
```
|
||||
$ testcloud instance create <instance name> -u fedora:latest
|
||||
```
|
||||
|
||||
这将返回你的虚拟机的 IP 地址:
|
||||
|
||||
```
|
||||
$ testcloud instance create testcloud272593 -u https://download.fedoraproject.org/pub/fedora/linux/releases/33/Cloud/x86_64/images/Fedora-Cloud-Base-33-1.2.x86_64.qcow2
|
||||
[...]
|
||||
INFO:Successfully booted instance testcloud272593
|
||||
The IP of vm testcloud272593: 192.168.122.202
|
||||
------------------------------------------------------------
|
||||
To connect to the VM, use the following command (password is 'passw0rd'):
|
||||
ssh fedora@192.168.122.202
|
||||
```
|
||||
|
||||
你可以用默认用户 `fedora` 登录,密码是 `passw0rd`(注意是零)。你可以使用 `ssh`、`virt-manager` 或者支持连接到 libvirt 虚拟机方式来连接到它。
|
||||
|
||||
另一种创建 Fedora 云的方式是:
|
||||
|
||||
```
|
||||
$ testcloud instance create testcloud193 -u fedora:33
|
||||
|
||||
WARNING:Not proceeding with backingstore cleanup because there are some testcloud instances running.
|
||||
You can fix this by following command(s):
|
||||
testcloud instance stop testcloud272593
|
||||
|
||||
DEBUG:Local downloads will be stored in /var/lib/testcloud/backingstores.
|
||||
DEBUG:successfully changed SELinux context for image /var/lib/testcloud/backingstores/Fedora-Cloud-Base-33-1.2.x86_64.qcow2
|
||||
DEBUG:Creating instance directories
|
||||
DEBUG:creating seed image /var/lib/testcloud/instances/testcloud193/testcloud193-seed.img
|
||||
INFO:Seed image generated successfully
|
||||
INFO:Successfully booted instance testcloud193
|
||||
The IP of vm testcloud193: 192.168.122.225
|
||||
------------------------------------------------------------
|
||||
To connect to the VM, use the following command (password is 'passw0rd'):
|
||||
ssh fedora@192.168.122.225
|
||||
------------------------------------------------------------
|
||||
```
|
||||
|
||||
### 玩转实例
|
||||
|
||||
Testcloud 可以用来管理实例。这包括像列出镜像或者停止和启动一个实例等活动。
|
||||
|
||||
要列出实例,使用 `list` 子命令:
|
||||
|
||||
```
|
||||
$ testcloud instance list
|
||||
Name IP State
|
||||
------------------------------------------------------------
|
||||
testcloud272593 192.168.122.202 running
|
||||
testcloud193 192.168.122.225 running
|
||||
testcloud252793 192.168.122.146 shutoff
|
||||
testcloud93 192.168.122.152 shutoff
|
||||
```
|
||||
|
||||
要停止一个运行的实例:
|
||||
|
||||
```
|
||||
$ testcloud instance stop testcloud193
|
||||
DEBUG:stop instance: testcloud193
|
||||
DEBUG:stopping instance testcloud193.
|
||||
```
|
||||
|
||||
要删除一个实例:
|
||||
|
||||
```
|
||||
$ testcloud instance destroy testcloud193
|
||||
DEBUG:remove instance: testcloud193
|
||||
DEBUG:removing instance testcloud193 from libvirt.
|
||||
DEBUG:Unregistering instance from libvirt.
|
||||
DEBUG:removing instance /var/lib/testcloud/instances/testcloud193 from disk
|
||||
```
|
||||
|
||||
要重启一个运行中的实例:
|
||||
|
||||
```
|
||||
$ testcloud instance reboot testcloud93
|
||||
DEBUG:stop instance: testcloud93
|
||||
[...]
|
||||
INFO:Successfully booted instance testcloud93
|
||||
The IP of vm testcloud93: 192.168.122.152
|
||||
usage: testcloud [-h] {instance,image} ...
|
||||
```
|
||||
|
||||
尝试一下 Testcloud ,在评论中让我知道你的想法。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/1/testcloud-virtual-machines
|
||||
|
||||
作者:[Sumantro Mukherjee][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[hwlife](https://github.com/hwlife)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/sumantro
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/tips_map_guide_ebook_help_troubleshooting_lightbulb_520.png?itok=L0BQHgjr (Looking at a map)
|
||||
[2]: https://en.wikipedia.org/wiki/Qcow
|
||||
[3]: https://pagure.io/testcloud
|
||||
[4]: https://opensource.com/sites/default/files/uploads/adduser.png (Add user to testcloud group)
|
||||
[5]: https://creativecommons.org/licenses/by-sa/4.0/
|
@ -0,0 +1,256 @@
|
||||
[#]: subject: (Build a router with mobile connectivity using Raspberry Pi)
|
||||
[#]: via: (https://opensource.com/article/21/3/router-raspberry-pi)
|
||||
[#]: author: (Lukas Janėnas https://opensource.com/users/lukasjan)
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (hwlife)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14474-1.html)
|
||||
|
||||
使用树莓派建立一个带有移动网络连接功能的路由器
|
||||
======
|
||||
|
||||
> 在你的网络路由器上使用 OpenWRT 获得更多控制功能。
|
||||
|
||||
![Mesh networking connected dots][1]
|
||||
|
||||
树莓派是一种小型单板电脑,尽管只有信用卡大小,但是能做许多事情。实际上,这个小电脑几乎可以成为你想让它成为的任何东西,只要你打开想象力。
|
||||
|
||||
树莓派爱好者已经做了许多不同的项目,从简单的程序到复杂的自动化项目和解决方案,如气象站,甚至智能家居设备。这篇文章将展示怎样使用 OpenWRT 项目将你的树莓派变成带有 LTE 移动网络连接功能的路由器。
|
||||
|
||||
### 关于 OpenWRT 和 LTE
|
||||
|
||||
[OpenWRT][2] 是一个利用 Linux 内核为嵌入式设备开发的开源项目,它已经存在超过 15 年了,拥有一个庞大而活跃的社区。
|
||||
|
||||
有许多使用 OpenWRT 的方法,但是它的主要目的还是用在路由器上。它提供了包管理功能和一个完全可写的文件系统,并且因为它的的开源属性,你可以查看和修改代码,并贡献到开源生态。如果你想对你的路由器获得更多的控制,这就是你想要的系统。
|
||||
|
||||
<ruby>长期演进技术<rt>Long-term evolution</rt></ruby>(LTE)是一个基于 GSM/EGDE 和 UMTS/HSPA 技术的无线宽带通信标准。我使用的 LTE 调制解调器是一个 USB 设备,可以为树莓派电脑增加 3G 或 4G(LTE)蜂窝连接。
|
||||
|
||||
![Teltonika TRM240 modem][3]
|
||||
|
||||
### 安装前的准备
|
||||
|
||||
对这个项目来说,你需要:
|
||||
|
||||
* 一个带有电源线的树莓派
|
||||
* 一台运行 Linux 的电脑
|
||||
* 一张至少 16GB 的 SD 储存卡
|
||||
* 以太网线
|
||||
* LTE 调制解调器(我使用的是 Teltonika [TRM240][5])
|
||||
* 一张移动网络的 SIM 卡
|
||||
|
||||
### 安装 OpenWRT
|
||||
|
||||
首先,下载最新的 [兼容树莓派的 OpenWRT 的发布版本][6]。在 OpenWRT 官网,你可以看到 4 个镜像:两个 **ext4** 文件系统的和两个 **squashfs** 文件系统的。我使用 **ext4** 文件系统。你可以下载 **factory** 或者 **sysupgrade** 镜像,这两个都运行良好。
|
||||
|
||||
![OpenWRT image files][7]
|
||||
|
||||
下载了镜像后,你按照 [以下的说明][8] 需要解压并安装它到 SD 卡上。这将会花些时间安装固件,需要些耐心。一旦安装完成,在你的 SD 卡上将会有两个分区。一个是用来放 bootloader ,另一个是 OpenWRT 系统。
|
||||
|
||||
|
||||
### 启动系统
|
||||
|
||||
要启动你的新系统,插入 SD 卡到树莓派,用以太网线把树莓派和你的路由器(或者交换机)相连,然后点亮。
|
||||
|
||||
如果你有使用树莓派的经验,你可能习惯于通过终端使用 SSH 访问过它,或者通过显示器和键盘连接到树莓派。OpenWRT 工作有一点点不同。你与这个系统交互是通过网页浏览器,所以你必须能够通过网络来访问你的树莓派。
|
||||
|
||||
缺省状态下,树莓派使用的 IP 地址是:192.168.1.1。用来配置树莓派的计算机必须和树莓派在同一个子网中。如果你的网络没有使用 192.168.1.x 地址,或者你不能确定,在 GNOME 打开 “<ruby>设置<rt>Settings</rt></ruby>” ,导航到网络设置,选择 “<ruby>手动<rt>Manual</rt></ruby>” ,然后键入以下的 IP 地址和子网掩码:
|
||||
|
||||
* IP 地址:192.168.1.15
|
||||
* 网络掩码:255.255.255.0
|
||||
|
||||
![IP addresses][9]
|
||||
|
||||
在你的电脑上打开浏览器然后导航到 192.168.1.1 。这将打开一个验证网页,你可以登录到你的树莓派。
|
||||
|
||||
![OpenWRT login page][10]
|
||||
|
||||
首次登录不需要密码,所以直接点击 “<ruby>登录<rt>Login</rt></ruby>” 按钮继续。
|
||||
|
||||
### 设置网络连接
|
||||
|
||||
树莓派只有一个以太网口,而普通路由器有两个:一个是 WAN(有线区域网络)口,另一个是 LAN (本地区域网络)。
|
||||
|
||||
你有两个选择:
|
||||
|
||||
1. 使用你的以太网口接入互联网
|
||||
2. 使用 WIFI 接入互联网
|
||||
|
||||
#### 使用以太网连接
|
||||
|
||||
你决定使用以太网,导航到 “<ruby>网络<rt>Network</rt></ruby> → <ruby>接口<rt>Interfaces</rt></ruby>”。在这个设置页面,按下与 “LAN” 接口对应的蓝色 “<ruby>编辑<rt>Edit</rt></ruby>” 按钮。
|
||||
|
||||
![LAN interface][11]
|
||||
|
||||
应该会出现一个弹窗,在这个窗口中,你需要键入与你将要连接树莓派的路由器子网匹配的 IP 地址。如果需要的话,修改子网掩码,并输入树莓派将要连接的路由器的 IP 地址。
|
||||
|
||||
![Enter IP in the LAN interface][12]
|
||||
|
||||
保存设置,然后通过以太网将你的树莓派连接到路由器。你现在可以用这个新的 IP 地址访问树莓派。
|
||||
|
||||
当你在把树莓派投入生产环境使用之前,确保为你的 OpenWRT 设置一个密码!
|
||||
|
||||
#### 使用 WiFi 连接
|
||||
|
||||
如果你想通过 WiFi 将树莓派连接到互联网,导航到 “<ruby>网络<rt>Network</rt></ruby> → <ruby>无线<rt>Wireless</rt></ruby>” 。在 “<ruby>无线<rt>Wireless</rt></ruby>” 菜单里,按下蓝色的 “<ruby>扫描<rt>Scan</rt></ruby>” 按钮查找你的家庭网络。
|
||||
|
||||
![Scan the network][13]
|
||||
|
||||
在弹出的窗口中,找到你的 WiFi 网络然后连接它。不要忘记 “<ruby>保存并应用<rt>Save and Apply</rt></ruby>” 设置。
|
||||
|
||||
在这 “<ruby>网络<rt>Network</rt></rby> → <ruby>接口<rt>Interfaces</rt></ruby>” 部分,你应该看到了一个新的接口。
|
||||
|
||||
![New interface][14]
|
||||
|
||||
当你在把树莓派投入生产环境使用之前,确保为你的 OpenWRT 设置一个密码!
|
||||
|
||||
### 安装必要的软件包
|
||||
|
||||
默认状态下,路由器并没有安装许多软件包。OpenWRT 提供了一个包管理器,带有一系列你需要安装的。导航到 “<ruby>系统<rt>System</rt></ruby> → <ruby>软件<rt>Software</rt></ruby>” 然后通过按下标有 “<ruby>更新列表…<rt>Update lists...</rt></ruby>” 的按钮来更新你的包管理器。
|
||||
|
||||
![Updating packages][15]
|
||||
|
||||
你将会看到许多软件包;你需要安装以下这些:
|
||||
|
||||
* `usb-modeswitch`
|
||||
* `kmod-mii`
|
||||
* `kmod-usb-net`
|
||||
* `kmod-usb-wdm`
|
||||
* `kmod-usb-serial`
|
||||
* `kmod-usb-serial-option`
|
||||
* `kmod-usb-serial-wwan`(如果没有安装的话)
|
||||
|
||||
另外,[下载这个调制解调器管理软件包][16],然后在弹出的窗口中按下标有 “<ruby>上传软件包…<rt>Upload Package...</rt></ruby>” 的按钮来安装它。重启树莓派让安装包生效。
|
||||
|
||||
### 设置移动网络接口
|
||||
|
||||
所有这些软件包被安装完之后,你可以设置移动网络接口。在连接调制解调器到树莓派之前,请阅读 [调制解调器的说明书][17],对其进行设置。然后连接你的移动调制解调器到树莓派,然后等待一会直到调制解调器启动。
|
||||
|
||||
导航到 “<ruby>网络<rt>Network</rt></ruby> → <ruby>接口<rt>Interfaces</rt></ruby>”。在页面底部,按下 “<ruby>添加一个新接口…<rt>Add new interface...</rt></ruby>” 按钮。在弹出的窗口中,给你的接口起一个名字(比如 “mobile”),然后从下拉列表中选择 “ModemManager” 。
|
||||
|
||||
![Add a new mobile interface][18]
|
||||
|
||||
按下一个标有 “<ruby>创建接口<rt>Create Interface</rt></ruby>” 的按钮。你应该看到一个新的弹出窗口。这是设置接口的一个主窗口。在这个窗口中,选择你的调制解调器,然后键入像<ruby>接入点名称<rt>Access Point Name</rt></ruby>(APN)或是 PIN 码之类的信息。
|
||||
|
||||
![Configuring the interface][19]
|
||||
|
||||
**注意:** 如果在列表中没有调制解调器设备出现,尝试重启树莓派或者安装 `kmod-usb-net-qmi-wwan` 软件包 。
|
||||
|
||||
当你已经配置完你的接口,按下 “<ruby>保存<rt>Save</rt></ruby>” 然后 “<ruby>保存并应用<rt>Save and Apply</rt></ruby>”。给系统一些生效的时间。如果一切正常,你应该看到像这样的一些东西。
|
||||
|
||||
![Configured interface][20]
|
||||
|
||||
如果你想通过接口查看你的网络连接,你可以使用 SSH 连接到你的树莓派 shell。在终端里,键入:
|
||||
|
||||
```
|
||||
ssh root@192.168.1.1
|
||||
```
|
||||
|
||||
缺省 IP 地址是 192.168.1.1:如果你修改了它,就用修改后的 IP 地址连接。当连接后,在终端里执行命令:
|
||||
|
||||
```
|
||||
ping -I ppp0 google.com
|
||||
```
|
||||
|
||||
如果一切正常运行,那么你应该从 Google 的服务器接收到 ping 回包 。
|
||||
|
||||
![Terminal interface][21]
|
||||
|
||||
`ppp0` 是你创建的移动网络接口的默认接口名称。你可以通过使用 `ifconfig` 命令检查你的接口。它只显示活动的接口。
|
||||
|
||||
### 设置防火墙
|
||||
|
||||
要让移动网接口运行,你需要为移动网络接口和本地网络接口配置防火墙,以便引导流量到正确的接口。
|
||||
|
||||
导航到 “<ruby>网络<rt>Network</rt></ruby> → <ruby>防火墙<rt>Firewall</rt></ruby>”。在页面的底部,你应该看到一个叫做 “<ruby>区域<rt>Zones</rt></ruby>” 的部分。
|
||||
|
||||
![Firewall zones][22]
|
||||
|
||||
设置防火墙最简单的方法就是调整 “wan” 区域。在 “<ruby>已覆盖的网络<rt>Covered networks</rt></ruby>” 选项里按下 “<ruby>编辑<rt>Edit</rt></ruby>” 按钮,选择你的移动网络接口,然后 “<ruby>保存并应用<rt>Save and Apply</rt></ruby>” 你的设置。如果你不想用 WiFi 连接你的树莓派,你可以从 “<ruby>已覆盖的网络<rt>Covered networks</rt></ruby>” 里删除 “wwan” 接口,或者关闭 WiFi 连接。
|
||||
|
||||
![Firewall zone settings][23]
|
||||
|
||||
如果你想为每个接口设置一个独立区域,只需创建一个新区域然后分配必要的接口即可。举个例子,你可能想有一个覆盖移动网络接口的区域,并且通过它来转发 LAN 接口流量。按下 “<ruby>添加<rt>Name</rt></ruby>” 按钮,然后给你的区域 “<ruby>命名<rt>Name</rt></ruby>”, 检查 “伪装” 复选框,选中 “<ruby>已覆盖的网络<rt>Covered networks</rt></ruby>” ,并选择哪些区域可以转发其流量。
|
||||
|
||||
![Firewall zone settings][24]
|
||||
|
||||
然后 “<ruby>保存并应用<rt>Save and Apply</rt></ruby>” 这些修改。现在你有一个新的区域。
|
||||
|
||||
### 设置一个接入点
|
||||
|
||||
最后一步是为你的设备接入互联网设置一个网络接入点。要设置一个接入点,导航到 “<ruby>网络<rt>Network</rt></ruby> → <ruby>无线<rt>Wireless</rt></ruby>” 。你将会看到一个 WiFi 设备接口,一个名为 OpenWRT 的禁用的接入点,以及一个用于通过 WiFi 连接互联网的连接(如果你之前没有禁用或删除它)。在这个禁用的接口上,按下 “<ruby>编辑<rt>Edit</rt></ruby>” 按钮,然后 “<ruby>启用<rt>Enable</rt></ruby>” 该接口。
|
||||
|
||||
![Enabling wireless network][25]
|
||||
|
||||
如果你想,你可以通过编辑 “ESSID” 选项来修改接口名称。你也可以选择它要关联的网络。默认情况下,它会与 LAN 接口关联。
|
||||
|
||||
![Configuring the interface][26]
|
||||
|
||||
要为这个接口添加密码,选择 “<ruby>无线安全<rt>Wireless Security</rt></ruby>” 选项,选择 “WPA2-PSK” 加密方式然后在 “<ruby>密钥<rt>Key</rt></ruby>” 选项字段键入接口的密码。
|
||||
|
||||
![Setting a password][27]
|
||||
|
||||
然后 “<ruby>保存并应用<rt>Save and Apply</rt></ruby>” 设置。如果设置正确的话,当用你的设备扫描可用接入点的话,你应该可以看到你分配了名称的新接入点。
|
||||
|
||||
### 额外的软件包
|
||||
|
||||
如果你愿意,你可以通过网页界面为你的路由器下载额外的软件包。只需到 “<ruby>系统<rt>System</rt></ruby> → <ruby>软件<rt>Software</rt></ruby>” 然后安装你想从列表或者互联网上下载的软件包并上传它。如果你在列表中没有看到任何软件包,请按下 “<ruby>更新列表…<rt>Update lists...</rt></ruby>” 按钮。
|
||||
|
||||
你也可以添加其他拥有适合与 OpenWRT 一起使用的软件包的仓库。软件包和它们的网页界面是分开安装的。软件包名称是以 “luci-” 开始的是网页界面软件包。
|
||||
|
||||
![Packages with luci- prefix][28]
|
||||
|
||||
### 试试看
|
||||
|
||||
这就是我的树莓派路由设置的过程。
|
||||
|
||||
![Raspberry Pi router][29]
|
||||
|
||||
从树莓派建立一个路由器不是很困难。缺点是树莓派只有一个以太网接口。你可以用一个 USB-to-Ethernet 适配器来增加更多的网口。不要忘记在接口的网站上设置网口。
|
||||
|
||||
OpenWRT 支持大量的移动调制解调器,你可以用管理调制解调器的通用工具 modemmanager 为它们设置移动网络接口。
|
||||
|
||||
你有没有把你的树莓派当作路由器使用?请在评论中告诉我们情况。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/3/router-raspberry-pi
|
||||
|
||||
作者:[Lukas Janėnas][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[hwlife](https://github.com/hwlilfe)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/lukasjan
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/mesh_networking_dots_connected.png?itok=ovINTRR3 (Mesh networking connected dots)
|
||||
[2]: https://openwrt.org/
|
||||
[3]: https://opensource.com/sites/default/files/uploads/lte_modem.png (Teltonika TRM240 modem)
|
||||
[4]: https://creativecommons.org/licenses/by-sa/4.0/
|
||||
[5]: https://teltonika-networks.com/product/trm240/
|
||||
[6]: https://downloads.openwrt.org/releases/19.07.7/targets/brcm2708/bcm2710/
|
||||
[7]: https://opensource.com/sites/default/files/uploads/imagefiles.png (OpenWRT image files)
|
||||
[8]: https://opensource.com/article/17/3/how-write-sd-cards-raspberry-pi
|
||||
[9]: https://opensource.com/sites/default/files/uploads/ipaddresses.png (IP addresses)
|
||||
[10]: https://opensource.com/sites/default/files/uploads/openwrt-login.png (OpenWRT login page)
|
||||
[11]: https://opensource.com/sites/default/files/uploads/lan-interface.png (LAN interface)
|
||||
[12]: https://opensource.com/sites/default/files/uploads/lan-interface-ip.png (Enter IP in the LAN interface)
|
||||
[13]: https://opensource.com/sites/default/files/uploads/scannetwork.png (Scan the network)
|
||||
[14]: https://opensource.com/sites/default/files/uploads/newinterface.png (New interface)
|
||||
[15]: https://opensource.com/sites/default/files/uploads/updatesoftwarelist.png (Updating packages)
|
||||
[16]: https://downloads.openwrt.org/releases/packages-21.02/aarch64_cortex-a53/luci/luci-proto-modemmanager_git-21.007.43644-ab7e45c_all.ipk
|
||||
[17]: https://wiki.teltonika-networks.com/view/TRM240_SIM_Card
|
||||
[18]: https://opensource.com/sites/default/files/uploads/addnewinterface.png (Add a new mobile interface)
|
||||
[19]: https://opensource.com/sites/default/files/uploads/configureinterface.png (Configuring the interface)
|
||||
[20]: https://opensource.com/sites/default/files/uploads/configuredinterface.png (Configured interface)
|
||||
[21]: https://opensource.com/sites/default/files/uploads/terminal.png (Terminal interface)
|
||||
[22]: https://opensource.com/sites/default/files/uploads/firewallzones.png (Firewall zones)
|
||||
[23]: https://opensource.com/sites/default/files/uploads/firewallzonesettings.png (Firewall zone settings)
|
||||
[24]: https://opensource.com/sites/default/files/uploads/firewallzonepriv.png (Firewall zone settings)
|
||||
[25]: https://opensource.com/sites/default/files/uploads/enablewirelessnetwork.png (Enabling wireless network)
|
||||
[26]: https://opensource.com/sites/default/files/uploads/interfaceconfig.png (Configuring the interface)
|
||||
[27]: https://opensource.com/sites/default/files/uploads/interfacepassword.png (Setting a password)
|
||||
[28]: https://opensource.com/sites/default/files/uploads/luci-packages.png (Packages with luci- prefix)
|
||||
[29]: https://opensource.com/sites/default/files/uploads/raspberrypirouter.jpg (Raspberry Pi router)
|
@ -0,0 +1,183 @@
|
||||
[#]: subject: (Partition a drive on Linux with GNU Parted)
|
||||
[#]: via: (https://opensource.com/article/21/4/linux-parted-cheat-sheet)
|
||||
[#]: author: (Seth Kenlon https://opensource.com/users/seth)
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (hwlife)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14463-1.html)
|
||||
|
||||
在 Linux 上使用 GNU Parted 对磁盘分区
|
||||
======
|
||||
|
||||
> 了解对新的储存设备分区的基础知识,然后下载我们的速查表,让信息近在咫尺。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202204/12/162040edndfpnkn8233ppd.jpg)
|
||||
|
||||
在 21 世纪,我们往往认为数据存储是理所当然的。我们有许多存储介质,相对价格便宜,而且有许多不同的可用类型。然而,不论你获得的免费云存储空间有多少,没有比有一个物理硬盘空间来存储重要的数据更好了(或容量真的很大的,而当你又在一个慢速网络上时)。然而,没有几块硬盘买回来就是现成的,至少在理想的状况下可以直接使用的。无论你是买了一块新硬盘,还用不同分区安装一个系统,你需要知道怎么在 Linux 上为磁盘分区。
|
||||
|
||||
这篇文章介绍了 GNU Parted ,它磁盘分区最好的工具之一。如果你偏向使用图形化程序,而不算终端命令行,请阅读我的《[为 Linux 格式化驱动器][2]》这篇文章。
|
||||
|
||||
### 磁盘标签、分区和文件系统
|
||||
|
||||
技术上来说,一个硬盘驱动器不需要很多软件,就可用作存储设备。然而,在没有分区表和文件系统等现代惯例的情况下使用硬盘是困难的、不切实际的,而且对你的数据不安全。
|
||||
|
||||
关于硬盘驱动器,这里有三个你需要知道的重要概念:
|
||||
|
||||
* <ruby>磁盘标签<rt>disk label</rt></ruby>(或者 <ruby>分区表<rt>partition table</rt></ruby>)是放置在磁盘驱动器起始位置的元数据,它告诉计算机可用的存储是何种类型、以及它在磁盘驱动器的位置等信息。
|
||||
* <ruby>分区<rt>partition</rt></ruby> 是一个识别文件系统位置的边界。举个例子,如果你有一个 512GB 的硬盘,你可以用占用所有磁盘容量(512GB)分成一个分区,或者分成两个分区,每个占用 256GB ,或者分成三个分区,占用各种不同大小的空间等等。
|
||||
* <ruby>文件系统<rt>filesystem</rt></ruby> 是一个硬盘驱动器和计算机两者约定俗成的存储方案。计算机必须知道怎样读取文件系统来拼凑存储在驱动器上的数据,并且必须知道怎样写入数据到文件系统并保持数据的完整性。
|
||||
|
||||
GNU Parted 程序管理着前两个概念:磁盘标签和分区。Parted 对文件系统有所了解,但是它把文件系统的实现细节交给了其他类似 `mkfs` 这样的工具。
|
||||
|
||||
> 下载 [GNU Parted 速查表][3]
|
||||
|
||||
### 确定磁盘驱动器的位置
|
||||
|
||||
使用 GNU Parted 之前,你必须确定你的驱动器在你的系统上的位置。首先,将你要格式化的磁盘驱动器连接到你的系统,然后用 `parted` 命令查看连接到你的计算机的设备:
|
||||
|
||||
```
|
||||
$ parted /dev/sda print devices
|
||||
/dev/sda (2000GB)
|
||||
/dev/sdb (1000GB)
|
||||
/dev/sdc (1940MB)
|
||||
```
|
||||
|
||||
你最新连接设备的名称在字母表上晚于连接时间更长的设备。举个例子,`/dev/sdc` 最有可能是我刚刚连接的磁盘。我能通过它的容量大小来确认,相比于我的工作站上的主要驱动器的 TB 大小来说,因为我知道我插入的 U 盘只有 2GB(1940MB,足够接近)大小。如果你不能确定,你可以得到的更多关于你想要分区的驱动器的信息:
|
||||
|
||||
```
|
||||
$ parted /dev/sdc print
|
||||
Model: Yoyodyne Tiny Drive 1.0 (scsi)
|
||||
Disk /dev/sdc: 1940MB
|
||||
Sector size (logical/physical): 512B/512B
|
||||
Partition Table: msdos
|
||||
Disk Flags:
|
||||
|
||||
Number Start End Size File system Name Flags
|
||||
1 1049kB 2048kB 1024kB BS Bloat Hidden
|
||||
2 2049kB 1939MB 1937MB FAT32 MyDrive
|
||||
```
|
||||
|
||||
有些驱动器比其他驱动器有更多的元数据。这个磁盘表明它的物理驱动器品牌是 Yoyodyne ,此外,在磁盘的起始处包含了一个小的隐藏分区,后面是一个兼容 Windows 的臃肿的 FAT32 分区。这确实是我要重新打算格式化的驱动器。
|
||||
|
||||
继续之前,_确认_ 你已经确定了要分区的正确驱动器。 _对错误的驱动器重新分区会导致数据丢失。_ 为了安全起见,在本文中所有具有潜在破环性的命令都指向在你的系统中不太可能有的 `/dev/sdX` 设备。
|
||||
|
||||
### 创建磁盘标签(或者分区表)
|
||||
|
||||
要在磁盘上创建一个分区,驱动器必须要有一个<ruby>磁盘标签<rt>disk label</rt></ruby>。磁盘标签也被叫做 <ruby>分区表<rt>partition table</rt></ruby>,所以 Parted 对两个术语都接受。
|
||||
|
||||
要创建一个磁盘卷标,使用 `mklabel` 或 `mktable` 子命令:
|
||||
|
||||
```
|
||||
$ parted /dev/sdX mklabel gpt
|
||||
```
|
||||
|
||||
这个命令在 `/dev/sdX` 的驱动器前面创建了一个 **gpt** 标签,删除了任何可能存在的标签。这是一个快速的过程,因为所有被替换的信息都是关于分区的元数据。
|
||||
|
||||
### 创建分区
|
||||
|
||||
要在磁盘创建分区,使用 `mkpart` 子命令,后跟可选的分区名称,再跟分区的开始和结束位置。如果你在磁盘上只需要一个分区,那么大小调整是容易的:开始位置输入 1 ,结束位置输入 100% 。使用 `--align opt` 参数允许 Parted 调整分区边界位置便于磁盘获得最佳性能:
|
||||
|
||||
```
|
||||
$ parted /dev/sdX --align opt \
|
||||
mkpart example 1 100%
|
||||
```
|
||||
|
||||
用 `print` 子命令查看你的新分区:
|
||||
|
||||
```
|
||||
$ parted /dev/sdX print
|
||||
Model: Yoyodyne Tiny Drive 1.0 (scsi)
|
||||
Disk /dev/sdi: 1940MB
|
||||
Sector size (logical/physical): 512B/512B
|
||||
Partition Table: gpt
|
||||
Disk Flags:
|
||||
|
||||
Number Start End Size
|
||||
1 1049kB 1939MB 1938MB
|
||||
```
|
||||
|
||||
你不必将整个磁盘用作一个分区。分区的优势是在一个磁盘上可以存在多个文件系统,它们之间不会相互干扰。在确定分区大小的时候,你可以使用 `unit` 子命令来设置你想用的测量方法。Parted 可以理解<ruby>扇区<rt>sector</rt></ruby>、<ruby>柱面<rt>cylinder</rt></ruby>、<ruby>磁头<rt>head</rt></ruby>、<ruby>字节<rt>byte</rt></ruby>、KB、MB、GB、TB 和百分比。(LCTT 译注:具体使用方法请参阅手册页)
|
||||
|
||||
你也可以指定你打算使用的分区的文件系统。这并不会创建文件系统,但是它为你以后方便使用提供了元数据。
|
||||
|
||||
将磁盘对半分,一个是 XFS 文件系统,另一个是 EXT4 文件系统:
|
||||
|
||||
```
|
||||
$ parted /dev/sdX --align opt \
|
||||
mkpart xfs 1 50%
|
||||
$ parted /dev/sdX --align opt \
|
||||
mkpart ext4 51% 100%
|
||||
```
|
||||
|
||||
### 命名分区
|
||||
|
||||
除了标记分区用于什么文件系统之外,你也可以为每个分区命名。一些文件管理器和工具可以读取分区名称,能够帮助你区分驱动器。例如,我经常有几个不同的驱动器连接到我的媒体工作站,每个属于一个不同的项目。当创建这些驱动器的时候,我同时命名了分区和文件系统,这样,无论我怎么看我的系统,有重要数据的位置都会被清楚地标示出来。
|
||||
|
||||
要命名一个分区,你必须知道它的序号:
|
||||
|
||||
```
|
||||
$ parted /dev/sdX print
|
||||
[...]
|
||||
Number Start End Size File system Name Flags
|
||||
1 1049kB 990MB 989MB xfs example
|
||||
2 1009MB 1939MB 930MB ext4 noname
|
||||
```
|
||||
|
||||
要命名分区 1:
|
||||
|
||||
```
|
||||
$ parted /dev/sdX name 1 example
|
||||
$ parted /dev/sdX print
|
||||
[...]
|
||||
Number Start End Size File system Name Flags
|
||||
1 1049kB 990MB 989MB xfs example
|
||||
2 1009MB 1939MB 930MB ext4 noname
|
||||
```
|
||||
|
||||
### 创建文件系统
|
||||
|
||||
要让你的驱动器能够正常使用,你必须在新分区上创建一个文件系统。GNU Parted 并不做这些,因为它只是一个分区管理器。在磁盘上创建文件系统的 Linux 命令是 `mkfs`,但也有一些有用的工具可以让你用来创建特定类型的文件系统。例如,`mkfs.ext4` 创建 EXT4 文件系统,`mkfs.xfs` 创建 XFS 文件系统等等。
|
||||
|
||||
你的分区位于磁盘驱动器的“内部” ,所以你不是在 `/dev/sdX` 上创建文件系统,而是在 `/dev/sdX1` 上为第一个分区创建文件系统,在 `/dev/sdX2` 上为第二个分区创建,以此类推。
|
||||
|
||||
这里是一个创建 XFS 文件系统的例子:
|
||||
|
||||
```
|
||||
$ sudo mkfs.xfs -L mydrive /dev/sdX1
|
||||
```
|
||||
|
||||
### 下载我们的速查表
|
||||
|
||||
Parted 是一个灵活而强大的工具。你可以发出命令,如本文所示的那样,或者激活一个交互模式以不断 “连接” 你指定的驱动器:
|
||||
|
||||
```
|
||||
$ parted /dev/sdX
|
||||
(parted) print
|
||||
[...]
|
||||
Number Start End Size File system Name Flags
|
||||
1 1049kB 990MB 989MB xfs example
|
||||
2 1009MB 1939MB 930MB ext4 noname
|
||||
|
||||
(parted) name 1 mydrive
|
||||
(parted)
|
||||
```
|
||||
|
||||
如果你打算经常使用 Parted ,[下载我们的 GNU Parted 速查表][3],让信息近在咫尺。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/4/linux-parted-cheat-sheet
|
||||
|
||||
作者:[Seth Kenlon][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[hwlife](https://github.com/hwlife)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/seth
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/coverimage_cheat_sheet.png?itok=lYkNKieP (Cheat Sheet cover image)
|
||||
[2]: https://opensource.com/article/18/11/partition-format-drive-linux#gui
|
||||
[3]: https://opensource.com/downloads/parted-cheat-sheet
|
@ -0,0 +1,279 @@
|
||||
[#]: subject: (How to Deploy Seafile Server with Docker to Host Your Own File Synchronization and Sharing Solution)
|
||||
[#]: via: (https://itsfoss.com/deploy-seafile-server-docker/)
|
||||
[#]: author: (Hunter Wittenborn https://itsfoss.com/author/hunter/)
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (hwlife)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14468-1.html)
|
||||
|
||||
怎样用 Docker 部署 Seafile 服务器来托管你自己的文件同步和共享解决方案
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202204/13/141808f7fo7444ozv75z5s.jpg)
|
||||
|
||||
首先,什么是 Seafile ?
|
||||
|
||||
[Seafile][1] 是一个自托管文件同步程序,采用客户端/服务器模式,即你有笔记本、手机等多个设备,能够连接到一个中心服务器。
|
||||
|
||||
不像类似 [Nextcloud 或 ownCloud][2] 这些更流行的替代品一样,Seafile 试图遵循 “只做一件事,但是要做好” 的理念。同样,Seafile 没有内置额外的类似联系人或者日历聚合的功能。
|
||||
|
||||
相反,Seafile 只专注于文件同步、共享及与之相关的事情,仅此而已。但正因为如此,它最终做的非常好。
|
||||
|
||||
### 使用 Docker 和 NGINX 部署 Seafile 服务器
|
||||
|
||||
> **高级教程**
|
||||
>
|
||||
> 我们的许多教程都是针对初学者的。这篇则不然,它是为那些经常鼓捣 DIY 项目和喜欢自托管的高级用户设计的。这个教程假定你可以熟练的使用命令行,而且你至少对我们将要使用的程序有一定的了解。
|
||||
|
||||
虽然整个过程完全可以不使用 NGINX ,但是使用 NGINX 更加容易配置,而且在将来更加容易的自托管更多的服务。
|
||||
|
||||
如果你想完全使用 Docker 环境,你也可以 [在 Docker 内部设置 NGINX][3] ,但是它这会使事情变得更加复杂,并且不能够带来太多好处。同样,在本教程里也不会涉及这些。
|
||||
|
||||
#### 安装设置 NGINX
|
||||
|
||||
在这个教程中,我会使用 Ubuntu,因此会使用 `apt` 来安装软件包。如果你使用 Fedora 或者一些其他非 Debian 发行版,请使用你的发行版的 [包管理器][4]。
|
||||
|
||||
[NGINX][5] 既是一个网页浏览器,又是一个代理服务器。它将起到 Seafile 服务器和互联网之间网络连接的作用,同时也使一些任务更容易处理。
|
||||
|
||||
要安装 NGINX ,使用以下命令:
|
||||
|
||||
```
|
||||
sudo apt install nginx
|
||||
```
|
||||
|
||||
如果你想使用 HTTPS(也就是浏览器中的小挂锁),你需要安装 [Certbot][6]:
|
||||
|
||||
```
|
||||
sudo apt install certbot python3-certbot-nginx
|
||||
```
|
||||
|
||||
下一步,你需要设置 NGINX 来连接我们之后将要设置的 Seafile 实例。
|
||||
|
||||
首先,运行以下命令:
|
||||
|
||||
```
|
||||
sudo nano /etc/nginx/sites-available/seafile.conf
|
||||
```
|
||||
|
||||
键入下方的文本到文件中:
|
||||
|
||||
```
|
||||
server {
|
||||
server_name localhost;
|
||||
location / {
|
||||
proxy_pass http://localhost:8080;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**重要**: 将 `server_name` 一行的 `localhost` 替换为你要访问你的服务器的地址(比如 `seafile.example.com` 或者 `192.168.0.0`)。不确定要输入什么吗?
|
||||
|
||||
* 如果你只是为了测试,使用 `localhost` 。这个设置将 **只允许你从你的电脑访问服务器** ,仅此而已。
|
||||
* 如果你想通过你的本地 Wi-Fi 连接使用 Seafile(与你在同一 Wi-Fi 网络上),你应该键入 [你的计算机 IP 地址][7]。你也可以考虑 [设置一个静态 IP 地址][8],尽管这不是必须的。
|
||||
* 如果你有一个公网 IP 地址,你知道它指向你的系统,就使用它。
|
||||
* 如果你有一个域名(比如 `example.com`、`example.org`)和公网 IP 地址,更改你的 DNS 设置,将域名指向你的系统的 IP 地址。这也需要将公网 IP 指向你的系统。
|
||||
|
||||
现在你需要复制配置文件到 NGINX 的查找目录中,然后重启 NGINX :
|
||||
|
||||
```
|
||||
sudo ln -s /etc/nginx/sites-available/seafile.conf /etc/nginx/sites-enabled/seafile.conf
|
||||
sudo systemctl restart nginx
|
||||
```
|
||||
|
||||
如果你要安装 Cerbot,你也需要运行以下命令来设置 HTTPS :
|
||||
|
||||
```
|
||||
sudo certbot
|
||||
```
|
||||
|
||||
如果要重定向 HTTP 流量 到 HTTPS ,选择 `2` 。
|
||||
|
||||
现在可以来确认我们目前设置的一切都是否正常工作。如果你访问你的站点,你应该看到一个屏幕上写着 `502 Bad Gateway` 字样。
|
||||
|
||||
![][9]
|
||||
|
||||
#### 安装 Docker 和 Docker Compose
|
||||
|
||||
现在要进入有趣的部分了!
|
||||
|
||||
首先,你需要安装 [Docker][10] 和 [Docker Compose][11] 。Docker Compose 需要利用 `docker-compose.yml` 文件,这将使管理多个 Docker [容器][12] 的 Seafile 需求变得更加容易。
|
||||
|
||||
Docker 和 Docker Compose 可以用以下的命令来安装:
|
||||
|
||||
```
|
||||
sudo apt install docker.io docker-compose
|
||||
```
|
||||
|
||||
检查 Docker 是否安装并运行,运行以下命令:
|
||||
|
||||
```
|
||||
sudo docker run --rm hello-world
|
||||
```
|
||||
|
||||
如果你完全安装成功,你应该在终端能看到这几行文字:
|
||||
|
||||
![][13]
|
||||
|
||||
如果你想避免在 `docker` 命令的开始添加 `sudo` 的话,你可以运行以下的命令将你自己添加到 `docker` 组:
|
||||
|
||||
```
|
||||
sudo groupadd docker
|
||||
sudo usermod -aG docker $USER
|
||||
```
|
||||
|
||||
这个教程的其余部分假定你已经运行了以上两个命令。如果你没有运行,在所有 `docker` 或 `docker-compose` 的命令都添加 `sudo` 。
|
||||
|
||||
#### 安装 Seafile 服务器
|
||||
|
||||
这部分比之前部分明显容易的多。你所需要做的是输入一些文本到文件,然后运行一些命令。
|
||||
|
||||
打开一个终端,然后创建一个 Seafile 服务器用来储存内容的目录,并进入目录中:
|
||||
|
||||
```
|
||||
mkdir ~/seafile-server && cd ~/seafile-server
|
||||
```
|
||||
|
||||
![][14]
|
||||
|
||||
转到你创建的目录然后运行以下命令:
|
||||
|
||||
```
|
||||
nano docker-compose.yml
|
||||
```
|
||||
|
||||
下一步,在弹出的窗口中键入以下文本内容:
|
||||
|
||||
```
|
||||
version: '2.0'
|
||||
services:
|
||||
db:
|
||||
image: mariadb
|
||||
container_name: seafile-mysql
|
||||
environment:
|
||||
- MYSQL_ROOT_PASSWORD=password
|
||||
- MYSQL_LOG_CONSOLE=true
|
||||
volumes:
|
||||
- ./data/mariadb:/var/lib/mysql
|
||||
networks:
|
||||
- seafile-net
|
||||
|
||||
memcached:
|
||||
image: memcached
|
||||
container_name: seafile-memcached
|
||||
entrypoint: memcached -m 256
|
||||
networks:
|
||||
- seafile-net
|
||||
|
||||
seafile:
|
||||
image: seafileltd/seafile-mc
|
||||
container_name: seafile
|
||||
ports:
|
||||
- "8080:80"
|
||||
volumes:
|
||||
- ./data/app:/shared
|
||||
environment:
|
||||
- DB_HOST=db
|
||||
- DB_ROOT_PASSWD=password
|
||||
- TIME_ZONE=Etc/UTC
|
||||
- SEAFILE_ADMIN_EMAIL=me@example.com
|
||||
- SEAFILE_ADMIN_PASSWORD=password
|
||||
- SEAFILE_SERVER_LETSENCRYPT=false
|
||||
- SEAFILE_SERVER_HOSTNAME=docs.seafile.com
|
||||
depends_on:
|
||||
- db
|
||||
- memcached
|
||||
networks:
|
||||
- seafile-net
|
||||
|
||||
networks:
|
||||
seafile-net:
|
||||
```
|
||||
|
||||
在保存文件之前,一些参数需要更改:
|
||||
|
||||
* `MYSQL_ROOT_PASSWORD`:更换强壮的密码,你不必记住它,所以不要尝试挑选简单的密码。如果你需要帮助生成一个,请使用 [密码生成器][15] 。我建议使用 20 位字符长度并且避免使用任何的特殊字符(`!@#$%^&*` 等符号)。
|
||||
* `DB_ROOT_PASSWD`:更改你为 `MYSQL_ROOT_PASSWORD` 设置的值 。
|
||||
* `SEAFILE_ADMIN_EMAIL`:设置管理员帐户的电子邮件地址。
|
||||
* `SEAFILE_ADMIN_PASSWORD`:设置管理员帐户密码。避免与`MYSQL_ROOT_PASSWORD` 或者 `DB_ROOT_PASSWD` 密码相同。
|
||||
* `SEAFILE_SERVER_HOSTNAME`:在 NGINX 配置中设置 Seafile 的服务器主机名。
|
||||
|
||||
完成之后,你可以运行 `docker-compose` 整个运行起来:
|
||||
|
||||
```
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
可能需要花一到两分钟,取决于你的网速,因为需要拉下几个 Seafile 需要运行的几个容器。
|
||||
|
||||
完成以后,还需要几分钟来完成。你也可以通过以下命令来检查运行状态:
|
||||
|
||||
```
|
||||
docker logs seafile
|
||||
```
|
||||
|
||||
当完成了,你将会看到如下输出:
|
||||
|
||||
![][17]
|
||||
|
||||
下一步,你只需要在你的浏览器里键入你设置的 `SEAFILE_SERVER_HOSTNAME` 的地址,然后你应该看到登录屏幕的页面。
|
||||
|
||||
![][18]
|
||||
|
||||
就这样!现在一切功能齐全,准备用客户端来使用。
|
||||
|
||||
#### 安装 Seafile 客户端
|
||||
|
||||
Seafile 移动客户端在 [Google Play][19]、[F-Droid][20] 和 [苹果商店][21] 都是可用的。Seafile 也有 Linux、Windows 和 Mac 桌面客户端可用,可在 [此处][22] 找到。
|
||||
|
||||
通过 `seafile-gui` 软件包,可以在 Ubuntu 系统轻松获得 Seafile :
|
||||
|
||||
```
|
||||
sudo apt install seafile-gui
|
||||
```
|
||||
|
||||
通过 `seafile-client` 软件包 Seafile 也包含在 Arch 用户的 AUR 包管理器中。
|
||||
|
||||
### 结语
|
||||
|
||||
请尽情探索客户端及其所能提供的一切。我将在未来的一篇文章中详细阐述 Seafile 客户端的所有功能。(敬请期待 😃)
|
||||
|
||||
总的来说,如果有什么错误,或者你有什么问题,请在下方评论 – 我会尽我所能回应。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/deploy-seafile-server-docker/
|
||||
|
||||
作者:[Hunter Wittenborn][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[hwlife](https://github.com/hwlife)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/hunter/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://www.seafile.com/en/home/
|
||||
[2]: https://itsfoss.com/nextcloud-vs-owncloud/
|
||||
[3]: https://linuxhandbook.com/nginx-reverse-proxy-docker/
|
||||
[4]: https://itsfoss.com/package-manager/
|
||||
[5]: https://www.nginx.com/
|
||||
[6]: https://certbot.eff.org/
|
||||
[7]: https://itsfoss.com/check-ip-address-ubuntu/
|
||||
[8]: https://itsfoss.com/static-ip-ubuntu/
|
||||
[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/nginx_bad_gateway.png?resize=489%2C167&ssl=1
|
||||
[10]: https://www.docker.com/
|
||||
[11]: https://docs.docker.com/compose/
|
||||
[12]: https://www.docker.com/resources/what-container
|
||||
[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/seafile-docker-helloworld.png?resize=752%2C416&ssl=1
|
||||
[14]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/seafile-dir.png?resize=731%2C174&ssl=1
|
||||
[15]: https://itsfoss.com/password-generators-linux/
|
||||
[16]: https://itsfoss.com/cdn-cgi/l/email-protection
|
||||
[17]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/seafile-running.png?resize=752%2C484&ssl=1
|
||||
[18]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/seafile-login.jpg?resize=800%2C341&ssl=1
|
||||
[19]: https://play.google.com/store/apps/details?id=com.seafile.seadroid2
|
||||
[20]: https://f-droid.org/repository/browse/?fdid=com.seafile.seadroid2
|
||||
[21]: https://itunes.apple.com/cn/app/seafile-pro/id639202512?l=en&mt=8
|
||||
[22]: https://www.seafile.com/en/download/
|
@ -0,0 +1,310 @@
|
||||
[#]: subject: (Getting Started With Markdown [Beginner’s Guide])
|
||||
[#]: via: (https://itsfoss.com/markdown-guide/)
|
||||
[#]: author: (Bill Dyer https://itsfoss.com/author/bill/)
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (hwlife)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14503-1.html)
|
||||
|
||||
Markdown 初学者指南
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202204/24/140247d969nm9kkhxeknje.jpg)
|
||||
|
||||
在我的工作中,我经常要写代码、写与代码相配套的文档、创建网页、进行文本恢复项目。我在学校的时候还写过几篇正式的论文,也包括写课堂笔记,几乎每节课都写。
|
||||
|
||||
我几乎在我所有的写作中都使用 Markdown,它对我来说是一个节省时间的好工具。
|
||||
|
||||
在这篇文章中,我将分享我使用 Markdown 的体会。你将会了解以下内容:
|
||||
|
||||
* 什么是 Markdown ?
|
||||
* 它是怎么工作的?
|
||||
* Markdown 的基本语法和怎样使用它们。
|
||||
|
||||
### 什么是 Markdown ?
|
||||
|
||||
假如你是 Markdown 新手,它是一个为网络写手转换文本到 HTML 格式的工具。Markdown 文档遵循一种特定的语法,容易阅读和写作。它们是纯文本,所以能够通过电脑上的任何文本编辑器来创建。然后这些文档能够转换成网页 —— 而网页是用一个叫做 HTML 的语言标记创建的。
|
||||
|
||||
Markdown 只是一种不必(即使知道怎么做)写 HTML 代码就能够创建网页的方式。实际上,如果你不转换成 HTML 的话,Markdown 甚至是个对纯文本格式化的好方法。有人曾这样对我描述 Markdown :
|
||||
|
||||
|
||||
> “ _它不是所见即所得,而是所见即所意_ ”。
|
||||
|
||||
然而,Markdown 不只是一个简单的格式化体系,它也是一个纯文本格式转化到 HTML 的一个软件工具。
|
||||
|
||||
这就是为什么语法很重要。如果你想在网页上起个标题,Markdown 将会基于你标题前面的字符来创建。Markdown 的一些语法示例如截图所示:
|
||||
|
||||
![Markdown to HTML conversion][1]
|
||||
|
||||
### 所以我怎样才能使纯文本文件转换成 HTML 格式呢?
|
||||
|
||||
John Gruber 的 Markdown 是一个运行在命令行上的 Perl 脚本。也就是说,它可以读取你创建的 Markdown 文本并用它来构建网页。
|
||||
|
||||
由于有 [许多著名的编辑器][2] 可以为你做这个转换,我在这里尽量避免使用命令行。不仅如此,许多这样的编辑器会让你写下你的文本,并同时向你展示网页的样子(称为渲染)。
|
||||
|
||||
Markdown 编辑器总的来说设置了两帧:左边部分是你要写你文本的地方,右边部分是用 HTML 语言显示给你格式化后文本的样子:
|
||||
|
||||
![Most Markdown editors have two panes to write and preview the text][3]
|
||||
|
||||
当你用它满意地完成你的写作,只需保存 Markdown 文件即可。就像这样,之后一旦你需要编辑和修改的时候,你就会用到它。文件保存后,你可以用编辑器将 Markdown 文档导出为 HTML 格式的文档。
|
||||
|
||||
编辑器用你的 Markdown 作为参考创建网页。你的 Markdown 文档在导出时不会修改,你仍然拥有源文档,同时创建一个独立的、新的 HTML 文档(网页),你可以把它放到一个网页服务器上。
|
||||
|
||||
**注意**:许多 Markdown 编辑器也可以将你的 Markdown 文档导出为其他格式,比如 `.doc`、`.docx` 和 `.pdf`。之后你可以了解这些高级设置和你可能需要的额外软件。
|
||||
|
||||
### Markdown 基础语法
|
||||
|
||||
为了让 Markdown 新用户快速了解,我将把这部分内容限制在我最常使用的语法上。我相信这些将是最有帮助的 - 你可以在现在就提高工作效率,同时了解更多关于 Markdown 以后能为你做什么。
|
||||
|
||||
#### 写标题
|
||||
|
||||
我经常使用 `#` 字符来表示标题。这里有六个等级:
|
||||
|
||||
```
|
||||
# 一级标题
|
||||
## 二级标题
|
||||
### 三级标题
|
||||
#### 四级标题
|
||||
##### 五级标题
|
||||
###### 六级标题
|
||||
```
|
||||
|
||||
还有一种标题类型,是在文本下使用下划线。我很少使用这种类型的标题,我只限于使用两种:一种是使用 `=` 字符表示的双下划线,生成 `H1` 标题。一种是使用 `-` 字符表示的单下划线,生成 `H2` 标题:
|
||||
|
||||
```
|
||||
一级标题
|
||||
===============
|
||||
|
||||
二级标题
|
||||
---------------
|
||||
```
|
||||
|
||||
![][4]
|
||||
|
||||
#### 段落
|
||||
|
||||
段落被空行隔开(确保段落之间有一个空行)。首行不要缩进。在 Markdown 里用 `Tab` 键或者空格键缩进有着不同的目的和作用。
|
||||
|
||||
段落是一个文本块,不应该用空格键和 `Tab` 键来缩进。它可以有一行或者多行。要结束这一段另起一段,点两下回车键;段落通过一个空行分开。
|
||||
|
||||
![][5]
|
||||
|
||||
#### 换行
|
||||
|
||||
请记住,对于段落,必须用空行来分隔它们,这要通过按两次回车键来实现。Markdown 对此很严格。
|
||||
|
||||
Markdown 不支持 “<ruby>强制插入换行符<rt>hard-wrapped</rt></ruby>” 或者 “<ruby>固定行长度<rt>fixed-line-length</rt></ruby>” 段落。那就是说,单击回车键一次将不会强制文本换到新的一行。它可能在编辑窗口显示,但是 HTML 格式下不显示。
|
||||
|
||||
然而,有时你可能需要拆分段落或者换行。Markdown 确实有一种方法可以做到,但是它一开始看起来可能有一点奇怪:**换行是通过用两到多个空格键然后点一次回车键完成的。**
|
||||
|
||||
![][6]
|
||||
|
||||
这里有一个短诗的范例。每行以两个空格结束。最后一行,由于是这个小节的结束,没有额外的空格。因为它是这个诗句(段落)的结束,我双击回车键两次:
|
||||
|
||||
```
|
||||
Baa, baa black sheep,
|
||||
Have you any wool?.
|
||||
Yes, sir. Yes, sir.
|
||||
Three bags full.
|
||||
```
|
||||
|
||||
在一行的最后加两个空格来创建一个换行,可能需要时间去习惯。
|
||||
|
||||
![][7]
|
||||
|
||||
#### 水平线
|
||||
|
||||
水平线非常适合将文本拆分为多个部分。
|
||||
|
||||
用三个或更多的破折号 `-` ,下划线 `_` ,或者星号 `*` 来做水平线,像这样:
|
||||
|
||||
```
|
||||
---
|
||||
|
||||
***
|
||||
|
||||
___
|
||||
```
|
||||
|
||||
你甚至可以在字符之间输入空格:
|
||||
|
||||
```
|
||||
- - -
|
||||
```
|
||||
|
||||
在文章和报告中我不经常使用水平线,但是在日记、系统日志和课堂笔记中对我很有用。
|
||||
|
||||
![][8]
|
||||
|
||||
#### 用加粗和斜体来强调文本
|
||||
|
||||
当你想让一个单词或者短语脱颖而出,引起注意,你可以让它加粗或者斜体显示。斜体和加粗文本可以在两种方式中任选其一。第一种是用星号 `*` 将其包括,第二种是用下划线 `_` 的方式。
|
||||
|
||||
使一个单词或者短语斜体显示,用一个下划线或者星号来括住文本。使一个单词或者短语加粗,使用两个下划线或者星号来括住文本:
|
||||
|
||||
```
|
||||
用星号来显示 *斜体* 。
|
||||
|
||||
用下划线来显示 _斜体_ 。
|
||||
|
||||
用星号来显示 **加粗** 。
|
||||
|
||||
用下划线来显示 __加粗__ 。
|
||||
```
|
||||
|
||||
记住两边使用相同的字符。单词或短语的一面是星号,另一面是下划线,将不会生效。相同字符必须在单词或者短语的两边。
|
||||
|
||||
![][9]
|
||||
|
||||
#### 块引用
|
||||
|
||||
块引用被用来直接引用。如果你正在写博客,你想重复本杰明•富兰克林说过的话,你可以使用块引用。
|
||||
|
||||
一个右尖括号被用来指定块引用:
|
||||
|
||||
```
|
||||
> 这是块引用。
|
||||
|
||||
>> 如果你想进一步再次块引用,使用两个右尖括号。
|
||||
```
|
||||
|
||||
![][10]
|
||||
|
||||
#### 在 Markdown 中添加超链接
|
||||
|
||||
超链接非常酷。在基础版的 Markdown 语言有三种方式创建超链接,在这里我只讲两种:普通连接和自动连接。
|
||||
|
||||
第三种链接被称为参考链接,在 Markdown 语言的基础版和高级版都支持。我想让你快速入门。你可以在准备好的时候找找参考链接的资料。
|
||||
|
||||
普通链接可以让你链接到各种各样的网站。网站名称或者你要使用的短语被放置在中括号 `[]` 中。真实的链接地址在小括号 `()` 中。
|
||||
|
||||
```
|
||||
现在去看看 [Linux 中国](https://linux.cn) 。
|
||||
```
|
||||
|
||||
自动连接通过用尖括号 `<>` 括住链接地址。这个链接是一个实际的地址(可以是网址或者电子邮件地址)。拼写出来的链接被转换到 HTML 的时候,就变成了有效的链接。
|
||||
|
||||
```
|
||||
<http://automatic-link-to-url.com/>
|
||||
|
||||
<name@emailaddress.com>
|
||||
```
|
||||
|
||||
当你想在文本中拼写出网址时,这很有用:
|
||||
|
||||
![][11]
|
||||
|
||||
#### 在 Markdown 中添加图片
|
||||
|
||||
链接图片几乎与链接网站一样。网站链接和图片链接微小的不同是,图片链接以感叹号 `!` 开始。
|
||||
|
||||
图片名称或者图片描述放置在中括号 `[]` 里。实际链接放置在小括号 `()` 里。
|
||||
|
||||
你可以像这样嵌入图片:
|
||||
|
||||
```
|
||||
![alternate text](./images/image.jpg)
|
||||
```
|
||||
|
||||
这儿有一个示例图像链接。这是一个示例链接,没有这个图片,但是这是个好例子,显示了实际链接应该有的样子:
|
||||
|
||||
```
|
||||
![a picture of bill](./images/my_photo_of_me.jpg)
|
||||
```
|
||||
|
||||
![][12]
|
||||
|
||||
#### 列表
|
||||
|
||||
制作列表有很多原因。它们可能用来作为代办事项、大纲中的主题元素、组装项目中的明细栏等等。列表有两种主要类型:无序列表和有序列表。
|
||||
|
||||
无序列表没有编号;这些就是我们在许多文档中所看到的列表项。有序列表是有编号的。
|
||||
|
||||
要创建一个有序(有编号的)列表,只需在每行用一个数字开始,像这样:
|
||||
|
||||
```
|
||||
1. 项目 一。
|
||||
2. 项目 二。
|
||||
3. 项目 三。
|
||||
```
|
||||
|
||||
无序列表没有编号,但要在列表每个项目的开始使用一个星号 `*` 、一个加号 `+` ,或者一个减号 `-` 。我偏向于使用一个星号或者减号,你可以选择适合你的:
|
||||
|
||||
```
|
||||
* 项目 一。
|
||||
+ 项目 二。
|
||||
- 项目 三。
|
||||
```
|
||||
|
||||
子项目可以通过缩进被添加到有序和无序列表中,像这样:
|
||||
|
||||
```
|
||||
1. 项目 一
|
||||
1. 子项目 一
|
||||
2. 子项目 二
|
||||
2. 项目 二
|
||||
3. 项目 三
|
||||
```
|
||||
|
||||
![][13]
|
||||
|
||||
### Markdown 语法速查表
|
||||
|
||||
这是一个简短的 Markdown 语法列表为你作为参考,这个列表已经在本小结中介绍。
|
||||
|
||||
如果你决定使用 Markdown 作为写作工具,你会发现 Markdown 会让写作变得更加简单。
|
||||
|
||||
![][14]
|
||||
|
||||
> **[下载 PDF 格式的 Markdown 速查表][15]**
|
||||
|
||||
### 结语
|
||||
|
||||
Markdown 可以做比我描述的更多的事情。我写作的很大一部分是用我在这里介绍的 Markdown 语法完成的 - 而这些是我最常使用的项目,即使是在更复杂的项目中。
|
||||
|
||||
如果这些看起来太简单了,那么说明它真的很容易。Markdown 用来完成简单的写作任务,但是你不必完全听我的。你可以尝试一下!不必安装 Markdown 编辑器;你可以在线尝试。这里有几个 [优秀的在线 Markdown 编辑器][16]。这里我喜欢用这三个:
|
||||
|
||||
- John Gruber’s [Dingus][17]
|
||||
- [Editor.md][18]
|
||||
- [Dillinger][19]
|
||||
|
||||
Editor.md 和 Dillinger 会让你看到你的 Markdown 文本作为 HTML 实时渲染的效果。 Dingus 不能实时预览,但是在参考页有 Markdown 的语法速查表。
|
||||
|
||||
![][20]
|
||||
|
||||
用以上这些在线编辑器尝试一下文章中的示例。也可以尝试一下你自己的想法。这将使你在可能致力于学习更多的知识之前习惯于 Markdown。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/markdown-guide/
|
||||
|
||||
作者:[Bill Dyer][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[hwlife](https://github.com/hwlife)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/bill/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/retext_window_showing_syntax_and_preview-2.png?resize=800%2C429&ssl=1
|
||||
[2]: https://itsfoss.com/best-markdown-editors-linux/
|
||||
[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/04/ghostwriter_two_frames-1.png?resize=800%2C458&ssl=1
|
||||
[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/1_md_headings_vscodium.png?resize=800%2C485&ssl=1
|
||||
[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/2_md_paragraphs_example_vscodium.png?resize=800%2C593&ssl=1
|
||||
[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/3_md_line_break_fail_vscodium.png?resize=800%2C593&ssl=1
|
||||
[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/4_md_line_break_success_vscodium.png?resize=800%2C450&ssl=1
|
||||
[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/04/5_md_horizontal_rules_vscodium.png?resize=800%2C326&ssl=1
|
||||
[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/6_md_emphasis_vscodium.png?resize=800%2C393&ssl=1
|
||||
[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/7_md_blockquotes_vscodium.png?resize=800%2C393&ssl=1
|
||||
[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/8_md_links_vscodium.png?resize=800%2C678&ssl=1
|
||||
[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/9_md_images_vscodium.png?resize=800%2C725&ssl=1
|
||||
[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/10_md_lists_vscodium.png?resize=800%2C725&ssl=1
|
||||
[14]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/04/markdown-syntax-cheatsheet.png?resize=727%2C743&ssl=1
|
||||
[15]: https://drive.google.com/file/d/1y-Qz9PX_2HksEG5D_WwN-asNB-tpjZHV/view?usp=sharing
|
||||
[16]: https://itsfoss.com/online-markdown-editors/
|
||||
[17]: https://daringfireball.net/projects/markdown/dingus
|
||||
[18]: http://editor.md.ipandao.com/en.html
|
||||
[19]: https://dillinger.io/
|
||||
[20]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/editor-md_page_in_browser-1.png?resize=800%2C505&ssl=1
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user